我一直在编写有关汇编语言的章节,并且遇到了一个我不理解的练习题(关于一元和二元操作的部分非常小,所以我很丢失)。
以下是练习题的两条说明。我应该给出每条指令的目的地和价值:
addq%rcx,(%rax)
imulq $ 16,(%rax,%rdx,8)
%rax的值为0x100,%rdx的值为0x3,%rcx的值为0x1。
任何人都可以详细解释如何解决这两个指令吗?我在书的后面有答案,但没有真正的解释。谢谢。
答案 0 :(得分:4)
你需要知道 1)地址的有效性如何 2)如何使用指令集引用来确定哪些指令
简而言之,disp(%base, %index, scale)
是地址%base + %index * scale + disp
的内存引用。除一个以外的所有部件都是可选scale
可以是1
,2
,4
或8
。
现在,如果您在手册中查找add
,您可以看到它只是将第一个操作数添加到第二个操作数,以便将1
(%rcx
的值)添加到qword在地址0x100
的内存中(值%rax
)。
第二条指令无效,没有imul
这种形式。也许你忘了复制另一个操作数?
即使它不存在,我们也能猜出作者想要它的含义,即将第二个操作数乘以第一个操作数。因此,这会将地址0x100 + 3 * 8 = 0x118
的内存中的qword乘以16
。
答案 1 :(得分:0)
这是来自CS:APP 3 / e(全球版)
中的练习题3.8Address Value
0x100 0XFF
0x118 0x11
Register Value
%rax 0x100
%rcx 0x1
%rdx 0x3
addq%rcx,(%rax)
对于这个问题,你在%rax(0XFF)处获取qword并向其添加%rcx,因此0XFF + 0x1 = 0x100。注意括号(%rax)周围的括号指向内存中保存的内容(0XFF)而不是它的地址(0x100)。
imulq $ 16,(%rax,%rdx,8)
如jester所述,右侧(%rax +(%rdx * 8))为0x118。存储在该地址的值为0x11。 imulq现在乘以0x11 * 0x10(注意,16转换为十六进制是0x10)并回答0x110。