【问题标题】:What value from memory or register do each of the AT&T syntax operands access?每个 AT&T 语法操作数访问内存或寄存器中的什么值?
【发布时间】:2013-01-31 03:23:32
【问题描述】:

假设以下值存储在指定的内存地址和寄存器中:

Address    Value            Register     Value
0x100      0xFF             %eax         0x100
0x104      0xAB             %ecx         0x1
0x108      0x13             %edx         0x3
0x10C      0x11


Fill in the following table showing the values for the indicated operands:

Operand           Value    //Solutions at the end of the chapter
%eax              _____    //0x100
0x104             _____    //0xAB
$0x108            _____    //0x108
(%eax)            _____    //0xFF
4(%eax)           _____    //0xAB
9(%eax, %edx)     _____    //0x11
260(%ecx, %edx)   _____    //0x13
0xFC(,%ecx,4)     _____    //0xFF
(%eax, %edx,4)    _____    //0x11

有人可以用外行的方式向我解释如何做到这一点。这不是 hmwk(这是某些阅读过程中的练习题,在本章末尾有答案),我只是不理解阅读内容。

【问题讨论】:

    标签: assembly x86 memory-address att addressing-mode


    【解决方案1】:

    AT&T x86 汇编语法的一般规则是

    displacement(offset, relative offset, multiplier) = offset + displacement + ( relative offset * multiplier)
    
    1. %eax 指的是寄存器的实际值(=0x100)。
    2. 0x104 指的是地址 0x104 处的值。
    3. $0x108 指的是常数值 0x108。
    4. (%eax) 指的是地址 EAX 处的值,相当于 0x100(=0xFF)。
    5. 4(%eax) 指的是地址 EAX+4 处的值,即 0x104。
    6. 9(%eax, %edx) 指的是地址 EAX+9 + EDX 处的值,即 0x10C。
    7. 260(%ecx, %edx)是指地址ECX+260 + EDX处的值,在0x108处。
    8. 0xFC(,%ecx,4)是指地址(ECX*4)+0xFC处的值,即0x100处。
    9. (%eax, %edx, 4) 指地址 (EAX+(EDX*4) 处的值,即 0x10C。

    【讨论】:

    • 更清楚... 还是不明白 #7.. 1+ 4 + 260 = 0x108 怎么可能?
    • @CarlosCarrillo ecx 为 1,edx 为 3,所以 ECX+260+EDx=1+3+260=264=0x108
    • 好的,我必须从十进制转换为十六进制。我不知道的其他问题,这就是我感到困惑的地方。谢谢。
    【解决方案2】:

    你需要学习这个 AT&T 汇编语法和一点汇编,一旦你知道了这些东西,答案就很简单了。

    所以,

    %eax只是寄存器的内容。

    0x104是内存操作数,内存地址为0x104

    $0x108 是一个常数。

    (some expression)是内存操作数,内存地址为some expression

    some constant(some expression)是内存操作数,内存地址为some expression+some constant

    (%register1, %register2),正如您现在可能已经猜到的,也是一个内存操作数。带括号的表达式的值为register1 + register2

    some constant(%register1, %register2) 现在也应该是微不足道的。只需添加三个项目,这就是地址。

    (, %register, some constant)表示需要将寄存器的值乘以常数。

    (%register1, %register2, some constant) 现在应该是直观的。带括号的表达式的值为register1 + register2 * some constant

    现在像这样猜测内存操作数的地址:

    some constant1(%register1, %register2, some constant2).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2013-08-19
      相关资源
      最近更新 更多