Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Задача: составить массив из цифр числа K.


Автор: RomanK 1.5.2007, 19:12
Помогите решить subj!

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

Огромное спасибо!

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

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

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

Код

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

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

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

Автор: anwe 1.5.2007, 21:39
А тут асм, в общем-то, не причем. Просто подумай как вообще это сделать.
Дели свое число на 10^5. Потом остаток на 10^4, потом на 10^3 и так далее. После каждого деления и получишь цифры.

Автор: MAKCim 2.5.2007, 09:25
Код

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

Автор: RomanK 2.5.2007, 18:40
Короче вот что я сделал:
Код

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! Что такое? Что не так?

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

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

результат деления просто не умещается в 16 бит, так как делится число dx:ax(32 бита) на bx. обнули dx перед делением.

Автор: MAKCim 2.5.2007, 19:49
RomanK, 
а у тебя не задом-наперед в массив пишется?  smile 
+ lea надо за цикл вынести

Автор: RomanK 2.5.2007, 20:49
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.

Как сделать, чтобы не задом наперед было? Я понимаю, что надо как-то десятку в степень возводить... но тут ведь еще цикл потребуется? Ведь так? Или можно как нибудь подругому сделать?

Автор: MAKCim 2.5.2007, 21:19
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;

Автор: RomanK 2.5.2007, 21:29
MAKCim, мда... как все сложно! Мы некоторых команд даже еще не проходили на занятиях!!! Поэтому я не понимаю как там и что устроено! Например stosw, pop, call!
Ну я по мануалу разберусь, поищу!
Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)