假设以下值存储在指定的存储器地址和寄存器中:
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(在某些阅读中有练习问题,在本章末尾有答案),我只是不理解阅读。
答案 0 :(得分:6)
AT& T x86汇编语法的一般规则是
displacement(offset, relative offset, multiplier) = offset + displacement + ( relative offset * multiplier)
%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。答案 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)
。