Assembly defuse.ca在线气体汇编器接受AT&;movb和movw的T语法,但不是movl?

Assembly defuse.ca在线气体汇编器接受AT&;movb和movw的T语法,但不是movl?,assembly,x86,gnu-assembler,att,Assembly,X86,Gnu Assembler,Att,我正在使用将x86指令汇编成机器代码。(编者按:它在.intel\u语法noprefix模式下使用GAS。) 下面的代码抛出错误:没有这样的指令:`movl$0xdeadbeef,0x08048c5f' movl $0xdeadbeef,0x08048c5f 但是下面的汇编代码可以正常工作 movb $0xdeadbeef, 0x08048c5f movw $0xdeadbeef, 0x08048c5f 您似乎正在为movl使用AT&T语法,但您链接的页面表明它需要Intel语法 如果我正

我正在使用将x86指令汇编成机器代码。(编者按:它在
.intel\u语法noprefix
模式下使用GAS。)


下面的代码抛出
错误:没有这样的指令:`movl$0xdeadbeef,0x08048c5f'

movl $0xdeadbeef,0x08048c5f
但是下面的汇编代码可以正常工作

movb $0xdeadbeef, 0x08048c5f
movw $0xdeadbeef, 0x08048c5f

您似乎正在为movl使用AT&T语法,但您链接的页面表明它需要Intel语法

如果我正确理解你的意图,你想要的指令的正确语法是

MOV DWORD PTR ds:0x08048c5f, 0xdeadbeef
(在地址0x08048c5f处存储双字值0xdeadbeef)

不仅仅是这样奇怪:它只是在
.intel\u语法noprefix
模式下使用GAS

(所以你需要
mov-dword-ptr[0x08048c5f],0xdeadbeef


但有趣的是,GNU汇编程序在英特尔语法模式下接受
movb
movw
,但不接受
movl

然而,它并没有将它们解释为AT&T语法。在英特尔语法中,目标位于左侧,
$0xdeadbeef
是有效的符号名
,因为它以
$
开头,而不是数字。GAS的
.intel_syntax
模式类似于MASM,其中(类似于AT&T syntax)一个裸符号名是内存操作数

令人惊讶的是,
movb
被接受为指定
mov
的字节操作数大小,但一旦我们超过这个限制,
movb$0xdeadbeef,0x08048c5f
就相当于
mov byte ptr[label],0x5f

请注意,
0x08048c5f
常量(您打算用作目标地址)是直接源操作数。它被截断为8位。GAS对此发出警告,但在线汇编程序隐藏了这些警告,这些警告本可以帮助您了解这种奇怪现象(

在我的Linux桌面上,使用
as--version
=GNU汇编程序(GNU Binutils)2.31.1

$as-32 syntax.s-o syntax.o
as-32-o syntax.o syntax.s
syntax.s:汇编程序消息:
syntax.s:3:Warning:134515807缩短为95
syntax.s:4:Warning:134515807缩短为35935
$objdump-drwC-Matt syntax.o
syntax.o:文件格式elf32-i386
第节的分解。正文:
00000000 :
0:C605005F movb$0x5f,0x02:R_386_32$0x5f
7:66 c7 05 00 00 5f 8c movw$0x8c5f,0x0 a:R_386_32$0x0
$ld-melf_i386 syntax.o
ld:警告:找不到输入符号_start;默认为000000000 8049000
ld:syntax.o:(.text+0x2):对“$0xdeadbeef”的未定义引用
ld:syntax.o:(.text+0xa):对“$0xdeadbeef”的未定义引用
尝试链接,并要求
objdump
.o
中显示带
-r
的重定位,明确说明
$0xdeadbeef
被视为一个符号名,与我使用
我的_标签
没有什么不同

如果只使用在线汇编程序,就很难弄清楚这一点,因为它只显示机器代码。目标地址的
00
是发生奇怪事情的唯一线索


我不知道为什么接受movb和movw,但movl并不意味着dword操作数大小。


它们被完全接受可能是一个GAS bug。

执行代码时没有出现错误;尝试汇编/编译代码时可能会出现错误。显示更多源代码。听起来可能使用了错误的汇编程序/编译器。提供更多信息。x86有不同的移动指令字节、双字节、四字节和8字节。您必须告诉汇编程序一些信息,以便它知道目标大小以及选择的指令。特定汇编程序的“movb”似乎表示“移动字节”,同样表示“movw”。“mov”显然对您的特定汇编器没有任何意义。在询问有关此特定主题的任何问题之前,请阅读汇编器手册。阅读您的汇编器手册?非常奇怪。它接受AT&T语法的
movb
movw
,但不接受
movl
.intel_syntax noprefix

movb $0xdeadbeef, 0x08048c5f
movw $0xdeadbeef, 0x08048c5f
$ as -32 syntax.s -o syntax.o
as -32 -o syntax.o syntax.s 
syntax.s: Assembler messages:
syntax.s:3: Warning: 134515807 shortened to 95
syntax.s:4: Warning: 134515807 shortened to 35935

$ objdump -drwC -Matt syntax.o 

syntax.o:     file format elf32-i386


Disassembly of section .text:

00000000 <.text>:
   0:   c6 05 00 00 00 00 5f    movb   $0x5f,0x0        2: R_386_32     $0xdeadbeef
   7:   66 c7 05 00 00 00 00 5f 8c      movw   $0x8c5f,0x0      a: R_386_32     $0xdeadbeef

$ ld -melf_i386 syntax.o 
ld: warning: cannot find entry symbol _start; defaulting to 0000000008049000
ld: syntax.o:(.text+0x2): undefined reference to `$0xdeadbeef'
ld: syntax.o:(.text+0xa): undefined reference to `$0xdeadbeef'