TASM . Запись в стек остатка деления числа - Assembler

Узнай цену своей работы

Формулировка задачи:

Есть число. Допустим 144. Я его хочу вывести Для начала чем я руководствовался: "Если аргументом команды div является 1-байтовый регистр (например div bl), то значение регистра ax поделится на значение регистра bl, результат от деления запишется в регистр al, а остаток запишется в регистр ah." Тоесть мне нужен цикл который будет делить 144 постоянно на 10. и если целая часть т.е. al не равна 0 => остаток от числа записываем в стек и затем выводим. если = 0. Значит переходим на метку для выхода из программы (cmp al,0 и jz <метка для выхода>) Это я расписал деление ;144 - описание деление на 10 ;144 / 10. Цело 14. Остаток 4 ;14 / 10. Целое 1. остаток 4. ;1 /10 = Целое 0. Остаток 1 ;как только целое = 0 => выход ;если не равно 0 => продолжаем Возникла проблема с записью стек, и выводом из него. Пока хочу разобраться с этим, а потом вводить проверку на 0 и вывод числа НЕ ЗАДОМ НА ПЕРЕД. Вот исходник. Прошу подсказать что не так, буду очень признателен) *Для начала использовал цикл до 3 т.к. число 3х значное - в дальнейшем буду проверять целую часть на 0 (как я описал выше)
.model small 
.stack 512
 
.data
a db 12
 
.code
 
start:
mov ax, @data
mov ds, ax
 
mov bl,10 ;переслали 10 на бх
 
;если юзаем dw  - работаем с al
;если юзаем db - работаем с ax
mov al, a
mul a
 
;div bl ;потом применить 
 
;РЕзультат деления  = al
;остаток для деления = ah
 
mov cx, 3 ;цикл до 3
ss1:
div bl ;делим на 10 (bl = 10)
;тело цикла
 
push ah ;запись в стек остатка (на этой строке почему то tasm ругается)
 
pop ah ;извлечение
add ah,'0'
int 29h ;вывод
;тело цикла
 
dec cx
cmp cx,0
jne ss1

vih:
mov ah,4ch
int 21h
end start

Решение задачи: «TASM . Запись в стек остатка деления числа»

textual
Листинг программы
        mov     ax,     [Summa]
        xor     cx,     cx      ;счетчик цифр
        mov     bx,     10
        __DivBy10:
                inc     cx
                xor     dx,     dx
                div     bx
                push    dx
                or      ax,     ax
        jnz     __DivBy10
        mov     ah,     02h
        __ForEachDigit:
                pop     dx
                add     dl,     '0'
                int     21h
        loop    __ForEachDigit

Объяснение кода листинга программы

В данном коде выполняется деление числа на 10 и запись остатка в стек. Список операций:

  1. Переменная Summa содержит число, которое необходимо поделить на 10.
  2. Переменная cx используется в качестве счётчика цифр числа.
  3. Переменная bx содержит значение 10.
  4. В начале цикла DivBy10 значение счётчика cx увеличивается на единицу, а значение dx обнуляется. Затем выполняется деление числа в регистре ax на значение в регистре bx. Результат деления (остаток) сохраняется в стеке, а в регистр ax записывается старшая цифра результата деления.
  5. Если счётчик cx больше нуля, то цикл DivBy10 повторяется.
  6. После завершения цикла DivBy10 выполняется цикл ForEachDigit. В нём с каждой цифрой остатка числа (в регистре dx) выполняется операция сложения ('0' + digit), где digit — текущая цифра. Затем в стек записывается результат этой операции.
  7. Цикл ForEachDigit повторяется до тех пор, пока в стеке не закончится запись остатка.

Оцени полезность:

8   голосов , оценка 4.5 из 5
Похожие ответы