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(在某些阅读中有练习问题,在本章末尾有答案),我只是不理解阅读.
AT&T x86汇编语法的一般规则是
displacement(offset, relative offset, multiplier) = offset + displacement + ( relative offset * multiplier)
Run Code Online (Sandbox Code Playgroud)
%eax 指寄存器的实际值(= 0x100).0x104 是指地址0x104处的值.$0x108 指常数值0x108.(%eax) 指地址EAX的值,相当于0x100(= 0xFF).4(%eax) 是指地址EAX + 4处的值,即0x104.9(%eax, %edx) 是指地址EAX + 9 + EDX处的值,即0x10C.260(%ecx, %edx) 指地址ECX + 260 + EDX处的值,其值为0x108.0xFC(,%ecx,4) 是指地址(ECX*4)+ 0xFC处的值,其值为0x100.(%eax, %edx, 4) 是指地址处的值(EAX +(EDX*4),它位于0x10C.你需要学习这种 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).