经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
《汇编语言程序设计》(Professional Assembly Language)学习笔记(二)
来源:cnblogs  作者:Legend_Lone  时间:2021/5/6 17:49:14  对本文有异议

挖坑:学习笔记(一)讲述如何在 Windows Vmware 上安装 Ubuntu 20.04

实践环境

本文是基于Ubuntu 20.04平台进行实验,下文中的解决方法都基于此前提

问题记录

问题一

《汇编语言程序设计》第四章的实例程序cpuid2.s在编译运行的过程中,有如下问题:

  1. $ as -o cpuid2.o cpuid2.s
  2. puid2.s: Assembler messages:
  3. cpuid2.s:17: Error: invalid instruction suffix for `push'
  4. cpuid2.s:18: Error: invalid instruction suffix for `push'
  5. cpuid2.s:21: Error: invalid instruction suffix for `push'

该问题是由于我们当前的处理器一般都是 x86_64 或 IA64,即 64 位处理器,而书中的实例代码是在 32 位 Intel 处理器上面运行的。问题的解决方法是给as命令传入一个选项表明我们要编译 32 位的指令集,即

  1. $ as --32 -o cpuid2.o cpuid2.s

问题二

  1. $ ld -dynamic-linker /lib/ld-linux.so.2 -o cpuid2 cpuid2.o -lc
  2. ld: i386 architecture of input file `cpuid2.o' is incompatible with i386:x86-64 output

该问题的原因是我们编译出的目标文件cpuid2.o是 32 为指令集,而动态链接器/lib/ld-linux.so.2和 C 库却是 64 位指令集。该问题的解决方案是我们需要安装 32 位 C 库和动态链接器,然后使用它们编译生成可执行文件。即

  1. $ sudo apt-get install lib32z1
  2. $ ld -m elf_i386 -dynamic-linker /lib32/ld-linux.so.2 -o cpuid2 cpuid2.o /lib32/libc.so.6
  3. $ ./cpuid2
  4. The processor Vendor ID is 'GenuineIntel'

问题三

当使用gcc直接编译时,把_start改成main之后,

  1. $ gcc -o cpuid2 cpuid2.s
  2. puid2.s: Assembler messages:
  3. cpuid2.s:17: Error: invalid instruction suffix for `push'
  4. cpuid2.s:18: Error: invalid instruction suffix for `push'
  5. cpuid2.s:21: Error: invalid instruction suffix for `push'

和前面两个问题一样,该问题是因为我们默认编译 64 位指令集代码,我们需要指定gcc选项让它编译 32 位指令集代码,即使用-m32选项,但是第一次的话,这里还是存在问题

  1. $ gcc -m32 -o cpuid2 cpuid2.s
  2. /usr/bin/ld: cannot find Scrt1.o: No such file or directory
  3. /usr/bin/ld: cannot find crti.o: No such file or directory
  4. /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a when searching for -lgcc
  5. /usr/bin/ld: cannot find -lgcc
  6. /usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 when searching for libgcc_s.so.1
  7. /usr/bin/ld: cannot find libgcc_s.so.1
  8. /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a when searching for -lgcc
  9. /usr/bin/ld: cannot find -lgcc
  10. collect2: error: ld returned 1 exit status

这个问题的原因是我们没有安装 GCC 32 位相关的 C 运行时库等,解决方法为

  1. $ sudo apt-get install gcc-multilib
  2. $ gcc -m32 -o cpuid2 cpuid2.s
  3. $ ./cpuid2
  4. The processor Vendor ID is 'GenuineIntel'

结语

因水平有限,文中对问题根因的理解和对解决方案的描述可能存在错误或不准确。仅供大家参考,也欢迎大家批评指正。

参考

因为参考的文章较多,这里不一一列出。感谢分享的人们。

原文链接:http://www.cnblogs.com/sun-ye/p/14687638.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号