Это не просто https://defuse.ca/online-x86-assembler.htm вот так странно: он просто использует ГАЗ в режиме .intel_syntax noprefix
.
(Итак, вы хотите mov dword ptr [0x08048c5f], 0xdeadbeef
, как говорит @Joachim)
Но самое интересное здесь то, что ассемблер GNU принимает movb
и movw
, но не movl
в режиме синтаксиса Intel!!
Однако он не интерпретирует их как синтаксис AT&T. В синтаксисе Intel пункт назначения находится слева, а $0xdeadbeef
– допустимое имя символа, поскольку оно начинается с $
, а не с цифры. Режим .intel_syntax
GAS похож на MASM, где (как и в синтаксисе AT&T) простое имя символа является операндом в памяти.
Удивительно то, что movb
принимается в качестве указания размера операнда в байтах для mov
, но как только мы преодолеем это, movb $0xdeadbeef, 0x08048c5f
будет эквивалентно mov byte ptr [label], 0x5f
.
Обратите внимание, что константа 0x08048c5f
(которую вы хотели использовать в качестве адреса назначения) является непосредственным исходным операндом. И это усечено до 8 бит. GAS предупреждает об этом, но онлайн-ассемблер скрывает предупреждения, которые помогли бы вам разобраться в этой странности. :(
.intel_syntax noprefix
movb $0xdeadbeef, 0x08048c5f
movw $0xdeadbeef, 0x08048c5f
На моем рабочем столе 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: 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
показать перемещения с -r
в .o
, дайте понять, что это $0xdeadbeef
рассматривается как имя символа, такое же, как если бы я использовал вместо него my_label
.
С помощью только онлайн-ассемблера было бы намного сложнее понять это, потому что он показывает вам только машинный код. 00 00 00 00
для адреса назначения — ваш единственный признак того, что произошло что-то странное.
Я понятия не имею, почему принимаются movb и movw, но movl не подразумевает размер операнда двойного слова.
Вероятно, это ошибка GAS, что они вообще принимаются.
person
Peter Cordes
schedule
10.04.2019