Записать в N число, полученное выписыванием в обратном порядке десятичных цифр - Assembler (224487)
Формулировка задачи:
Выручайте, не могу разобраться почему программа работает не правильно, завтра уже надо ее сдать..
Дано описание:
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: mov ax, word ptr [N] ;загрузить байт для умножения call reverse_print mov ax, 4C00h int 21h ;выход ;data N dw 125 ;число для подсчета D db 5 dup(?) reverse_print proc near mov bx, 0Ah ;система счисления lea di,D next_dig: xor dx, dx ;очистить предыдущий остаток div bx ;разделить число на основание ;системы счисления or dl, 30h ;перевод цифры в её ascii-код mov [di],dl inc di 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
Объяснение кода листинга программы
- Кодом написан на языке Assembler.
- Задача программы: записать в переменную N число, полученное выписыванием в обратном порядке десятичных цифр.
- В начале кода подключаются необходимые библиотеки и определяется модель работы процессора.
- Организация памяти: — Переменная N хранится в сегменте данных, имеет тип dw (слово), и содержит число 125. — Переменная D является строкой, хранящейся в сегменте данных, и содержит пять пустых ячеек.
- Процедура reverse_print: — Переменная bx устанавливается в 0Ah (10). — Переменная di указывает на первый пустой элемент в строке D. — Пока есть цифры в числе: — Переменная dx очищается. — Число делится на 10. — Переменная dl получает ascii-код последней цифры числа. — ascii-код записывается в следующий элемент строки D. — Переменная di увеличивается на 1. — Переменная ax сохраняет делимое число. — Переменная ah устанавливается в 02 (2), и выводится последняя цифра числа. — Переменная ax восстанавливается из стека. — Если ax не равен нулю, то выводится следующая цифра.
- Процедура new_line: — Переменная al устанавливается в 0Ah (10). — Выполняется перевод каретки на новую строку. — Переменная al устанавливается в 0Dh (13), и выводится символ новой строки.
- В основной программе: — Переменная N загружается в переменную ax. — Вызывается процедура reverse_print. — Переменная ax устанавливается в 4C00h (0x4C00), и выполняется выход из программы.