c调用汇编函数(1)

guang@guang-laptop:~/temp/h$ ls

hello  hello.o  hello.s  main.c  main.o

!hello.s
.global hello
hello:
movl $4,%eax
movl $1,%ebx
movl $hello,%ecx
movl $30,%edx
int $0x80
.global buff
buff:.ascii "hello world"

as -o hello.o hello.s

extern hello();
int main()
{
	hello();
	return 0;
}


gcc -c main.o main.c

gcc -o hello hello.o main.o

运行结果:

guang@guang-laptop:~/temp/h$ ./hello���ȃ�̀hello wo段错误

上面hello.s有两个bug

.global hello
hello:
push %ebp
mov %esp,%ebp
movl $4,%eax
movl $1,%ebx
movl $buff,%ecx
movl $12,%edx
int $0x80
mov %ebp,%esp
pop %ebp
ret
.global buff
buff:.asciz "hello world\n"

ebp,esp由被调用函数负责。

这个不会遇到\0就停止,一定读取edx个字符。

buff反汇编后会变成可执行代码,因为在.text段里

这个例子是没有参数的。

hello,不是_hello,因为现在的gcc版本较高。若是1.2版的,汇编函数应该是_hello


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值