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)

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay