【问题标题】:Assembly, operation suffix not clicking for me汇编,操作后缀不为我点击
【发布时间】:2015-11-10 07:05:53
【问题描述】:

我不是学生,但我正在使用一本名为“计算机系统,程序员的视角”的教科书来学习处理器架构和组装。我刚刚进入关于 IA32 组装的部分,它问了这个问题:

对于以下每一行汇编语言,根据操作数确定适当的指令后缀。 (例如mov可以改写为movb、movw或movl。)

mov %eax, (%esp)
mov (%eax), %dx
mov $0xFF, %bl
mov (%esp,%edx,4), %dh
push $0xFF
mov %dx, (%eax)
pop %edi

我查看了答案键,其中一些是有道理的,例如push $0xFF,因为这是一个字节大小的常量。就像我说的,我不需要知道答案,因为答案在答案键中提供,但原因不在答案键中。

感谢您的宝贵时间!

【问题讨论】:

    标签: assembly x86


    【解决方案1】:
    mov %eax, (%esp)
    

    双字导致整个寄存器%eax的32位值在移动。

    mov (%eax), %dx
    

    字导致 16 位值移动到 %edx 寄存器的一半。,

    mov $0xFF, %bl
    

    字节。很明显。

    mov (%esp,%edx,4), %dh
    

    字节。在左侧我们有一个地址,但在右侧我们有 %edx 寄存器的 8 位四分之一。

    push $0xFF
    

    这取决于。 80386 具有将 8 位常量压入堆栈的指令 6A。但是 Michael Petch 在 cmets 中怎么说,这取决于堆栈地址大小。

    mov %dx, (%eax)
    

    字。 16 位 %dx 正在移动。

    pop %edi
    

    双字。 32位寄存器%edi

    现在,8 位值与后缀 b(字节)匹配,16 位值与后缀 w(字)匹配,32 位值与后缀 l(双字或 long 字)匹配。

    更新

    4 个寄存器(A、B、C 和 D)可分批使用。 整个 32 位寄存器是 EAX、EBX 等。 寄存器的低 16 位一半是 AX、BX 等。 高 8 位和低 16 位四分之一是 AH、BH(其中 H 表示 )。 低 16 位四分之一的低 8 位是 AL、BL(其中 L 表示 )。

    【讨论】:

    • 啊,我明白了。我没有意识到 %dx 和 %bl 代表什么。这些是寄存器的一部分。这是有道理的。非常感谢!
    • Byte. Obviously. 你确定吗?这取决于堆栈地址的大小。如果这是 Linux 上的 32 位代码,那么您不能推送一个字节。您可以推送的最小值是 16 位字。所以push $0xff 实际上是一个pushw $0xff
    • 实际上,对于堆栈推送,教科书确实显示pushl 0xFF
    • @MichaelPetch 谢谢。我会更新答案,我应该纠正我自己的知识。
    • 是的,实际上很长(现在是凌晨 1 点,所以大脑并没有在所有气缸上工作)。然而,也应该可以推动一个词。 wl 将是唯一可行的方法。一个字节将被符号扩展为更宽的大小。 pushw $0xff 会将一个 2 字节的字作为 $0xffff 压入堆栈。 pushl $0xff会将 4 字节长推入堆栈,为 $0xffffffff
    【解决方案2】:

    指令后缀可以通过操作数类型推断出来。

    例如,在第一行中,一个操作数是 EAX,它立即表明它需要一个 l 指令。 相反,mov (%esp,%edx,4), %dh 的操作数大小为字节,因此它需要一个 b 后缀。

    顺便说一句:push $0xFF 带有字节操作数通常是个坏主意,因为堆栈会错位。由于类似的原因,我曾经搜索过一个错误,Windows 总是在 CreateFile 函数上给我奇怪的错误消息(权限被拒绝),因为文件名未对齐并且很难发现。 :) 其他操作系统可能有类似的限制。

    【讨论】:

    • 感谢您提供的信息!我将接受马克的回答,因为我相信这种格式对于其他寻找这个问题的答案的人来说非常好。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2012-10-12
    • 2018-02-14
    相关资源
    最近更新 更多