我对汇编语言编程有些陌生,所以请原谅我这个问题似乎无关紧要.我试图了解一个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
Run Code Online (Sandbox Code Playgroud)
请帮助我理解为什么在DISP1标签下使用ROL指令,它对我们有什么帮助.提前致谢.. :)
Nil*_*nck 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..
Run Code Online (Sandbox Code Playgroud)
如您所见,此序列将感兴趣的值移动到最低半字节.通过将结果值与0x0f进行AND运算来提取此值.
之后,该值将转换为十六进制字符,并通过DOS BIOS输出.
它用于在显示操作期间迭代数字的数字。在每次迭代时,它将与要显示的下一个数字对应的位设置到 EAX 的低字节中。与 SHL/SHR 操作不同,ROL 将在完成整个显示例程后保留 EAX 中的原始值。ROL自然方便从最高位开始显示(SHR处理32位也可以达到类似的效果,但ROL更直接)。
| 归档时间: |
|
| 查看次数: |
8650 次 |
| 最近记录: |