Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编中的一元和二元操作_Assembly_X86 64 - Fatal编程技术网

Assembly 汇编中的一元和二元操作

Assembly 汇编中的一元和二元操作,assembly,x86-64,Assembly,X86 64,我一直在阅读我的教科书中关于汇编语言的章节,但遇到了一个我不理解的实践问题(关于一元和二元运算的部分非常少,所以我很迷茫) 下面是练习题的两个说明。我应该给出每个指令的目标和值: 添加%rcx,(%rax) imulq$16,(%rax,%rdx,8) 其中%rax的值为0x100,%rdx的值为0x3,%rcx的值为0x1 有人能详细解释一下如何解决这两个问题吗?我在书的后面有答案,但没有真正的解释。谢谢。你需要知道 1) 有效地址的工作原理 2) 如何使用指令集引用了解指令的作用 简而言之,

我一直在阅读我的教科书中关于汇编语言的章节,但遇到了一个我不理解的实践问题(关于一元和二元运算的部分非常少,所以我很迷茫)

下面是练习题的两个说明。我应该给出每个指令的目标和值:

添加%rcx,(%rax)

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

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

有人能详细解释一下如何解决这两个问题吗?我在书的后面有答案,但没有真正的解释。谢谢。

你需要知道 1) 有效地址的工作原理 2) 如何使用指令集引用了解指令的作用

简而言之,
disp(%base,%index,scale)
是对地址
%base+%index*scale+disp的内存引用。除一个零件外,所有零件都是可选的<代码>比例可以是
1
2
4
8

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

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

即使它不存在,我们也可以猜测作者想要它的意思,即第二个操作数乘以第一个操作数。同样地,这将把地址为
0x100+3*8=0x118的内存中的qword乘以您需要知道的
16
1) 有效地址的工作原理 2) 如何使用指令集引用了解指令的作用

简而言之,
disp(%base,%index,scale)
是对地址
%base+%index*scale+disp的内存引用。除一个零件外,所有零件都是可选的<代码>比例可以是
1
2
4
8

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

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


即使它不存在,我们也可以猜测作者想要它的意思,即第二个操作数乘以第一个操作数。同样地,这将把地址为
0x100+3*8=0x118的内存中的qword乘以
16
这是来自CS:APP 3/e(全球版)中的练习题3.8

添加%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

这来自CS:APP 3/e(全球版)中的练习题3.8

添加%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

不要添加不相关的标签!很抱歉,我的课程是以C语言为中心的(教科书也是如此),这就是为什么我要包括它。但是你的问题不是。不要添加不相关的标签!很抱歉,我的课程主要围绕C编程语言(教科书也是如此),这就是为什么我要包括它。但你的问题不是。我困惑的是,对于1:它们的目标是0x100,值是0x100。我以为addq&rcx,(%rax)会变成(%rax)+%rcx=>0x100+0x1=>0x101。对于数字2:它们的目的地为0x118,值为0x110。它不会将
1
添加到
0x100
中。它将
1
添加到内存中地址
0x100
处的qword中。现在,如果他们告诉您该地址的内存内容也是
0x100
,那么实际上结果可能是
0x101
。对于第二条指令,谈论目的地和值没有意义,因为该指令不存在。验证您是否正确复制了它。我验证了我是否正确复制了它。它是如何出现在我原来的帖子是如何写在书中。这与我早期版本的教科书第127页(107页-文档的127页)上的问题类似,那本书坏了。该指令不存在。它不在参考手册中,汇编程序也不接受它。顺便说一下,内存的内容在前一页给出。你需要在第一个指令中使用它,才能知道结果值。感谢你的帮助-我可能会向我的教授提出#2,看看他说了什么。对于1,我感到困惑的是:它们的目的地是0x100,值是0x100。我以为addq&rcx,(%rax)会变成(%rax)+%rcx=>0x100+0x1=>0x101。对于数字2:它们的目的地为0x118,值为0x110。它不会将
1
添加到
0x100
中。它将
1
添加到内存中地址
0x100
处的qword中。现在,如果他们告诉您该地址的内存内容也是
Address    Value
0x100      0XFF
0x118      0x11

Register   Value
%rax       0x100
%rcx       0x1
%rdx       0x3