当前位置: 首页 > 面试题库 >

在64位ubuntu上编译32位汇编器

齐永昌
2023-03-14
问题内容

我有用32位汇编语言编写的程序…现在,我无法在64位OS上对其进行编译。在我们学校,它们是特定的,程序必须以32位版本编写。这是我的程序:

bits 32
extern _printf
global _start

section .data
    message db "Hello world!!", 10, 0

section .text

_start:
    pushad 
    push dword message
    call _printf 
    add esp, 4 
    popad 
    ret

任何的想法?我尝试了很多方法来编译它。编译后输出错误:

nasm -f elf64 vaja4.asm
ld vaja4.o -o vaja4
./vaja4

输出:

vaja4.o: In function `_start':
vaja4.asm:(.text+0x7): undefined reference to `_printf'

问题答案:

首先将更_printf改为printf并将_start符号更改为main,然后使用gcc链接目标文件,该文件将自动链接至该文件libc
您需要这样做,因为AFAIK如果没有,就无法链接至libcmain。另外,在汇编时也应使用elf32而不是elf64,因为代码具有32位指令:

bits 32
extern printf
global main

section .data
    message db "Hello world!!", 10, 0

section .text

main:
    pushad 
    push dword message
    call printf 
    add esp, 4 
    popad 
    ret

并使用:

nasm -f elf32 vaja4.asm
gcc -m32 vaja4.o -o vaja4
$./test 
$Hello world!!

编辑:

由于您现在要在64位系统上编译32位代码,因此需要安装32位版本的库

apt-get install ia32-libs


 类似资料:
  • 问题内容: 我有一个专有程序,试图在64位系统上使用。 当我启动安装程序时,它可以正常运行,但是在尝试更新自身并编译一些模块之后,它无法加载它们。 我怀疑这是因为它正在使用gcc,而gcc试图将它们编译为64位系统,因此该程序无法使用这些模块。 是否有任何方法(一些环境变量或类似的东西)强制gcc为32位平台执行所有操作。32位chroot可以工作吗? 问题答案: 您需要使GCC使用该标志。 您可

  • 问题内容: 因此,标题中的问题是,我需要在32位Windows XP的系统上的Tomcat中运行我的服务器应用程序,我正在Eclipse的64位Windows 7上工作和编译。如何将其编译为32位,我需要做什么?我假设在64位计算机上编译它时,它不能在32位Windows上运行? 问题答案: Java不会构建32位或64位应用程序-字节码可在不同的位体系结构之间移植。 唯一的例外是您可能在代码中使

  • 问题内容: 我遇到了一个有趣的问题,我忘记了我正在使用64位计算机和操作系统,并编写了32位汇编代码。我不知道如何编写64位代码。 这是Linux上Gnu汇编程序(AT&T语法)的x86 32位汇编代码。 现在,此代码应该可以在32位处理器和32位操作系统上正常运行,对吗?众所周知,64位处理器与32位处理器向后兼容。因此,这也不是问题。由于在64位OS和32位OS中系统调用和调用机制存在差异,因

  • 问题内容: 我有一个jar,但不知道它是用于64位系统还是32位系统。如何找出来? 编辑:我有本机库依赖项。 问题答案: Java字节码是Java字节码,无论它是用32位还是64位JDK构建的,都没有办法解决。 我认为用32位或64位编译jar并没有什么区别。它应该与机器无关;除非您具有某些本机库依赖项,或者将Java代码直接编译为本机代码。

  • 问题内容: 使用 应该以32位版本编译该文件。 不幸的是我得到这个错误: 我该如何解决? 如果我不使用它,则使用64位指令。 问题答案: 要在64位Linux版本上编译32位二进制文​​件,您必须安装开发包和32位GNU C库 尝试这个 和

  • 问题内容: 我想知道x86和x64中的64位长吗? 问题答案: 是。Java 在任何JVM上都是64位,无一例外。所有Java原语类型都是完全可移植的,并且在所有实现中都具有固定的大小。