4

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

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(这是某些阅读过程中的练习题,在本章末尾有答案),我只是不理解阅读内容。

4

2 回答 2

11

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。
于 2013-02-15T07:32:06.450 回答
5

你需要学习这个 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).

于 2013-02-15T07:32:12.673 回答