将 AT&T 语法程序转换为 intel 语法

Posted

技术标签:

【中文标题】将 AT&T 语法程序转换为 intel 语法【英文标题】:Converting AT&T syntax program to intel syntax 【发布时间】:2015-12-02 09:13:35 【问题描述】:

原始代码产生以下输出:处理器供应商 ID 是“GenuineIntel” 这是原始代码:

1.         .section .data
2.   output:
3.         .ascii “The processor Vendor ID is ‘xxxxxxxxxxxx’\n”
4.         .section .text
5.         .globl _start
6.   _start:
7.         movl $0, %eax
8.         cpuid
9.         movl $output, %edi
11.        movl %ebx, 28(%edi)
12.        movl %edx, 32(%edi)
13.        movl %ecx, 36(%edi)
14         movl $4, %eax
15.        movl $1, %ebx
16.        movl $output, %ecx
17.        movl $42, %edx
18.        int $0x80
19.        movl $1, %eax
20.        movl $0, %ebx
21.        int $0x80

我的英特尔转换执行,但在代码组装后没有在屏幕上显示任何输出:

1.        .intel_syntax noprefix
2.         .section        .data
3.    output:
4.         .ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n"
5.         .section   .text
6.         .globl _start
7.    _start:
8.          mov     eax, 0
9.          cpuid
10.         mov     edi, OFFSET output
11.         mov     [edi+28], ebx
12.         mov     [edi+32], edx
13.         mov     [edi+36], ecx
14.         mov     eax, 4
15.         mov     ebx, 1
16.         mov     ecx, output
17.         mov     edx, 42
18.         int     0x80
19.         mov     eax, 1
20.         mov     ebx, 0
21.         int     0x80

【问题讨论】:

output 在哪里以及如何定义?您将第 9 行 movl $output, %edi 转换为 mov edi, OFFSET output,但另一方面,您将第 16 行 movl $output, %ecx 转换为 mov ecx, output。只有一个选择是正确的,但没有定义就无法确定哪一个。 nvm 我刚刚在英特尔代码的第 16 行添加了 OFFSET。 刚刚注意到我忽略了“输出”被定义为标签。但让我想知道的另一件事是:原始代码中的第 10 行在哪里?从 9 点直接到 11 点。有没有漏掉一行? 在这里与mov ecx, OFFSET output 合作。 原谅我的语义错误我已经被这个程序卡住了很长一段时间,所以我并没有真正注意我的编号,没有任何代码行丢失...... 【参考方案1】:

如果你的代码中没有 cmets,你可以先汇编,然后用其他语法反汇编。

如果有的话,移动 cmets 可能会也可能不会更容易/更不容易出错。这样做可能不方便保留全局符号名称,但一些反汇编程序可以利用符号表。

即使您决定手动执行此操作,您也可以通过组装 AT&T 和 NASM 版本来了解您是否犯了任何错误。如果这些二进制文件反汇编成相同的代码,那就太好了。如果不是,您应该快速找出它们不同的地方。

【讨论】:

以上是关于将 AT&T 语法程序转换为 intel 语法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 i386 上将“推 2000”从 AT&T asm 转换为 Intel 语法

如何将此代码从 Intel(nasm) 转换为 AT&T(gas) 语法?

AT&T 到 Intel 语法

x86 AT&T 语法程序集的注释语法

Linux下AT&T汇编语法格式与Intel汇编语法格式异同

是否可以在 Intel 语法中为 AMD 处理器编写 ASM 代码?