我对汇编语言编程有些新意,所以请原谅我这个问题似乎无关紧要。 我试图了解一个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指令,它对我们有什么帮助。 在此先感谢.. :))
答案 0 :(得分:11)
代码以十六进制打印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进行AND运算来提取此值。
之后,该值将转换为十六进制字符并通过DOS BIOS输出。
答案 1 :(得分:3)
它用于在显示操作期间迭代数字的数字。在每次迭代时,它将EAX的低字节设置为与要显示的下一个数字相对应的位。与SHL / SHR操作不同,ROL将在完成整个显示例程后保留EAX中的原始值。 ROL自然便于从最高位显示(SHR可以通过32位处理位实现类似的效果,但ROL更直接)。