Pergunta

Na escola temos sido programação em MIPS linguagem assembly por algum tempo. Estou interessado em se aprofundar em x86 montagem e ouvi dizer que é um pouco mais difícil (mesmo meus MIPS livro diz isso).

Que informações núcleo deve Sei como programador MIPS antes de fazer o mergulho no mundo do x86?

Foi útil?

Solução

As maiores coisas para manter em mente são:

  • Poucos registos de uso geral, e os que você tem não são pura GP - muitas instruções exigem o uso de certos registros para uma finalidade específica
  • .
  • x86 instruções são forma de dois código de operação em vez de três código de operação que pode fazer certas operações mais complexas. Ou seja, em vez de add r0, R1, R2 (R0 = R1 + R2), você faz add eax, ebx (eax + = ebx).
  • Os segmentos em modo protegido (todos fora de código de 32 bits do DOS, de forma eficaz) fazer a sua memória esquema de endereçamento extremamente não óbvio, que pode morder-lhe no rabo quando você está começando.
  • Você vai estar olhando para cima as bandeiras SET / apuradas por instruções o tempo todo. Aprenda a amar os manuais Intel.
  • Editar, uma coisa que eu esqueci: O uso de subregisters (por exemplo ah Para acessar a alta de 8 bits dos baixos 16-bits do registo eax) pode fazer rastreamento manipulações para seus registros muito difícil. Tenha cuidado e comentar livremente até chegar as coisas.

Além disso, x86 é bastante simples. Quando você aprende a abusar de instruções como 'lea' e 'teste', você aprende a amá-lo. Além disso, Protip: Intel irá enviar-lhe cópias dos manuais conjunto de instruções de graça, nem sequer têm que pagar pelo transporte. Olhe em torno de seu site para o e-mail realização e solicitar os livros por SKU.

Outras dicas

x86 tem um conjunto muito limitado de registros disponíveis em comparação com a maioria das outras arquiteturas. Isto realmente não faz a linguagem de montagem mais difícil de aprender, mas por vezes torna mais difícil de implementar o código na prática.

Além disso, por causa da história x86 de forte compatibilidade com versões anteriores, o conjunto de instruções não é muito simétrica (definitivamente pré-RISC) e pode haver muitas exceções à regra e canto casos a prestar atenção.

x86 tem instruções mais complexas do que MIPS. Portanto, há, provavelmente, uma única instrução para sequências comuns em MIPS (endereçamento de memória mais notavelmente). Falta de numerosos registros são certamente uma desvantagem, mas em ambas as arquiteturas existem convenções que praticamente restringe o número de que você pode usar livremente para baixo para 4-5. Só mais pronunciado em x86. x86 tem mais exceções para o uso do registo de MIPS que você tem que manter em mente, mas nada vale a pena lamentar-se sobre constantemente.

Falando da experiência, uma ou outra língua tem aproximadamente a mesma dificuldade para aprender, convenções incluído. Talvez x86 é um pouco mais fácil, considerando recursos online abundantes e sua popularidade.

A parte difícil sobre x86 é geradora de binário, por causa de suas instruções de comprimento variável e vários modos de endereçamento. Na maioria das vezes, você não precisar fazer isso de qualquer maneira.

Eu posso certamente recomendo que você aprender uma arquitetura de instrução mais complexa do MIPS.

E, isso é importante, não ser uma parte da guerra religiosa entre RISC V.S. CISC ...

Fui aprendendo x86 e x86_64 para escrever um montador mim. Se você não está indo para escrever um montador-se, em seguida, algumas das coisas que eu vou dizer é praticamente inútil. Eu não sei sobre MIPS me embora.

x86 endereçamento indireto é uma coisa complexa. Em uma única instrução, você pode fazer estes:

mov reg, [reg+offset]
mov reg, [reg*scale+base register+offset] # in where scale can be 1, 2, 4 or 8.

A codificação de instrução é complexa por causa disso, mas é consistente para cada instrução que codifica desta forma. Você pode estar querendo ler este de sandpile.org . Se você quiser saber mais sobre a codificação, você pode sempre perguntar sobre isso de mim. Outra codificação de instrução relacionada detalhe irritante são os prefixos. Eles mudar o significado da instrução muito. Por exemplo, 0x66 (se bem me lembro) na frente e algumas instruções tornar-se para GPRS 16bit em vez de os de 32 bits.

GPRs de 32 bits (em ordem): eax, ecx, EDX, EBX, esp, ebp, ESI, edi

GPRs de 64 bits: rax, rcx, RDX, rbx, rsp, rbp, rsi, idi, r8, R9, R10, R11, R12, R13, R14, R15

Observe como registradores de propósito geral há poucos, isso vai forçar a maioria dos softwares de usá-lo mais ou menos em uma maneira educada pilha-máquina. Um detalhe doloroso. RSP é usado para a pilha (pop, -instruções de pressão), e RBP tende a ser reservados bem. x86_64 tem mais registos, mas vai levar tempo, quando as pessoas vão adotá-lo, mesmo se cada dos consumidores tinha um processador capaz a ele.

Há dois conjuntos de instruções diferentes para aritmética de ponto flutuante. XMM sendo o mais recente. Em x86_64 há 16 128 bits registros disponíveis e em x86 há apenas 8 deles. A instrução mais velho definir alças registros como uma pilha. Você simplesmente não tem swap, nip ou podridão, de modo a trabalhar com ele é alucinante.

Em uso x 86 tende a reduzir numa máquina RISC. Algumas dessas instruções complexas não dão benefícios ou são ainda mais lento em máquinas mais recentes. Você vai ver com a compreensão sobre 30-150 instruções, dependendo sobre o que você está lendo ou escrevendo. Você também pode ignorar completamente algumas instruções antigos e AL / HL -stuff. Tenha em mente que este todas as origens desordem por trás 1978, o que é bastante surpreendente não é pior, 31 anos a partir dessa e 24 anos desde a primeira introdução de IA-32. Muitas coisas mudar sua relevância nesse tempo.

Direto saltos e chamadas parecem ser relativo a partir da próxima instrução em x86. Portanto:

    jmp nowhere  # or call, jz, jg whatever...
nowhere:
    nop

acaba codificado para 'JMP imm: 0, NOP'. A JMP registo-indireto que faz fazer saltos absolutos. Também é bom notar que há não registrar-indireta saltos condicionais, isso me incomodou muito.

Aqui não é tudo possível, você deve saber, mas primeira coisa que vem à minha mente de sua pergunta. Mas talvez você pode obter junto com estes para agora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top