【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
大部分知识都学过了,这里快速过一下PPT,主要是 64 位的那一套不太熟悉。
文章目录
- History of Intel processors and architectures
- Assembly Basics: Registers, operands, move
- Arithmetic & logical operations
- C, assembly, machine code
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
的话能够使进行优化之后尽可能地不影响调试:
以上是 【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics 的全部内容, 来源链接: utcz.com/a/70993.html