解决fedroa中AT&T汇编调用C库问题

汇编是一门相对于C语言来说,比较难学的语言,首先在于它的每行代码都和寄存器打交道,而且调试起来不方便,出现问题难找等缺点。而C语言就比较好学了,一条C语句可以转化为好多条汇编语句,所以在汇编中调用C库可以节省我们大量的时间和精力,下面我将以我们的HelloWorld程序来说明一些问题:

#callprintf.s
.section .data
helloworld:
.ascii "hello world\n\0"
.section .text
.globl _start
_start:
push $helloworld
call printf
push $0
call exit

编过AT&T汇编的HelloWorld的一定会发现,这个要比纯汇编代码要少很多 。当然调用C库后编译和链接也就不一样了,我也是在网上搜索了很多种办法,最终找到了一个比较适合的,

as --32 callprintf.s -o callprintf.o
ld -m elf_i386 callprintf.o -o callprintf -lc -dynamic-linker /lib/ld-linux.so.2

在链接的时候可能会出现/lib/ld-linux.so.2不能找到的问题,这时候可以在内存中找到该文件然后点击属性,找到/lib/ld-linux.so.2的链接目标,用目标替换/lib/ld-linux.so.2
这里写图片描述
然后我的链接就变成这样:

ld -m elf_i386 callprintf.o -o callprintf -lc -dynamic-linker /lib/ld-2.24.so

当然需要先把32位C库装好才可以完美运行

这里写图片描述

调用printf函数时要先将参数压入栈,函数会自动去栈中取出参数,我们只需要将要输出的字符串入栈即可,其他的比如长度都不需要入栈。然后将状态码入栈,调用exit函数即可。好了,谢谢观看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值