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

  1. В функции start() происходит вызов подпрограммы reverse_print().
  2. В подпрограмме reverse_print() происходит установка регистра bx в значение 10 (десятичная система счисления).
  3. Далее, в цикле nextdig(), происходит деление числа на 10 (основание системы счисления) и перевод полученной цифры в её ascii-код.
  4. Цифра сохраняется в стеке, выводится на экран, а затем извлекается из стека.
  5. Если ax не равен нулю (т.е. это не последняя цифра), то цикл повторяется.
  6. Если ax равен нулю (т.е. это последняя цифра), то происходит выход из подпрограммы.
  7. В конце программы вызывается функция int 21h, с аргументом 4C00h, что соответствует выходу из программы.

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

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