计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)

文章目录

  • call指令和ret指令
    • 高级语言的函数调用
    • x86汇编语言的函数调用
    • call ret指令
    • 小结
    • 其他问题
  • 如何访问栈帧
    • 函数调用栈在内存中的位置
    • 标记栈帧范围:EBP ESP寄存器
    • 访问栈帧数据:push pop指令
    • 访问栈帧数据:mov指令
    • 小结
  • 如何切换栈帧
    • 函数返回时,如何切换栈帧
      • ret指令
    • 小结
  • 如何传递参数和返回值
    • 一个栈帧内可能包含哪些内容
    • 汇编代码实战
    • 小结

call指令和ret指令

高级语言的函数调用

x86默认指的是32为如果为64位可以叫x64或x86-64
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第1张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第2张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第3张图片

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第4张图片

此时caller栈帧中有add函数调用的参数信息
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第5张图片

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第6张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第7张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第8张图片

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第9张图片

x86汇编语言的函数调用

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第10张图片

call ret指令

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第11张图片

小结

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第12张图片

其他问题

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第13张图片

如何访问栈帧

函数调用栈在内存中的位置

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第14张图片

标记栈帧范围:EBP ESP寄存器

注意x86系统中默认以4字节位栈的操作单位
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第15张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第16张图片

访问栈帧数据:push pop指令

初始状态计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第17张图片
第一条指令执行后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第18张图片
第二条指令执行后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第19张图片
第三条指令执行后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第20张图片
第四条指令执行后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第21张图片
第五条指令执行后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第22张图片

访问栈帧数据:mov指令

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第23张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第24张图片

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第25张图片
在这里插入图片描述
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第26张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第27张图片

小结

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第28张图片

如何切换栈帧

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第29张图片
call没执行之前
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第30张图片
call执行后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第31张图片
push指令执行后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第32张图片
mov指令执行后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第33张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第34张图片

函数返回时,如何切换栈帧

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第35张图片
第一条指令执行后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第36张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第37张图片

相当于恢复之前使用call之后的状态
在这里插入图片描述
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第38张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第39张图片

ret指令

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第40张图片

小结

跳转之前都是上一个函数的栈帧
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第41张图片

如何传递参数和返回值

一个栈帧内可能包含哪些内容

如果当前函数不会调用下一个函数,那么该当前函数的栈帧的大小不需要是16字节对齐的
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第42张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第43张图片

汇编代码实战

执行前两天指令后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第44张图片
执行sub指令后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第45张图片
再执行两天mov指令
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第46张图片
执行两个mov指令
mov指令不支持两个操作数同时来自主存

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第47张图片
再执行两个mov指令
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第48张图片
执行call指令后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第49张图片
执行push 和mov指令后

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第50张图片
执行两条mov指令
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第51张图片

执行add指令后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第52张图片
执行完leave指令
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第53张图片
执行完ret指令
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第54张图片
执行完mov指令后
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第55张图片
再执行下一条mov指令
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第56张图片

小结

如果调用者有其他也使用的寄存器要被被调用者使用时
此时可以将调用者使用的寄存器压栈保存
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第57张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第58张图片
计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)_第59张图片

你可能感兴趣的:(王道计算机组成原理考研笔记,汇编)