如果我的问题显得无关紧要,那是因为我对汇编语言编程还比较新手。我正在尝试理解一个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
(通常是被调用者保存的寄存器),即使它没有被使用? - gsgrol r16,imm8
在186中是新的,因此在需要与8086兼容的代码中模拟rol AX,4
时,就是你要使用rol ax,cl
。顺便说一句,我在如何将二进制整数转换为十六进制字符串?的答案中确实使用了rol
,通过立即4进行转换(还有SSE2和AVX512版本,可以并行转换所有半字节 :))。 - Peter Cordes