【发布时间】:2023-06-23 21:43:01
【问题描述】:
我最近开始学习从 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 的 HeapAlloc 的方式,但我不确定。 可以翻译成fallocate syscall 吗?
提前致谢
【问题讨论】:
-
您可以使用
.rept代替times或输入它。对于其他人,请阅读 at&t 内存引用语法。fallocate与HeapAlloc完全不同。 -
你真的需要 AT&T 语法吗?移植到gas的
.intel_syntax noprefix(与MASM非常相似)或NASM语法不是更容易吗?然后你只需要改变系统调用/ABI,而不是每条指令。 (参见*.com/tags/x86/info 获取汇编器手册的链接) -
手工很容易出错,我建议先用 MASM 组装,然后用
objdump -drwC反汇编,然后将指令和 cmets 移植到反汇编中。我认为 objdump 可以选择更接近于为汇编器输入做好准备,或者使用 Agner Fog 的 objconv 反汇编器,它确实可以生成可以再次汇编的输出。 -
有关 AT&T 语法的介绍,您可能想RTFM。
标签: assembly system-calls gnu-assembler att