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 и запись остатка в стек. Список операций:
- Переменная
Summa
содержит число, которое необходимо поделить на 10. - Переменная
cx
используется в качестве счётчика цифр числа. - Переменная
bx
содержит значение 10. - В начале цикла
DivBy10
значение счётчикаcx
увеличивается на единицу, а значениеdx
обнуляется. Затем выполняется деление числа в регистреax
на значение в регистреbx
. Результат деления (остаток) сохраняется в стеке, а в регистрax
записывается старшая цифра результата деления. - Если счётчик
cx
больше нуля, то циклDivBy10
повторяется. - После завершения цикла
DivBy10
выполняется циклForEachDigit
. В нём с каждой цифрой остатка числа (в регистреdx
) выполняется операция сложения ('0' + digit), гдеdigit
— текущая цифра. Затем в стек записывается результат этой операции. - Цикл
ForEachDigit
повторяется до тех пор, пока в стеке не закончится запись остатка.