交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
3 函数调用call
分享
未结
0
756
李延
LV6
2022-06-07
悬赏:20积分
# 1 call指令 对于函数的调用,是通过call指令与ret 指令配置完成的。在前面章节中,我们已经在使用call指令来调用系统函数printf在控制台打印我们需要的内容。 # 2 特殊的跳转 我们完全可以把函数的调用看做一个特殊的jmp命令,也就是讲程序跳转到我们指定的地方执行代码。 不过与普通的jmp不同之处有以下几点: - 函数的调用有返回,最后还是会回到调用call指令的地方。 - 函数的调用有参数。 - 函数的调用有返回值。 我们讲一次说明这几种情况 ## 2.1 函数的返回ret 函数的返回是通过ret 来控制的,当汇编遇到ret指令时,就说明当前函数执行完成,需要返回到调用call的地方。 ## 2.2 函数的参数 函数的参数与我们c语言有很大的不同,它是通过寄存器来传递的,我们函数调用时, 调用者将需要传递的参数放到固定的6各寄存器中,之后在执行call指令调用函数。而被调用者按照约定,在固定的几个寄存器中,去获取这些参数。 这次寄存器分别为rdi、rsi、rdx、rcx、r8、r9 ,依次表示第1~6个参数。 ## 2.3 函数的返回值 与参数传递相似,也是通过寄存器进行传递。因为返回值固定就一个,所以直接通过rap进行传递。 # 3 示例 这里我们直接在上一章jmp时写的代码上加上返回值,进行说明 ```c #include <stdio.h> int sum(int a, int b) { if (a > b) { printf("a>b\n"); return 1; } else { printf("a<=b\n"); return 0; } } int main() { int num = sum(1, 2); printf("num is %d\n",num); return 0; } ``` 唯一区别就是sum函数添加了返回值,并在main函数中进行打印。 对应汇编语言如下: ```asm .LC0: .string "a>b\n" .LC1: .string "a<=b\n" .LC2: .string "num is %d\n" sum: .LFB11: subq $8, %rsp cmpl %esi, %edi jle .L2 movl $.LC0, %edi movl $0, %eax call printf movl $1, %eax jmp .L1 .L2: movl $.LC1, %edi movl $0, %eax call printf movl $0, %eax .L1: addq $8, %rsp ret .globl main main: .LFB12: subq $8, %rsp movl $2, %esi movl $1, %edi call sum movl %eax, %esi movl $.LC2, %edi call printf movl $0, %eax addq $8, %rsp ret ``` 在主函数中,我们首先看一看到,他讲1、2 分别传到了寄存器esi和edi中,也就是之前我们说的用于传参数的几个寄存器中。 ```asm movl $2, %esi movl $1, %edi ``` 同时我们看sum函数中,在调用cmpl时,用到的刚好就是我们传了参数的两个寄存器esi和edi ```asm cmpl %esi, %edi ``` 再sum 函数的最后。我们看懂一个ret 指令,用于返回main函数。 并且在sum函数中,我们分别在if为ture和if为false的代码中可以找到设置eax寄存器值的指令 ```asm movl $1, %eax ``` ```asm movl $0, %eax ``` 两种情况分别讲1和0设置到了eax中。 我们再返回main函数,我们可以看到同样 通过eax获取到了返回值 ```asm movl %eax, %esi ```
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号