所以这是所提到程序的汇编代码:
.model small
.386p
.data
n1 dd 12345678h
n2 dd 11112222h
res dd ?
.code
.startup
mov eax, n1
mov ebx, n2
add eax, ebx
mov res,eax
call disp
disp proc near
mov ch,08h
up:
mov eax,res
rol eax, 04h
mov res,eax
and al, 0Fh
cmp al, 0Ah
JC d1
add al,07h
d1: add al,30h
mov dl, al
mov ah, 02h
int 21h
dec ch
JNZ up
ret
endp disp
mov ah,4ch
int 21h
end
.exit
有人会善意地解释“disp”程序究竟是一步一步的吗?添加部分是有道理的,尽管其他部分让我不知所措。谢谢!
答案 0 :(得分:1)
首先它将res
中的32位值旋转,以便前4个最高有效位最终位于4个最低有效位中:
mov eax,res
rol eax, 04h
mov res,eax
例如,如果res
在第一行持有0x12345678
,eax
和res
都会在第三行后保留0x23456781
。
然后屏蔽除al
的最低有效位之外的所有位:
and al, 0Fh
如果我们继续上面的示例,al
现在将包含0x01
。
如果al
(al >= 0x0A
可以被视为JC
),则会向Jump if unsigned less than
添加7,最后将'0'
(0x30)添加到{{ 1}}:
al
如果cmp al, 0Ah
JC d1
add al,07h
d1: add al,30h
最初在0..9范围内,它现在将在0x30..0x39(ASCII al
)范围内。如果它最初在0x0A..0x0F范围内,它现在将在0x41..0x46范围内(ASCII '0'..'9'
)。
最后,它使用'A'..'F'
(int 21h / ah=02h
)打印生成的字符。
然后再重复7次(即对于32位输入数字中的每个十六进制数字)。
答案 1 :(得分:0)
首先:序列
mov ah,4ch
int 21h
(退出程序)位置错误。它必须在disp proc near
之前。
过程disp
以十六进制表示法显示res
中的无符号整数:
disp proc near
mov ch,08h ; loop 8 times 'up'
up:
mov eax,res ; load value in 'result'
rol eax, 04h ; move the highest nibble to the lowest place
mov res,eax ; save eax for future use (next pass of 'up')
and al, 0Fh ; isolate the nibble
cmp al, 0Ah ; al < 0A?
JC d1 ; yes: skip the next command
add al,07h ; add 7 to match the appropriate character ('A' - 'F')
d1: add al,30h ; convert AL to ASCII
mov dl, al
mov ah, 02h ; Fn 02h: Write character in DL to Standard Output (Stdout)
int 21h ; call MSDOS-interrupt
dec ch ; loop 8 times
JNZ up
ret
endp disp ; TASM. For MASM use 'disp endp'