linux中的汇编语言开发一般采用的是AT&T语法,而一些老版本的as对于intel的语法支持还不是很好,保险起见还是用AT&T语法才是王道啊 呵呵
# filename:hello.s
# development environment: Linux as ld gdb IA-32
.section .data
output:
.asciz "hello world\n"
.section .text
.globl _start
_start:
pushl $output #将标签引用的内存地址压入栈中
call printf #调用C语言的printf函数
pushl $123 #将立即数压入栈中以测试返回值
call exit
先汇编一下吧:
as -gstabs -o hello.o hello.s
接下来的连接是关键:
ld -dynamic-linker /lib/ld-linux.so.2 -lc -o hello hello.o
最后看一下返回值:
echo $?
如果正常,结果应为:123
注:
-gstabs参数是包含每行代码的调试信息
-dynamic-linker /lib/ld-linux.so.2如果没有这个参数,当你运行时会出现无法找到文件或者目录的错误信息,问题在于连接器ld可以解析C函数但是函数本身没有包含在最终可执行的程序中,因此还必须在执行时加载“动态库”的程序,在Linux系统中这个程序一般为linux.so.2这个程序通常在/lib目录下
linux中把C语言连接到汇编语言程序有两种方法:
N0.1静态链接(static linking)静态链接把函数目标代码直接连接到可执行文件中,这样会制造巨大的可执行程序,而且同时运行多个实例,就会造成系统资源的浪费(每个实例都会有自己相同函数的拷贝)
NO.2动态链接库(dynamic linking)程序运行时自动调用动态库,并且多个程序间可以共享库
如果觉得《Linux汇编代码中加打印 汇编语言中调用C函数打印“hello world”》对你有帮助,请点赞、收藏,并留下你的观点哦!