不只是 https://defuse.ca/online-x86-assembler.htm 这样奇怪:它只是在 .intel_syntax noprefix 模式下使用 GAS。
(所以你想要mov dword ptr [0x08048c5f], 0xdeadbeef 就像@Joachim 所说的那样)
但有趣的是,在 Intel 语法模式下,GNU 汇编器接受 movb 和 movw,但不接受 movl!!
但是,不将它们解释为 AT&T 语法。在 Intel 语法中,目标位于左侧,$0xdeadbeef 是一个有效的符号名称,因为它以 $ 开头,而不是数字。 GAS 的.intel_syntax 模式类似于 MASM,其中(类似于 AT&T 语法)一个裸符号名称是一个内存操作数。
令人惊讶的是movb 被接受为为mov 指定字节操作数大小,但是一旦我们超过了这一点,movb $0xdeadbeef, 0x08048c5f 就等同于mov byte ptr [label], 0x5f。 p>
请注意,0x08048c5f 常量(您打算作为目标地址)是直接源操作数。它被截断为 8 位。 GAS 对此发出警告,但在线汇编程序隐藏了可以帮助您找出这种怪异的警告。 :(
.intel_syntax noprefix
movb $0xdeadbeef, 0x08048c5f
movw $0xdeadbeef, 0x08048c5f
在我的 Linux 桌面上使用 as --version = GNU assembler (GNU Binutils) 2.31.1
$ 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'
尝试链接,并要求objdump 在.o 中显示带有-r 的重定位,明确表明$0xdeadbeef 被视为符号名称,与我使用@ 时没有什么不同改为 987654342@。
仅使用在线汇编器,要弄清楚这一点要困难得多,因为它只向您显示机器代码。目标地址的00 00 00 00 是您唯一可以知道发生了奇怪事情的线索。
我不知道为什么 movb 和 movw 被接受,但 movl 并不意味着双字操作数大小。
这可能是他们完全接受的 GAS 错误。