很难理解汇编语言

时间:2013-02-15 07:15:03

标签: assembly syntax x86

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

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

2 个答案:

答案 0 :(得分:6)

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。

答案 1 :(得分:3)

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

相关问题