cmu15213 L5 Machine-Level Programming I: Basics

大部分知识都学过了,这里快速过一下PPT,主要是 64 位的那一套不太熟悉。
在这里插入图片描述

History of Intel processors and architectures

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Assembly Basics: Registers, operands, move

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这一页很重要。前面加 e 的表示 extended,有 4 个字节,也就是 32 位。前面带 r 的有 8 个字节,也就是 64 位。
在这里插入图片描述
这一页也很重要
在这里插入图片描述
在这里插入图片描述
重要:movq 中的 q 指的是 8 个字节。%rax,%eax,%ax 依次是 8、4、2 个字节,也就是 64、32、16 位。
在这里插入图片描述
在这里都是 movq src dst$0x4, $-147 是立即数, 加括号表示寄存器中存的是一个地址,访问的是该地址中的元素:(%rax)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Arithmetic & logical operations

在这里插入图片描述
这个🐂🍺啊,我还真试了一下,但是需要开 -O2 才能有这样的优化:

在这里插入图片描述
如果不开优化的话(是首先加了两次得到 3x ,然后再向左移两位,但是我不明白他为什么非要把 %rdi 中的东西借助内存移到 %rdx 中呢?):
在这里插入图片描述
所以 lea 的好处就是可以用来计算类似 x+k*y ,其中 k=1,2,4,8 的情况。另外一个好处就是不用访问内存就可以计算地址。

在这里插入图片描述
这个顺序是真的hhh,有时候真的不知道啥时候 src 在前,啥时候 dst 在前。

在这里插入图片描述
在这里插入图片描述
ok 从这个例子我可以大致推测出:函数的参数依次由 %rdi,%rsi,%rdx 来存储(为什么 s 不在 d 前面!摔!)。

嗯。。你们城里人计算 y*48 都是先用 lea 算出一个 y*3 然后再左移四位的啊,社会社会。

在这里插入图片描述

C, assembly, machine code

在这里插入图片描述
gcc -Og -S-Og 的话能够使进行优化之后尽可能地不影响调试:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

posted @ 2020-05-06 19:28  winechord  阅读(120)  评论(0编辑  收藏  举报