概述
汇编是一门相对于C语言来说,比较难学的语言,首先在于它的每行代码都和寄存器打交道,而且调试起来不方便,出现问题难找等缺点。而C语言就比较好学了,一条C语句可以转化为好多条汇编语句,所以在汇编中调用C库可以节省我们大量的时间和精力,下面我将以我们的HelloWorld程序来说明一些问题:
#callprintf.s
.section .data
helloworld:
.ascii "hello worldn "
.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函数即可。好了,谢谢观看
最后
以上就是超级台灯为你收集整理的解决fedroa中AT&T汇编调用C库问题的全部内容,希望文章能够帮你解决解决fedroa中AT&T汇编调用C库问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复