从 Windows 移植到 Linux。汇编命令翻译

2023-12-26

我最近开始学习从 Windows 到 Linux 的移植。我一直在将程序从 Intel 语法翻译为 AT&T 语法,并将其从 x32 转换为 x64。由于我对汇编程序特别是 AT&T 还很陌生,所以我在移植时遇到了一些麻烦。只是提一下:我故意不使用.intel_syntax指示。

所以我一直在翻译这些命令:

RTLWriteIntegerBuffer: TIMES 3 DB 0x90,0x8D,0x40,0x00

其次是:

LEA EDI,[OFFSET RTLWriteIntegerBuffer+ECX-1]

另一个:

LEA EBX,[EDX+'0']

多一个:

ReadCharInited: DB 0
CMP BYTE PTR ReadCharInited,0

另一个问题是:AT&T 语法和 Intel 语法之间是否存在 1:1 映射?或者 AT&T 是否不支持特定的 Intel 命令?

也许有人知道这样的函数:

HEAP_NO_SERIALIZE=1
HEAP_GENERATE_EXCEPTIONS=4
HEAP_ZERO_MEMORY=8
...
INVOKE HeapAlloc,EAX,HEAP_GENERATE_EXCEPTIONS+HEAP_ZERO_MEMORY+HEAP_CREATE_ALIGN_16,4194332

这可能是 Borland Turbo Assembler 特定的调用方式kernel32.dll's HeapAlloc,但我不确定。可以翻译成fallocate系统调用?

提前致谢


当谈论“AT&T语法”与“Intel语法”时,通常仅指指令助记符和操作数排序和格式之间的差异。

例如,这是一条 AT&T 语法指令:

movl $1, (%esi)

这是使用 Intel 语法的相同指令:

mov  DWORD PTR [esi], 1

对于以 Intel 语法表示的每条指令,该指令在 AT&T 语法中都有等效的表示形式。

由于不再有 AT&T 汇编器和 Intel 汇编器,因此指令(除指令之外的所有内容)是另一回事。 GNU 汇编器 (GAS) 支持 AT&T 和 Intel 语法,但仅支持其自己的指令,这些指令是 AT&T 汇编器使用的指令的扩展。 Microsoft 的 MASM 仅支持 Intel 语法,也仅支持其自己的指令,这些指令是原始 Intel 汇编器的扩展。一个汇编器的指令与另一汇编器的指令并不总是直接等效。在某些情况下,它们使用不同的目标文件格式这一事实可能会妨碍找到使用不同目标文件格式在不同汇编器中实现指令功能的任何方法。 (或者甚至使用不同格式的相同汇编器,就像 GNU 汇编器的情况一样。)

作为示例,以下是一些 GAS 指令:

.rept 3
.byte 0x90, 0x8D, 0x40, 0x00
.endr

以下是等效的 MASM 指令:

REPT 3
DB 90h, 8Dh, 40h, 00h
ENDM

但是没有与以下 GAS 指令等效的 MASM,因为它特定于 ELF 对象格式,而 MASM 不支持这种格式:

.protected foo

另一方面,没有与以下 MASM 指令直接等效的指令,因为 GAS 不支持任何复杂的高级语言指令:

INVOKE HeapAlloc,EAX,HEAP_GENERATE_EXCEPTIONS+HEAP_ZERO_MEMORY+HEAP_CREATE_ALIGN_16,4194332

要移植以前的 ELF 特定指令,您必须重新设计应用程序以处理 Windows 处理共享库的方式。要移植后来的 MASM 特定指令,您要么必须创建自己的宏来完成弄清楚如何正确传递所有参数的工作,要么只是根据以下命令手动写出此调用所需的所有汇编指令: Linux x86-64 ABI。 (您还必须找到一个合适的 Linux 函数来调用和传递一组不同的参数,但这与翻译指令本身是一个单独的问题。)

一些汇编器尝试与其他汇编器兼容;例如,Borland 的 TASM 尝试与 MASM 兼容,尽管它是 MASM 的旧版本。因此,在 TASM(默认的 MASM 模式)中有效的内容通常在 MASM 中也能有效,反之亦然。然而,许多汇编程序本质上使用它们自己的 x86 汇编语言版本。

例如,您在帖子中显示的代码似乎使用两种不同的汇编语言版本,并且无法由任何单个汇编器进行汇编。您的第一行代码使用TIMES指令,但该指令仅受 NASM 支持,NASM 不使用 AT&T 语法,也不使用 Intel 语法。它有自己的指令语法,尽管它与英特尔语法没有太大不同。它也有自己的不兼容的指令集,不基于任何特定的东西,就像这样TIMES你展示的指令。

其余代码似乎采用 MASM 语法。除了第三行之外,它无法使用 NASM 正确组装(第一行也无法使用 MASM 正确组装)。我也不确定是否会与 TASM 组装,因为INVOKEMASM 6 中添加了指令。

请注意,考虑到代码的性质,用汇编语言编写它可能没有任何好处,并且将其翻译成 C、C++ 或您更熟悉的其他语言可能会更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Windows 移植到 Linux。汇编命令翻译 的相关文章

  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 为什么在强度降低乘法和循环进位加法之后,这段代码的执行速度会变慢?

    我正在读书阿格纳 雾 https en wikipedia org wiki Agner Fog s 优化手册 https en wikipedia org wiki Agner Fog Optimization 我遇到了这个例子 doub
  • 68HC11计算sin(x)的汇编代码

    68HC11 使用泰勒级数或查找表计算正弦值的汇编代码是什么 显示值只能是整数 查找表如何工作 在这种情况下 如何使用它来实现泰勒级数 http en wikipedia org wiki Taylor series 如果您正在寻找浮点解决
  • 无法访问打开的/arch/x86/syscalls/syscall_32.tbl

    当我在切换到内核后编写此命令时 当我编译它时 它没有显示任何列表 是否有其他命令可以打开列表 open arch x86 syscalls syscall 32 tbl Bug 先删除 文件路径中的字符 应该是relative http e
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • “mov (%ebx,%eax,4),%eax”如何工作? [复制]

    这个问题在这里已经有答案了 一直在从事装配作业 并且在很大程度上我对装配非常了解 或者至少对于这项任务来说足够好 但这个 mov 的声明让我很困惑 如果有人能解释这个 mov 语句如何操作寄存器值 我将非常感激 mov ebx eax 4
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 使用 MIPS 从 Big Endian 到 Little Endian 无需逻辑运算?

    我正在使用 MIPS QtSpim 将 32 位字从 Big Endian 转换为 Little Endian 我下面显示的内容已检查且正确 不过我想知道还有什么其他方法可以让我进行转换 我虽然只使用了旋转和移位 但如果没有逻辑运算 我就无
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • 如何编译GCC生成的asm?

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • GCC的sqrt()编译后如何工作?使用哪种root方法?牛顿-拉夫森?

    只是对标准感到好奇sqrt 来自 GCC 上的 math h 我自己编码的sqrt 使用牛顿拉夫森来做到这一点 是的 我知道 fsqrt 但CPU是如何做到这一点的呢 我无法调试硬件 现代 CPU 中的典型 div sqrt 硬件使用 2
  • LC3 LEA指令和存储的值

    我对这个问题感到困惑 指令后寄存器0中存储的值是多少 LEA R0 A 被处决了吗 为什么答案是x370C 我认为应该将A的地址加载到R0中 如果是这样我们怎么知道地址 有人可以帮忙吗 非常感谢 ORIG X3700 LEA R0 A LD
  • 错误 LNK2019:函数 main 中引用的外部符号无法解析

    我正在尝试在 C 中运行我的简单汇编代码 我只有两个文件 cpp 文件和 asm 文件 编译时出现错误 见下文 如果有人可以提供帮助 我将不胜感激 这是我的 main cpp 文件 include
  • 长多字节 NOP:通常理解的宏或其他符号

    x86 和 x86 64 处理器不仅具有单字节 这不是什么大秘密NOP指令 还包括各种类型的多字节类 NOP 指令 这些是我设法找到的 AMD 推荐 参考 AMD 系列 15h 处理器的 AMD 软件优化指南 文档 47414 http s
  • NASM 中的 equ 和 db 有什么区别?

    len equ 2 len db 2 它们是否相同 产生可以用来代替的标签2 如果不是 那么每种申报表的优点或缺点是什么 它们可以互换使用吗 第一个是equate 与 C 类似 define len 2 因为它实际上并没有在最终代码中分配任
  • 何时可以重用avx指令中的源寄存器

    在 avx 指令中用作源的寄存器何时可以在指令开始处理后重用 例如 我想使用vgatherdps该指令消耗两个 ymm 寄存器 其中之一是位移索引 我意识到vgatherdps由于数据的局部性较差 因此需要花费大量时间来收集 位移索引寄存器

随机推荐