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"

编译运行截图

最新文章

  1. js 表单验证
  2. iOS进阶_地图上定位的标志——大头针
  3. Android 手机卫士--弹出对话框
  4. 最受欢迎的Java第三方库
  5. 2016.8.21 JavaScript 入门
  6. DirectX 矩阵
  7. luabind 导出string问题
  8. solr 4.3.0 配置
  9. 安卓开发44:解决 INSTALL_FAILED_UID_CHANGED 等问题
  10. javascript 事件多次绑定和删除
  11. oracle 数据库 if...elsif...语句
  12. jquery animate stop函数解析
  13. Java面向对象(封装性概论)
  14. headfirst设计模式(4)—工厂模式
  15. Java常量定义
  16. (数论 最大公约数 最小公倍数) codeVs 1012 最大公约数和最小公倍数问题
  17. 修改SQL Server 的排序规则(转)
  18. JVM类加载全过程--图解
  19. Android自己定义控件--圆形进度条(中间有图diao)
  20. 轻量级ORM框架Dapper应用二:使用Dapper实现CURD操作

热门文章

  1. 05 Java 数组
  2. windows terminal用ssh连接已重装的服务器提示REMOTE HOST IDENTIFICATION HAS CHANGED!
  3. df -T 和 du 统计的内存不一致
  4. 通过抓取pintpoint2的页面信息把数据存入数据库python3
  5. 【git】2.1 获取git仓库
  6. linux中大括号、小括号、中括号的区别和用法
  7. spring 使用@Async注解实现异步调用
  8. 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.
  9. python多线程的问题
  10. RecyclerView setHasFixedSize(true)