我的代码是参考了《深入理解程序设计使用Linux汇编语言》这本书里边的代码。
printMaxATT32.s
里边的代码如下:
.section .data
data_items:
.long 3,67,34,222,45,75,54,34,44,33,22,11,66,0
stringToShow:
.ascii "The max is %d\n"
.section .text
.global _start
_start:
movl $0,%edi # 将0移入索引寄存器
movl data_items(,%edi,4),%eax
movl %eax,%ebx
start_loop:
cmpl $0,%eax
je printMaxAndexit
incl %edi
movl data_items(,%edi,4),%eax
cmpl %ebx,%eax
jle start_loop # 若%ebx>=%eax, 即当前最大值大于从数组中取出来的值,在不更新当前最大值的情况下,开始新一轮比较
movl %eax,%ebx # 若%ebx<%eax,就会更新当前最大值
jmp start_loop # 无条件开始新一轮比较
printMaxAndexit:
pushl %ebx
pushl $stringToShow
call printf
addl $8,%esp
movl $1,%eax
int $0x80
as --32 -o printMaxATT32.o printMaxATT32.s
进行汇编。
ld -m elf_i386 -dynamic-link /usr/lib/ld-linux.so.2 -lc printMaxATT32.o -o printMaxATT32
进行链接时,报错ld: cannot find -lc
。
参考的博客:《/usr/bin/ld: cannot find -lc错误原因及解决方法》
Ubuntu上《/usr/bin/ld: cannot find -lc错误原因及解决方法》
sudo yum -y install glibc-static
安装glibc-static
。
ld -m elf_i386 -dynamic-link /usr/lib/ld-linux.so.2 printMaxATT32.o -o printMaxATT32
把-lc
参数去掉进行链接时,报错:
printMaxATT32.o: In function `printMaxAndexit':
(.text+0x2a): undefined reference to `printf'
find / -name ld-linux.so.2
发现没有这个链接库。
sudo yum install -y glibc.i686
安装依赖库。
完成如下:
ld -m elf_i386 -dynamic-link /usr/lib/ld-linux.so.2 -lc printMaxATT32.o -o printMaxATT32
链接,发现还是报错ld: cannot find -lc
。
yum install glibc* -y
安装依赖包。
然后reboot
重新启动操作系统。
rm -rf printMaxATT32 printMaxATT32.o
把原先生成的可执行文件和链接文件都删除,as --32 -o printMaxATT32.o printMaxATT32.s
重新进行汇编,ld -m elf_i386 -dynamic-link /usr/lib/ld-linux.so.2 -lc printMaxATT32.o -o printMaxATT32
再次重新链接,发现还是报错ld: cannot find -lc
。
又参考博客:《64位Linux环境 编译32位汇编程序(外链C库函数)》
rm -rf printMaxATT32 printMaxATT32.o
把原先生成的可执行文件和链接文件都删除,as --32 -o printMaxATT32.o printMaxATT32.s
进行汇编,ld -m elf_i386 -dynamic-link /usr/lib/ld-linux.so.2 printMaxATT32.o -o printMaxATT32 /usr/lib/libc.so.6
重新链接,./printMaxATT32
正常执行程序。