大会中的一元和二元操作

时间:2016-03-21 21:54:28

标签: assembly x86-64

我一直在编写有关汇编语言的章节,并且遇到了一个我不理解的练习题(关于一元和二元操作的部分非常小,所以我很丢失)。

以下是练习题的两条说明。我应该给出每条指令的目的地和价值:

  

addq%rcx,(%rax)

     

imulq $ 16,(%rax,%rdx,8)

%rax的值为0x100,%rdx的值为0x3,%rcx的值为0x1。

任何人都可以详细解释如何解决这两个指令吗?我在书的后面有答案,但没有真正的解释。谢谢。

2 个答案:

答案 0 :(得分:4)

你需要知道 1)地址的有效性如何 2)如何使用指令集引用来确定哪些指令

简而言之,disp(%base, %index, scale)是地址%base + %index * scale + disp的内存引用。除一个以外的所有部件都是可选scale可以是1248

现在,如果您在手册中查找add,您可以看到它只是将第一个操作数添加到第二个操作数,以便将1%rcx的值)添加到qword在地址0x100的内存中(值%rax)。

第二条指令无效,没有imul这种形式。也许你忘了复制另一个操作数?

即使它不存在,我们也能猜出作者想要它的含义,即将第二个操作数乘以第一个操作数。因此,这会将地址0x100 + 3 * 8 = 0x118的内存中的qword乘以16

答案 1 :(得分:0)

这是来自CS:APP 3 / e(全球版)

中的练习题3.8
Address    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。