我对汇编语言编程有些陌生,所以如果这个问题似乎无关紧要,请原谅我。
我试图理解一个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指令,以及它实现了什么。
提前致谢。 :)
最佳答案
该代码以十六进制打印一个32位值。 ROL指令在这里很方便,因为它允许您以最高到最低顺序处理半字节。
考虑值0xCAFED00D。要打印出前四个字母,您必须按此顺序提取值“C”,“A”,“F”和“E”。
EAX = 0xCAFED00D
ROL EAX, 4 -> EAX = AFED00DC (lowest nibble is C)
ROL EAX, 4 -> EAX = FED00DCA (lowest nibble is A)
ROL EAX, 4 -> EAX = ED00DCAF (lowest nibble is F)
ROL EAX, 4 -> EAX = D00DCAFE (lowest nibble is E)
and so on..
如您所见,该序列将感兴趣的值移到最低半字节。通过将结果值与0x0f进行“与”运算来提取该值。
之后,该值将转换为十六进制字符,并通过DOS BIOS输出。
关于assembly - 为什么要使用ROL指令?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19857339/