Напечатать в виде 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-ричного числа:

  1. Задано слово, которое нужно вывести в виде 4-значного беззнакового 16-ричного числа.
  2. Используется ассемблерный код, написанный на языке Assembler.
  3. Сначала в стек помещаются регистры AX, CX и DX.
  4. Затем значение регистра AX копируется в регистр DX.
  5. В регистре CX устанавливается значение 4.
  6. Далее выполняется цикл OutW16_Loop.
  7. В начале каждого цикла значение регистра AX обнуляется.
  8. Затем регистры AX и DX сдвигаются влево на 4 позиции с сохранением знака (shld).
  9. Далее регистр DX сдвигается влево на 4 позиции без сохранения знака (shl).
  10. К значению регистра AX добавляется 90h, что позволяет получить значение от 90h до 09Fh.
  11. Выполняется операция Daa, которая проверяет, установлен ли флаг переноса (carry). Если он установлен, то значение регистра AX будет от 90h до 99h, иначе - от 00h до 06h.
  12. К значению регистра AX добавляется 40h, что позволяет получить значение от 0D0h до 0D9h или от 41h до 46h.
  13. Выполняется операция Daa, которая проверяет, установлен ли флаг переноса (carry). Если он установлен, то значение регистра AX будет от 30h до 39h, иначе - от 41h до 46h.
  14. Выполняется команда int 29h, которая выполняет задержку и выводит значение регистра AX.
  15. Цикл повторяется до тех пор, пока не будет выполнено условие выхода из цикла (loop).
  16. В конце кода регистры AX, CX и DX освобождаются (pop).
  17. Выполняется команда ret, которая возвращает управление в вызывающую программу.
  18. Код завершается.
  19. Результатом работы программы будет вывод заданного слова в виде 4-значного беззнакового 16-ричного числа.
  20. Предположительно, заданное слово будет представлено в виде ASCII-строки.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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