• 《汇编语言程序设计》(Professional Assembly Language)学习笔记(二)


    挖坑:学习笔记(一)讲述如何在 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'
    

    结语

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

    参考

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

    本文来自博客园,作者:Legend_Lone,转载请注明原文链接:https://www.cnblogs.com/sun-ye/p/14687638.html

  • 相关阅读:
    浅谈异或运算^的作用
    牛客网剑指offer第40题——数组中只出现一次的数字(浅谈位运算的妙用)
    归并排序——一文吃透归并和递归的思想和完整过程!(没看懂请留言)
    深入分析二分查找及其变体
    vector构造函数的学习
    牛客网剑指offer第34题——找到第一个只出现一次的字符
    牛客网剑指offer第27题——求字符串的全排列
    牛客网剑指offer第20题——定义栈的数据结构
    C++重载运算简介
    Leetcode中字符串总结
  • 原文地址:https://www.cnblogs.com/sun-ye/p/14687638.html
Copyright © 2020-2023  润新知