Почему этот компилятор выдает ошибку GCC при переводе в NASM? - PullRequest
0 голосов
/ 06 июня 2018

Я немного поигрался с выводом сборки GCC, попробовав его с быстрым целочисленным средним.Вот код C, который я использовал изначально:

unsigned int average (unsigned int x, unsigned int y) {
    return (x&y)+((x^y)>>1);
}

Вот сборка, которую он испустил (используя синтаксис Intel):

average:
  mov edx, edi
  and edi, esi
  xor edx, esi
  shr edx
  lea eax, [rdx+rdi]
  ret

Когда я перевел его для NASM:

average:
    mov edx, edi
    and edi, esi
    xor edx, esi
    shr edx, 1
    lea eax, [rdx+rdi]
    ret

Он жалуется на эту ошибку, в строке с lea:

<source>:6: error: impossible combination of address sizes
<source>:6: error: invalid effective address

Я не супер , знакомый со сборкой, но это кажется супер странным.Может ли кто-нибудь объяснить мне, что, черт возьми, здесь происходит?

1 Ответ

0 голосов
/ 06 июня 2018

Сообщение об ошибке вводит в заблуждение.Причиной этой ошибки является то, что nasm пытается собрать ваш код как 16- или 32-битный код, оба из которых не поддерживают 64-битные регистры.Чтобы решить эту проблему, вызовите nasm с параметрами, которые заставляют его собирать 64-битный код, например, в Linux:

nasm -f elf64 source.asm

или в Windows:

nasm -f win64 source.asm
...