【问题标题】:Why is ROL instruction used?为什么使用 ROL 指令?
【发布时间】: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 版本:)

标签: assembly x86


【解决方案1】:

代码以十六进制打印一个 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 输出。

【讨论】:

    【解决方案2】:

    它用于在显示操作期间迭代数字的数字。在每次迭代中,它将与要显示的下一个数字对应的位设置到 EAX 的低字节中。与 SHL/SHR 操作不同,ROL 将在整个显示例程完成后保留 EAX 中的原始值。 ROL自然方便从最高位显示(SHR通过32个处理位可以达到类似的效果,但ROL更直接)。

    【讨论】:

    • 特别感谢比较 shl/shr 和 rol 指令:)
    • 不幸的是,此函数选择破坏 EAX 的低字节,因此无论如何它都必须使用 push/pop 保存/恢复 EAX。但是是的,如果将旋转的值复制到另一个寄存器中以转换为数字字符,则 8x rol eax,4 既方便又高效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2017-02-15
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多