OpenEuler 中C与汇编的混合编程
2024-09-08 16:16:02
2.5.1用汇编代码编程
将C代码编译成汇编代码
C代码:
/**********a.c file********/
#include <stdio.h>
extern int B();
int A(int x,int y)
{
int d,e,f;
d = 4;e = 5;f = 6;
f = B(d,e);
}
汇编代码
.file "a.c"
.text
.globl A
.type A, @function
A:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
subl $24, %esp
movl $4, -12(%ebp)
movl $5, -16(%ebp)
movl $6, -20(%ebp)
subl $8, %esp
pushl -16(%ebp)
pushl -12(%ebp)
call B
addl $16, %esp
movl %eax, -20(%ebp)
nop
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size A, .-A
.ident "GCC: (Uos 8.3.0.3-3+rebuild) 8.3.0"
.section .note.GNU-stack,"",@progbits
2.5.2用汇编语言实现函数
示例2.2
获取CPU寄存器
main.c file:
#include <stdio.h>
extern int get_ebp();
extern int get_esp();
int main()
{
int ebp, esp;
ebp = get_ebp();
esp = get_esp();
printf("ebp=%8x esp=%8x\n",ebp,esp);
}
s.s file:
.section .text
.global get_esp, get_ebp
get_esp:
movl %esp, %eax
ret
get_ebp:
movl %ebp, %eax
ret
编译运行截图
示例2.3
假设int mysum(int x,int y)返回x和y的和。用汇编语言编写mysum函数。
mysum.s file:
.text
.global mysum,printf
mysum:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
addl 12(%ebp), %eax
movl %ebp, %esp
pop %ebp
ret
mysum.c file:
#include <stdio.h>
extern int mysum(int a, int b);
int main()
{
int a,b,c;
a = 123; b = 456;
c = mysum(a,b);
printf("c = %d\n",c);
}
编译运行截图
2.5.3从汇编中调用C函数
示例2.4:访问全局变量并调用printf()
c file
#include <stdio.h>
int a,b;
extern int sub();
int main()
{
a = 100; b = 200;
sub();
}
汇编代码:
.text
.global sub, a, b, printf
sub:
pushl %ebp
movl %esp, %ebp
pushl b
pushl a
pushl $fmt
call printf
addl $12, %esp
movl %ebp,%esp
pop %ebp
ret
.data
fmt: .asciz "a = %d b = %d\n"
编译运行截图
最新文章
- js 表单验证
- iOS进阶_地图上定位的标志——大头针
- Android 手机卫士--弹出对话框
- 最受欢迎的Java第三方库
- 2016.8.21 JavaScript 入门
- DirectX 矩阵
- luabind 导出string问题
- solr 4.3.0 配置
- 安卓开发44:解决 INSTALL_FAILED_UID_CHANGED 等问题
- javascript 事件多次绑定和删除
- oracle 数据库 if...elsif...语句
- jquery animate stop函数解析
- Java面向对象(封装性概论)
- headfirst设计模式(4)—工厂模式
- Java常量定义
- (数论 最大公约数 最小公倍数) codeVs 1012 最大公约数和最小公倍数问题
- 修改SQL Server 的排序规则(转)
- JVM类加载全过程--图解
- Android自己定义控件--圆形进度条(中间有图diao)
- 轻量级ORM框架Dapper应用二:使用Dapper实现CURD操作
热门文章
- 05 Java 数组
- windows terminal用ssh连接已重装的服务器提示REMOTE HOST IDENTIFICATION HAS CHANGED!
- df -T 和 du 统计的内存不一致
- 通过抓取pintpoint2的页面信息把数据存入数据库python3
- 【git】2.1 获取git仓库
- linux中大括号、小括号、中括号的区别和用法
- spring 使用@Async注解实现异步调用
- Excel error - the macros in this project are disabled, please refer to the online help or documentation of the host application to determine how to enable macros.
- python多线程的问题
- RecyclerView setHasFixedSize(true)