32位AT&T风格汇编语言输出数组中最大值

发布时间:2024年01月21日

我的代码是参考了《深入理解程序设计使用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正常执行程序。
在这里插入图片描述

文章来源:https://blog.csdn.net/qq_42108074/article/details/131992778
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。