Вывод содержимого регистра на экран - Assembler

Узнай цену своей работы

Формулировка задачи:

Вопрос глупый, но нигде не могу найти однозначный ответ. Как мне вывести чисто в ax на экран?
org 100h
jmp start
 
m dw 213
n dw 442
r dw -33
k dw ?
 
start:
mov ax,[m] ; ax = m
inc ax ; ax = m + 1
mov bx,[n] ; bx = n
dec bx ; bx = n — 1
mov cx,[r] ; cx = r
sub bx,cx ; bx = bx — cx = n-1 — r
sub ax,bx ; ax = ax — bx = m+1 — n-1-r
mov [k],ax ; k = ax = m+1 — n-1-r

mov ax,4c00h
int 21h

Решение задачи: «Вывод содержимого регистра на экран»

textual
Листинг программы
;fasm-code
;--------------
org   100h
jmp   start
 
m     dw  213
 
start: mov   ax,[m]     ; АХ = число
       mov   bx,2       ; ВХ = система счисления для вывода
       call  hex2asc    ; зовём функцию!
 
       mov   al,10      ; перевод строки...
       int   29h        ;
 
       mov   ax,[m]
       mov   bx,10      ; система
       call  hex2asc
 
       mov   al,10
       int   29h
 
       mov   ax,[m]
       mov   bx,16      ; система
       call  hex2asc
 
       mov   ah,8       ; ждём клавишу..
       int   21h
       ret              ; выход в DOS для *.СОМ-файлов!
;------------------------------
hex2asc:                ; Функция вывода числа из АХ
       pusha
       xor   cx,cx
isDiv: xor   dx,dx
       div   bx
       push  dx
       inc   cx
       or    ax,ax
       jnz   isDiv
isOut: pop   ax
       cmp   al,9
       jle   noHex
       add   al,7
noHex: add   al,30h
       int   29h
       loop  isOut
       popa
ret

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

  1. Организация кода: В начале кода присутствует блок org 100h, который задает точку входа в программу. Далее идет метка jmp start, которая указывает на точку начала выполнения кода.
  2. Вывод числа в шестнадцатеричной системе счисления: Программа начинается с метки start. Первый шаг - mov ax,[m], где АХ принимает значение из переменной m. Затем следует mov bx,2, где ВХ получает значение 2, что означает шестнадцатеричную систему счисления. Далее вызывается функция hex2asc, которая выводит число в шестнадцатеричной системе счисления.
  3. Перевод строки и повторный вывод числа в десятичной и шестнадцатеричной системах счисления: После этого mov al,10 и int 29h, что означает перевод строки. Затем снова вызывается функция hex2asc, но уже с системой счисления 10, что означает десятичную систему счисления. После этого снова mov al,10 и int 29h для перевода строки. Затем снова вызывается функция hex2asc, но уже с системой счисления 16.
  4. Ожидание нажатия клавиши и выход в DOS: В конце программы идет mov ah,8 и int 21h, что означает ожидание нажатия клавиши. Затем идет ret, что означает выход в DOS.
  5. Функция hex2asc: Функция hex2asc отвечает за вывод числа в шестнадцатеричной системе счисления. Она начинается с pusha, чтобы сохранить текущее состояние регистров. Затем идет xor cx,cx, где СХ устанавливается в 0. Далее идет цикл, который продолжается до тех пор, пока ДХ не станет равным 0. В каждой итерации цикла происходит деление ДХ на СХ, что приводит к уменьшению ДХ на единицу. После этого результат деления сохраняется в АХ. Затем идет инкремент СХ и проверка, не равен ли АХ 0. Если это так, то происходит переход на следующую итерацию цикла. Если же АХ не равен 0, то происходит перевод строки с помощью int 29h. Затем идет добавление 30h к АЛ, что означает перевод числа в шестнадцатеричной системы счисления в число в десятичной системе счисления.
  6. Ошибки в коде: В коде нет ошибок.

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

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