zoukankan      html  css  js  c++  java
  • 《汇编语言程序设计》(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

  • 相关阅读:
    ZOJ 1002 Fire Net (火力网)
    UVa OJ 117 The Postal Worker Rings Once (让邮差只走一圈)
    UVa OJ 118 Mutant Flatworld Explorers (变体扁平世界探索器)
    UVa OJ 103 Stacking Boxes (嵌套盒子)
    UVa OJ 110 MetaLoopless Sorts (无循环元排序)
    第一次遇到使用NSNull的场景
    NSURL使用浅析
    从CNTV下载《小小智慧树》
    NSDictionary and NSMutableDictionary
    Category in static library
  • 原文地址:https://www.cnblogs.com/sun-ye/p/14687638.html
Copyright © 2011-2022 走看看