Напечатать в виде 4-значного беззнакового 16-ричного числа значение заданного слова - Assembler
Формулировка задачи:
Ребят выручите пожалуйста!!! Написать эту же программу с макрокомандами!!! Эта программа работает.
Дано
описание: X DD? Описать близкую процедуру OUTW16, которая печатает в
виде 4-значного беззнакового 16-ричного числа значение заданного слова.
Используя эту процедуру, выписать фрагмент основной программы, печатающий
значение переменной X в 16-ричном виде. Выполнить это упражнение при
условии, что параметр передается процедуре через регистр
.model small .stack 100h .data X dd ? .code .386 N91953526: mov ax,@data mov ds,ax mov X,234FEDDCh ;... mov ax,word ptr X+2 call OUTW16 mov ax,word ptr X call OUTW16 xor ah,ah int 16h mov ah,4Ch int 21h ;Число передаётся в регистре ax OUTW16 proc near push ax push cx push dx mov dx,ax mov cx,4 OutW16_Loop: rol dx,4 mov ax,dx and al,0Fh cmp al,9 jbe OutW16_2 add al,7 OutW16_2: add al,'0' int 29h loop OutW16_Loop pop dx pop cx pop ax ret OUTW16 endp end N91953526
Решение задачи: «Напечатать в виде 4-значного беззнакового 16-ричного числа значение заданного слова»
textual
Листинг программы
OUTW16 proc near push ax push cx push dx mov dx,ax mov cx,4 OutW16_Loop: xor al,al shld ax,dx,4 shl dx,4 Add Al,90h ; Al is from 90h to 09Fh. Daa ; Al is from 90h to 99h (carry clear) or 00h to 06h (carry set). Adc Al,40h ; Al is from 0D0h to 0D9h or 41h to 46h. Daa ; Al is from 30h to 39h ("0" to "9") or 41h to 46h ("A" to "F"). int 29h loop OutW16_Loop pop dx pop cx pop ax ret OUTW16 endp
Объяснение кода листинга программы
Вывод 16-ричного числа:
- Задано слово, которое нужно вывести в виде 4-значного беззнакового 16-ричного числа.
- Используется ассемблерный код, написанный на языке Assembler.
- Сначала в стек помещаются регистры AX, CX и DX.
- Затем значение регистра AX копируется в регистр DX.
- В регистре CX устанавливается значение 4.
- Далее выполняется цикл OutW16_Loop.
- В начале каждого цикла значение регистра AX обнуляется.
- Затем регистры AX и DX сдвигаются влево на 4 позиции с сохранением знака (shld).
- Далее регистр DX сдвигается влево на 4 позиции без сохранения знака (shl).
- К значению регистра AX добавляется 90h, что позволяет получить значение от 90h до 09Fh.
- Выполняется операция Daa, которая проверяет, установлен ли флаг переноса (carry). Если он установлен, то значение регистра AX будет от 90h до 99h, иначе - от 00h до 06h.
- К значению регистра AX добавляется 40h, что позволяет получить значение от 0D0h до 0D9h или от 41h до 46h.
- Выполняется операция Daa, которая проверяет, установлен ли флаг переноса (carry). Если он установлен, то значение регистра AX будет от 30h до 39h, иначе - от 41h до 46h.
- Выполняется команда int 29h, которая выполняет задержку и выводит значение регистра AX.
- Цикл повторяется до тех пор, пока не будет выполнено условие выхода из цикла (loop).
- В конце кода регистры AX, CX и DX освобождаются (pop).
- Выполняется команда ret, которая возвращает управление в вызывающую программу.
- Код завершается.
- Результатом работы программы будет вывод заданного слова в виде 4-значного беззнакового 16-ричного числа.
- Предположительно, заданное слово будет представлено в виде ASCII-строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д