解决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
解决fedroa中AT&T汇编调用C库问题_第1张图片
然后我的链接就变成这样:

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

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

这里写图片描述

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

你可能感兴趣的:(解决fedroa中AT&T汇编调用C库问题)