Casa > Q > Qual É A Diferença Entre As Instruções De Montagem Da Movq E Da Movl?

Qual é a diferença entre as instruções de montagem da movq e da movl?

Para cada instrução de montagem (por exemplo, mov, xchg, call, etc.) existem na verdade múltiplas instruções de máquina, dependendo do tipo de operandos.

So if you have:

  1. mov REGISTER, MEMORY 
  2. mov REGISTER, REGISTER 
  3. mov MEMORY, REGISTER 
  4. mov REGISTER, IMMEDIATE 
  5. mov MEMORY, IMMEDIATE 

For each of these 5 possibilities, there exists a separate machine code, even though in assembly they are all mov. É por isso que a programação assembly é muito mais fácil, não precisamos lembrar de todos esses detalhes e assembler cuida disso para nós.

Agora certas instruções (cerca de 50% delas) também suportam operandos de diferentes tamanhos. Por exemplo, você pode mover 4 bytes para 4 bytes, ou 8 bytes para 8 bytes, ou 2 bytes para 2 bytes, ou 1 byte para 1 byte. Isso já são 5 tamanhos (combinados com 5 tipos acima, resultando em 25 instruções totais de movimentação!).

Mas isso não é tudo! Você também pode mover 2 bytes em 4 bytes, 1 byte em 4 bytes, 1 byte em 2 bytes (mais alto), 1 byte em 2 bytes (mais baixo), 4 bytes em 8 bytes, 2 bytes em 8 bytes e finalmente, 1 byte em 8 bytes. Isso são mais 7 operações! No entanto, estas são apenas permitidas para registo, e são normalmente utilizadas para aceder a diferentes bytes de um registo. Assim, eles não compõem ainda mais a contagem de instruções.

Agora tudo isso está definido, a sintaxe AT&T Assembly requer que o programador defina dentro do nome da instrução quantos bytes ele quer mover, ao invés de deixá-la para o assembler deduzir.

Isso significa que se alguém quiser mover 4 bytes, tem que usar movl (mover longo, longo é tradicionalmente 4 bytes, curto é 2 bytes, byte é 1 byte, qword, ou seja, quad-word é 8 bytes), e usar movq para copiar 8 bytes.

De Hallsy

Qual é a diferença entre linguagem de máquina, linguagem de montagem e linguagem de alto nível em computadores? :: A linguagem Assembly é considerada uma linguagem de programação funcional?