Записать в 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

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

  1. Кодом написан на языке Assembler.
  2. Задача программы: записать в переменную N число, полученное выписыванием в обратном порядке десятичных цифр.
  3. В начале кода подключаются необходимые библиотеки и определяется модель работы процессора.
  4. Организация памяти: — Переменная N хранится в сегменте данных, имеет тип dw (слово), и содержит число 125. — Переменная D является строкой, хранящейся в сегменте данных, и содержит пять пустых ячеек.
  5. Процедура reverse_print: — Переменная bx устанавливается в 0Ah (10). — Переменная di указывает на первый пустой элемент в строке D. — Пока есть цифры в числе: — Переменная dx очищается. — Число делится на 10. — Переменная dl получает ascii-код последней цифры числа. — ascii-код записывается в следующий элемент строки D. — Переменная di увеличивается на 1. — Переменная ax сохраняет делимое число. — Переменная ah устанавливается в 02 (2), и выводится последняя цифра числа. — Переменная ax восстанавливается из стека. — Если ax не равен нулю, то выводится следующая цифра.
  6. Процедура new_line: — Переменная al устанавливается в 0Ah (10). — Выполняется перевод каретки на новую строку. — Переменная al устанавливается в 0Dh (13), и выводится символ новой строки.
  7. В основной программе: — Переменная N загружается в переменную ax. — Вызывается процедура reverse_print. — Переменная ax устанавливается в 4C00h (0x4C00), и выполняется выход из программы.

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

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