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