Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача: составить массив из цифр числа K. 
V
    Опции темы
RomanK
Дата 1.5.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 25.6.2005
Где: Россия, Выборг

Репутация: нет
Всего: 2



Помогите решить subj!

Сам массив я впринципе смогу составить. Я незнаю как из, например 5-ти значного числа, по очереди отделять каждую цифру. Что для этого надо сделать?

Огромное спасибо!
PM MAIL WWW ICQ   Вверх
Akina
Дата 1.5.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Цитата(RomanK @  1.5.2007,  20:12 Найти цитируемый пост)
 как из, например 5-ти значного числа, 

Зависит от того, как задано это "5-значное число"...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
RomanK
Дата 1.5.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 25.6.2005
Где: Россия, Выборг

Репутация: нет
Всего: 2



Вообще ASM встроен в TarboPascal.
А задается... ну например вот так:

Код

var K : integer;
      M : array[1..5] of integer;

Begin
     K := 12345;
     ASM
          {Тут программа на ассемблере}
     end;

     {вывод массива}
End.

PM MAIL WWW ICQ   Вверх
anwe
Дата 1.5.2007, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 8
Всего: 23



А тут асм, в общем-то, не причем. Просто подумай как вообще это сделать.
Дели свое число на 10^5. Потом остаток на 10^4, потом на 10^3 и так далее. После каждого деления и получишь цифры.
PM MAIL   Вверх
MAKCim
Дата 2.5.2007, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



Код

calculate:
    mov ebx, 10
    cld
   push 0xFFFFFFFF
@@:
; needed number in eax, pointer to array in es:edi
    test eax, eax
    jz @F
    xor edx, edx
    div ebx
    push edx
    jmp @B
@@:
    pop eax
    inc eax
    jz @F
    add eax, 47
    stosd
    jmp @B
@@:
    ret


Это сообщение отредактировал(а) MAKCim - 2.5.2007, 09:40


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
RomanK
Дата 2.5.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 25.6.2005
Где: Россия, Выборг

Репутация: нет
Всего: 2



Короче вот что я сделал:
Код

Program ThirdProgram;
Const N = 5;
Var M : array[1..N] of integer;
    k, i : integer;

Begin
    k := 12345;

    ASM
     mov AX, k
     mov BX, 10d
     mov CX, N

    @1:    lea SI, M
     div BX
     mov [SI], DX
     inc SI
     inc SI
     loop @1
    End;

    for i := 1 to N do
        writeln( M[i] );
    readln;
End.


Только одно НО! Почему то паскаль ругается на div BX! Типа Devision by zero! Когда пошагово выполняю программу перед делением в AX: 12345, в BX: 10. Как выполняется деление, так выскакивает ошибка: Devision by zero! Что такое? Что не так?
PM MAIL WWW ICQ   Вверх
ksnk
Дата 2.5.2007, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: нет
Всего: 386



Ругается он не на div Bx, а на строку ниже... imho, массив в паскале выглядит сложнее, чем ты о нем думаешь smile
Строчку       lea SI, M из тела цикла, видимо, следует вывести...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
dumb
Дата 2.5.2007, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(RomanK @  2.5.2007,  18:40 Найти цитируемый пост)
выскакивает ошибка: Devision by zero!

результат деления просто не умещается в 16 бит, так как делится число dx:ax(32 бита) на bx. обнули dx перед делением.
PM MAIL   Вверх
MAKCim
Дата 2.5.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



RomanK
а у тебя не задом-наперед в массив пишется?  smile 
+ lea надо за цикл вынести

Это сообщение отредактировал(а) MAKCim - 2.5.2007, 19:50


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
RomanK
Дата 2.5.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 25.6.2005
Где: Россия, Выборг

Репутация: нет
Всего: 2



MAKCim, угу. Задом наперед!

Вот рабочий вариант:
Код

Program ThirdProgram;
Const N = 5;
Var M : array[1..N] of integer;
    k, i : integer;

Begin
    k := 12345;

    ASM
        mov AX, k
        mov BX, 10d
        mov CX, N

        lea SI, M

    @1:    mov DX, 0
        div BX
        mov [SI], DX
        inc SI
        inc SI
        loop @1
    End;

    for i := 1 to N do
        writeln( M[i] );
    readln;
End.

Как сделать, чтобы не задом наперед было? Я понимаю, что надо как-то десятку в степень возводить... но тут ведь еще цикл потребуется? Ведь так? Или можно как нибудь подругому сделать?
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 2.5.2007, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



RomanK
я же писал
Код

ASM
        mov ax, k
        mov bx, 10
        lea si, M
@1:    
        test ax, ax
        jz @2
        xor dx, dx
        div bx
        push dx
        call @1
        pop ax
        stosw
@2:
        ret
End;


Это сообщение отредактировал(а) MAKCim - 2.5.2007, 21:41


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
RomanK
Дата 2.5.2007, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 25.6.2005
Где: Россия, Выборг

Репутация: нет
Всего: 2



MAKCim, мда... как все сложно! Мы некоторых команд даже еще не проходили на занятиях!!! Поэтому я не понимаю как там и что устроено! Например stosw, pop, call!
Ну я по мануалу разберусь, поищу!
Спасибо!
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0902 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.