《汇编语言程序设计》(ProfessionalAssemblyLanguage)学习笔记(二)
挖坑:学习笔记(一)讲述如何在 Windows Vmware 上安装 Ubuntu 20.04
实践环境
本文是基于Ubuntu 20.04
平台进行实验,下文中的解决方法都基于此前提
问题记录
问题一
《汇编语言程序设计》第四章的实例程序cpuid2.s
在编译运行的过程中,有如下问题:
$ as -o cpuid2.o cpuid2.spuid2.s: Assembler messages:
cpuid2.s:17: Error: invalid instruction suffix for `push"
cpuid2.s:18: Error: invalid instruction suffix for `push"
cpuid2.s:21: Error: invalid instruction suffix for `push"
该问题是由于我们当前的处理器一般都是 x86_64 或 IA64,即 64 位处理器,而书中的实例代码是在 32 位 Intel 处理器上面运行的。问题的解决方法是给as
命令传入一个选项表明我们要编译 32 位的指令集,即
$ as --32 -o cpuid2.o cpuid2.s
问题二
$ ld -dynamic-linker /lib/ld-linux.so.2 -o cpuid2 cpuid2.o -lcld: 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 库和动态链接器,然后使用它们编译生成可执行文件。即
$ sudo apt-get install lib32z1$ ld -m elf_i386 -dynamic-linker /lib32/ld-linux.so.2 -o cpuid2 cpuid2.o /lib32/libc.so.6
$ ./cpuid2
The processor Vendor ID is "GenuineIntel"
问题三
当使用gcc
直接编译时,把_start
改成main
之后,
$ gcc -o cpuid2 cpuid2.spuid2.s: Assembler messages:
cpuid2.s:17: Error: invalid instruction suffix for `push"
cpuid2.s:18: Error: invalid instruction suffix for `push"
cpuid2.s:21: Error: invalid instruction suffix for `push"
和前面两个问题一样,该问题是因为我们默认编译 64 位指令集代码,我们需要指定gcc
选项让它编译 32 位指令集代码,即使用-m32
选项,但是第一次的话,这里还是存在问题
$ gcc -m32 -o cpuid2 cpuid2.s/usr/bin/ld: cannot find Scrt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 when searching for libgcc_s.so.1
/usr/bin/ld: cannot find libgcc_s.so.1
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
collect2: error: ld returned 1 exit status
这个问题的原因是我们没有安装 GCC 32 位相关的 C 运行时库等,解决方法为
$ sudo apt-get install gcc-multilib$ gcc -m32 -o cpuid2 cpuid2.s
$ ./cpuid2
The processor Vendor ID is "GenuineIntel"
结语
因水平有限,文中对问题根因的理解和对解决方案的描述可能存在错误或不准确。仅供大家参考,也欢迎大家批评指正。
参考
因为参考的文章较多,这里不一一列出。感谢分享的人们。
以上是 《汇编语言程序设计》(ProfessionalAssemblyLanguage)学习笔记(二) 的全部内容, 来源链接: utcz.com/z/519606.html