error: mismatch in operand sizes [pt-br]
http.dre
Posted on April 29, 2024
Recentemente estava programando em assembly e me deparei com a seguinte situação:
Linha apontada pelo Nasm
mov edx, byte [ebx + ecx]
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
Após usar movzx
00000000-00000000-00000000-01010101 ; 32 bits
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]
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.
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
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.
Posted on April 29, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.