将 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) 语法?