AT&T 到 Intel 语法

Posted

技术标签:

【中文标题】AT&T 到 Intel 语法【英文标题】:AT&T to Intel Syntax 【发布时间】:2014-04-06 00:42:15 【问题描述】:

我想将以下几行从 AT&T 翻译成 Intel (nasm):

这是我的 AT&T 代码:

   .equ BUFFEREND, 1
   .lcomm buffer, BUFFEREND
    cmpb $97, buffer

这是我的英特尔代码:

   BUFFEREND EQU 1
   buffer db BUFFEREND
   cmp BYTE [buffer], 97

我的翻译有什么问题?我有以下代码中的行。 AT&T 代码有效。它将一个文件中的所有小写字符转换为大写字符并将其保存在一个新文件中。 :

.global _start

.equ BUFFEREND, 1
.lcomm buffer, BUFFEREND

_start:

movl %esp, %ebp

movl $5, %eax
movl 8(%ebp), %ebx
movl $0, %ecx
int $0x80

pushl %eax

movl $5, %eax
movl 12(%ebp), %ebx
movl $03101, %ecx
movl $0666, %edx
int $128

pushl %eax

loop:
movl -4(%ebp), %ebx
movl $3, %eax
movl $buffer, %ecx
movl $BUFFEREND, %edx
int $128

pushl %eax

cmpb $97, buffer
jl next_byte
cmpb $122, buffer
jg next_byte

subb $32, buffer

next_byte:

movl %eax, %edx
movl $4, %eax
movl -8(%ebp), %ebx
movl $buffer, %ecx
int $0x80

popl %eax

cmpl $BUFFEREND, %eax
jne loopexit

jmp loop

loopexit:
movl $1, %eax
movl $0, %ebx
int $0x80

确切的问题是我的英特尔文件没有创建输出文件

【问题讨论】:

【参考方案1】:

.lcomm.bss 部分中创建一个给定大小的零初始化变量。因此,您的buffer db BUFFEREND 应该根据您的汇编程序的语法进行相应的修改。不幸的是,您忘记指定使用哪一个。对于nasm,等价的可能是:

section .bss
buffer resb BUFFEREND

你也忘了提到确切的问题是什么。

【讨论】:

抱歉,我使用 nasm 表示英特尔,as 表示 AT&T 语法 检查第二次打开的参数。我认为它们应该是八进制的? mov ecx, 3031q 代表 Nasm?

以上是关于AT&T 到 Intel 语法的主要内容,如果未能解决你的问题,请参考以下文章

将 AT&T 转换为 INTEL 语法

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

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

在 TextMate 中突出显示 Intel 和 AT&T 汇编语法

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

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