《汇编语言程序设计》(ProfessionalAssemblyLanguage)学习笔记(二)

编程

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

实践环境

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

问题记录

问题一

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

$ as -o cpuid2.o cpuid2.s

puid2.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 -lc

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 库和动态链接器,然后使用它们编译生成可执行文件。即

$ 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.s

puid2.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

回到顶部