Ассемблер GNU выдает неожиданный операнд памяти при сборке синтаксического кода Intel.
Я свел свою ошибку к одной-единственной строке кода, и последние три дня я пробовал что-нибудь, чтобы понять, почему ассемблер GNU дает то, чего я не могу понять. Я знаю, что это должно (или должно быть) быть тривиальным, но я в растерянности.
Следующий текст находился в файле code.asm:
.intel_syntax noprefix
.global somecode
somecode:
int 3
mov rax,qword [rcx]
ret
.att_syntax
Сборка и дизассемблирование code.asm с помощью:
as code.asm -o code1.obj -64
objdump -Mintel -d code1.obj > code1.asm
Содержимое code1.asm (с дизассемблированным кодом):
code1.obj: file format pe-x86-64
Disassembly of section .text:
0000000000000000 <somecode>:
0: cc int3
1: 48 8b 41 08 mov rax,QWORD PTR [rcx+0x8]
5: c3 ret
Я использую ассемблер GNU (GNU Binutils) 2.25 (`x86_64-pc-cygwin ').
Вопрос: почему в операнде памяти QWORD PTR [rcx + 0x8] есть дополнительное смещение на одно qword (8 байтов)? Я ожидаю mov rax, QWORD PTR [rcx].
Я, должно быть, делаю что-то не так. Я перепроверил с другим уважаемым ассемблером Yasm и выполнил:
yasm -f x64 -o code2.obj --parser=gas code.asm
objdump -Mintel -d code2.obj > code2.asm
Содержимое code2.asm:
code2.obj: file format pe-x86-64
Disassembly of section .text:
0000000000000000 <somecode>:
0: cd 03 int 0x3
2: 48 8b 01 mov rax,QWORD PTR [rcx]
5: c3 ret
Что касается операнда памяти, это то, что я ожидал. Как я могу проинструктировать GNU сделать то же самое?
qword
вместоqword ptr
- синтаксис NASM. GAS, к сожалению, не ошибается и имеет этот режим отказа, потому что он допускает123[reg]
в качестве синтаксиса адреса. Я думаю, что есть также некоторые вопросы и ответы о самом MASM, в котором простоdword
является константой4
, что также кажется ужасным. Специально для MASM в нем есть такие ключевые слова, какtypeof
, чтобы преобразовать имя типа в размер дляadd edi, typeof foo
. Плохой дизайн ИМО. - person Peter Cordes   schedule 30.06.2021