Ассемблер GNU дает неожиданный операнд памяти

Ассемблер 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 сделать то же самое?


person HJLebbink    schedule 07.05.2015    source источник
comment
qword вместо qword ptr - синтаксис NASM. GAS, к сожалению, не ошибается и имеет этот режим отказа, потому что он допускает 123[reg] в качестве синтаксиса адреса. Я думаю, что есть также некоторые вопросы и ответы о самом MASM, в котором просто dword является константой 4, что также кажется ужасным. Специально для MASM в нем есть такие ключевые слова, как typeof, чтобы преобразовать имя типа в размер для add edi, typeof foo. Плохой дизайн ИМО.   -  person Peter Cordes    schedule 30.06.2021


Ответы (1)


Вам нужно написать mov rax, qword ptr [rcx]. Видимо qword само рассасывается до размера, т.е. 8, поэтому ваш код собран как mov rax, 8[rcx]. Действительно, mov rax, qword тоже собирается как mov rax, 8.

Забавно, как ваша «перекрестная проверка» использовала правильный синтаксис :)

person Jester    schedule 07.05.2015
comment
Гениально просто, это имеет смысл и работает, спасибо. Это настоящий магнит для насекомых. Должно быть какое-то предупреждение ... - person HJLebbink; 07.05.2015