【发布时间】:2019-12-06 17:03:34
【问题描述】:
我对汇编语言编程有点陌生,如果这个问题似乎无关紧要,请原谅我。 我试图了解一个 32 位加法程序,以下是用于将加法结果(保存在 EAX 中)显示回控制台的过程之一:
;Procedure to display EAX as a 8 digit hex number
DISPH PROC NEAR
PUSH EBX ; Save EBX
MOV CL,4 ; To rotate the register by 4 bits
MOV SI,8 ; Count for displaying 8 digits
DISPH1:
ROL EAX,CL ; Rotate EAX left by 4 bits
PUSH EAX ; Save EAX
AND AL,0FH
ADD AL,30H
CMP AL,'9' ; if AL <= '9', AL contains the ASCII code
JBE DISPH2
ADD AL,7 ; if AL > '9' , add 07H to AL to convert into ASCII
DISPH2:
MOV AH,2H ; O/P subprogram
MOV DL,AL ; Call MS-DOS O/P subprogram
INT 21H ; Display the data in DL register on screen
POP EAX ; retrieve EAX from Stack
DEC SI
JNZ DISPH1
POP EBX ; Restore EBX
RET
DISPH ENDP
END ; end of file
请帮助我理解为什么在 DISP1 标签下使用 ROL 指令,它的作用是什么。 提前致谢。 :)
【问题讨论】:
-
这有点奇怪的代码。为什么不
rol eax, 4?以及为什么ebx(通常是被调用者保存寄存器)即使没有被使用也会被保存和恢复? -
@gsg 确实这两个操作都是无用的......那里很好的观察......
-
@gsg:我想知道它是否从一些原始的 8086 代码移植到 386 / 32 位寄存器。
rol r16, imm8在 186 中是新的,所以rol ax,cl是你将如何在需要与 8086 兼容的代码中模拟rol AX,4。顺便说一句,我对 How to convert a binary integer number to a hex string? 的回答确实使用了rol立即 4。(还有并行转换所有半字节的 SSE2 和 AVX512 版本:)