交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
8 函数指针
分享
未结
0
763
李延
LV6
2022-06-07
悬赏:20积分
# 1 函数指针 ```c #include <stdio.h> int max(int x, int y) { return x > y ? x : y; } void print(int (*fun_ptr)(int, int)) { int num = fun_ptr(1, 2); printf("fun_ptr value is %d\n", num); } int main() { print(&max); return 0; } ``` ```asm .file "function.c" .text .globl max .type max, @function max: .LFB11: .cfi_startproc cmpl %edi, %esi movl %edi, %eax cmovge %esi, %eax ret .cfi_endproc .LFE11: .size max, .-max .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "fun_ptr value is %d\n" .text .globl print .type print, @function print: .LFB12: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 movq %rdi, %rax movl $2, %esi movl $1, %edi call *%rax movl %eax, %esi movl $.LC0, %edi movl $0, %eax call printf addq $8, %rsp .cfi_def_cfa_offset 8 ret .cfi_endproc .LFE12: .size print, .-print .globl main .type main, @function main: .LFB13: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 movl $max, %edi call print movl $0, %eax addq $8, %rsp .cfi_def_cfa_offset 8 ret .cfi_endproc .LFE13: .size main, .-main .ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)" .section .note.GNU-stack,"",@progbits ``` # 2 解析 与指针相似,首先是对于 &max的获取 ```asm movl $max, %edi ``` 我们可以看到 就是一个加载max函数 地址的过程。 而对于函数的调用 ```asm call *%rax ``` 之前call后面固定写死的是某个函数名称,它最后后被编译器翻译为一个固定的地址。这个地址就是函数的入口。 但现在我们 函数不固定,它从寄存器 %rax中动态加载。
回帖
消灭零回复
提交回复
热议榜
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应用
微信扫码关注公众号