【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

大部分知识都学过了,这里快速过一下PPT,主要是 64 位的那一套不太熟悉。
【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

文章目录

    • History of Intel processors and architectures
    • Assembly Basics: Registers, operands, move
    • Arithmetic & logical operations
    • C, assembly, machine code

    History of Intel processors and architectures

    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    Assembly Basics: Registers, operands, move

    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    这一页很重要。前面加 e 的表示 extended,有 4 个字节,也就是 32 位。前面带 r 的有 8 个字节,也就是 64 位。
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    这一页也很重要
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    重要:movq 中的 q 指的是 8 个字节。%rax,%eax,%ax 依次是 8、4、2 个字节,也就是 64、32、16 位。
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    在这里都是 movq src dst$0x4, $-147 是立即数, 加括号表示寄存器中存的是一个地址,访问的是该地址中的元素:(%rax)
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    Arithmetic & logical operations

    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    这个🐂🍺啊,我还真试了一下,但是需要开 -O2 才能有这样的优化:

    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    如果不开优化的话(是首先加了两次得到 3x ,然后再向左移两位,但是我不明白他为什么非要把 %rdi 中的东西借助内存移到 %rdx 中呢?):
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    所以 lea 的好处就是可以用来计算类似 x+k*y ,其中 k=1,2,4,8 的情况。另外一个好处就是不用访问内存就可以计算地址。

    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    这个顺序是真的hhh,有时候真的不知道啥时候 src 在前,啥时候 dst 在前。

    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

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

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

    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    C, assembly, machine code

    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    gcc -Og -S-Og 的话能够使进行优化之后尽可能地不影响调试:

    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics
    【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics

    以上是 【游戏开发】cmu11313 C6 Machine-Level Primramming I: Sosics 的全部内容, 来源链接: utcz.com/a/70993.html

    回到顶部