很难理解汇编语言

Sha*_*ars 2 syntax x86 assembly

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

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
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*phH 7

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

displacement(offset, relative offset, multiplier) = offset + displacement + ( relative offset * multiplier)
Run Code Online (Sandbox Code Playgroud)
  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.

  • 好吧,我必须从十进制转换为十六进制。我不知道的其他问题,这就是我感到困惑的地方。谢谢。 (2认同)

Ale*_*nze 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).