[笔记] 汇编杂记(持续更新)

文章目录


前言

举例解释

cpp 复制代码
// Type your code here, or load an example.
int square(int num) {
    return num * num;
}

int sub(int num1, int num2) {
    return num1 - num2;
}

int add(int num1, int num2) {
    return num1 + num2;
}

int divide(int num1, int num2) {
    return num1 / num2;
}

int main() {
    square(4);
    sub(10,1);
    add(1,1);
    divide(16, 4);
    return 0;
}

可使用 Compiler Explorer 在线转为汇编

对应的汇编:

cpp 复制代码
square(int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     eax, DWORD PTR [rbp-4]
        imul    eax, DWORD PTR [rbp-4]
        pop     rbp
        ret
sub(int, int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     DWORD PTR [rbp-8], esi
        mov     eax, DWORD PTR [rbp-8]
        mov     edx, DWORD PTR [rbp-4]
        sub     edx, eax
        mov     eax, edx
        pop     rbp
        ret
add(int, int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     DWORD PTR [rbp-8], esi
        mov     eax, DWORD PTR [rbp-8]
        mov     edx, DWORD PTR [rbp-4]
        add     eax, edx
        pop     rbp
        ret
divide(int, int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     DWORD PTR [rbp-8], esi
        mov     eax, DWORD PTR [rbp-4]
        cdq
        idiv    DWORD PTR [rbp-8]
        pop     rbp
        ret
main:
        push    rbp
        mov     rbp, rsp
        mov     edi, 4
        call    square(int)
        mov     esi, 1
        mov     edi, 10
        call    sub(int, int)
        mov     esi, 1
        mov     edi, 1
        call    add(int, int)
        mov     esi, 4
        mov     edi, 16
        call    divide(int, int)
        mov     eax, 0
        pop     rbp
        ret

函数的序言

https://zhuanlan.zhihu.com/p/368962727

复制代码
push    rbp
mov     rbp, rsp
...
pop     rbp

sqaure前面的push rbp 和mov rbp, rsp又叫做函数的序言(prologue),几乎每个函数一开始都会有的指令。它和函数最后的pop rbp和ret(epilogue)起到维护函数的调用栈的作用。

函数的调用栈

数据的传递

数据的传递就分为以下四个方面

  1. 从内存到寄存器
  2. 从寄存器到内存
  3. 从立即数到寄存器,
  4. 从立即数到内存

注意:数据不能从内存直接传递到内存。如果需要从内存传递到内存,要以寄存器为中介。(这些知识,还是我当年大学学的计算机组成原理里面的)

  • Intel的汇编会在数据前面说明数据大小,比如 mov DWORD PTR [rbp-4], 4,意思是将一个4字节的4存储到 栈上(地址为rbp-4)。
  • 而AT & T是通过指令的后缀来说明,同样的指令为movl $4, -4(%rbp)。而存储的地方,AT & T汇编是通过前缀来区别,比如%q前缀表示寄存器,$表示立即数,()表示内存。

总结

相关推荐
weixin_4707403616 小时前
某算法的python执行汇编
汇编·python·算法
small_wh1te_coder8 天前
GCC深度剖析:从编译原理到嵌入式底层实战
汇编·c++·面试·嵌入式·状态模式·c
白书宇9 天前
5.从零开始写LINUX内核--从实模式到保护模式的过渡实现
linux·汇编·数据库·开源
浩浩测试一下9 天前
02高级语言逻辑结构到汇编语言之逻辑结构转换 if (...) {...} else {...} 结构
汇编·数据结构·数据库·redis·安全·网络安全·缓存
蚰蜒螟10 天前
JVM安全点轮询汇编函数解析
汇编·jvm·安全
要记得喝水15 天前
汇编中常用寄存器介绍
开发语言·汇编·windows·c#·.net
技术领导力16 天前
华为开源CANN,再次释放“昇腾转向”信号
汇编
DONG91320 天前
Python 中的可迭代、迭代器与生成器——从协议到实现再到最佳实践
开发语言·汇编·数据结构·python·算法·青少年编程·排序算法
embrace9923 天前
【C语言学习】scanf函数
c语言·开发语言·汇编·学习·青少年编程·c#·编辑器
麦兜*23 天前
【算法】十大排序算法超深度解析,从数学原理到汇编级优化,涵盖 15个核心维度
java·汇编·jvm·算法·spring cloud·ai·排序算法