DEV Community

http.dre
http.dre

Posted on

error: mismatch in operand sizes [pt-br]

Recentemente estava programando em assembly e me deparei com a seguinte situação:

Linha apontada pelo Nasm

mov edx, byte [ebx + ecx]
Enter fullscreen mode Exit fullscreen mode

Quando tentei compilar meu código usando o Nasm encontrei o seguinte erro: "error: mismatch in operand sizes".
Basicamente significa que estou tentando mover um valor incompatível com edx, vejamos que estou tentando mover o valor correspondente ao byte em "[ebx + ecx]", em que, ecx se refere a posição de ebx que estou acessando.

Vamos lembrar um conceito simples

Lembrando que estou compilando meu código utilizando a flag "-f elf32". O que significa que estou compilando para 32 bits

Um byte tem 8 bits certo? E edx é registrador de 32 bits, então o código deveria compilar e rodar, certo? Errado!

Quando se trata de armazenar valores, ao mover um valor para um registrador é necessário passar todos os bits que serão armazenados, e eis a questão, nós não temos todos. Para "extender" esse byte e fazer com que ele possa ser armazenado em edx, é necessário utilizar a instrução "movzx".

Mas como assim "extender"? A instrução movzx preenche os bits em branco com zero, convertendo para uma quantidade de bits maior.

Exemplo visual

Exemplo de um byte

01010101 ; 8 bits, um byte
Enter fullscreen mode Exit fullscreen mode

Após usar movzx

00000000-00000000-00000000-01010101 ; 32 bits
Enter fullscreen mode Exit fullscreen mode

Vejamos que movzx adiciona os bits faltando da esquerda para a direita, extendendo para 32 bits.
Para resolver o problema, basta alterar seu código substituindo mov por movzx quando necessário.

movzx edx, byte [ebx + ecx]
Enter fullscreen mode Exit fullscreen mode

Acessando somente o byte

Veja que o valor de edx pode ser diferente do valor do byte que foi movido, pois o byte movido foi extendido para ser colocado em edx. Para acessar somente esse byte é necessário acessar o registrador de 8 bits correspondente ao registrador utilizado para armazenar o byte extendido.

Registradores de edx

Vejamos que edx possui mais três registradores: dx de 16 bits, dh e dl de 8 bits. Lembra que o movzx preenche os bits da esquerda para a direita? Então o byte extendido que eu quero encontrar está em dl.

00000000-00000000-00000000-01010101
\---------------/ \------/ \------/
       dx            dh       dl
Enter fullscreen mode Exit fullscreen mode

Logo, caso eu queira utilizar o byte armazenado, basta eu acessá-lo diretamente em dl.

Agradecimentos

Fiz esse post com o objetivo de começar a publicar materiais sobre Assembly e linguagens de baixo nível em Português, com o objetivo de contribuir para a comunidade dev Brasileira.
Espero que esse post tenha te ajudado! Críticas construtivas são aceitas para melhorar essa postagem, então fique a vontade para comentar.

Top comments (0)