Записать в N число, полученное выписыванием в обратном порядке десятичных цифр - Assembler (224485)
Формулировка задачи:
Выручайте, не могу разобраться почему программа работает не правильно, завтра уже надо ее сдать..
Дано описание:
N DW ? ; 100≤N≤999
Записать в N число, полученное выписыванием в обратном порядке десятичных цифр исходного числа из N (например, 125 → 521).
вот сам код:
.286 .model tiny .code org 100h start: mov ax, word ptr [N] ;загрузить байт для умножения call reverse_print mov ax, 4C00h int 21h ;выход ;data N dw 125 ;число для подсчета reverse_print proc near mov bx, 0Ah ;система счисления next_dig: xor dx, dx ;очистить предыдущий остаток div bx ;разделить число на основание ;системы счисления or dl, 30h ;перевод цифры в её ascii-код push ax ;сохранить делимое число mov ah, 02h int 21h ;печать последней цифры (текущего числа) pop ax test ax, ax ;это последняя цифра в числе? jne next_dig ;если нет - выводим дальше ret reverse_print endp ;Перенос на новую строку new_line proc near pusha mov al, 0Ah int 29h mov al, 0Dh int 29h popa ret new_line endp end start
Решение задачи: «Записать в N число, полученное выписыванием в обратном порядке десятичных цифр»
textual
Листинг программы
.286 .model tiny .code org 100h start: N dw 125 ;(число для подсчета) mov ax, word ptr [N] ;помещаем в аккумулятор константу N типа word call reverse_print ; вызываем подпрограмму reverse_print mov ax, 4C00h ; пересылаем номер функции в регистр AX(функция 4C00h-выход из программы) int 21h ;выходим reverse_print proc near ;начало процедуры mov bx, 0Ah ; выбираем для регистра bx систему счисления nextdig: xor dx, dx ;(очистить предыдущий остаток)обнуляет регистр ax, и делает это быстрее, чем mov ax, 0 div bx ;разделить число на основание системы счисления or dx, 30h ;перевод цифры в её ascii-код push ax ;сохранить делимое число mov ah, 02h int 21h ;печать последней цифры (текущего числа) pop ax ;восстановления содержимого вершины стека в регистр test ax, ax ;это последняя цифра в числе? jne nextdig ;если нет - выводим дальше ret ;выход из подпрограммы reverse_print endp ; конец процедуры end start
Объяснение кода листинга программы
1. Объявлена переменная N типа word, равная 125.
- В функции start() происходит вызов подпрограммы reverse_print().
- В подпрограмме reverse_print() происходит установка регистра bx в значение 10 (десятичная система счисления).
- Далее, в цикле nextdig(), происходит деление числа на 10 (основание системы счисления) и перевод полученной цифры в её ascii-код.
- Цифра сохраняется в стеке, выводится на экран, а затем извлекается из стека.
- Если ax не равен нулю (т.е. это не последняя цифра), то цикл повторяется.
- Если ax равен нулю (т.е. это последняя цифра), то происходит выход из подпрограммы.
- В конце программы вызывается функция int 21h, с аргументом 4C00h, что соответствует выходу из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д