2009-01-17 14 views
11

En la escuela, llevamos tiempo programando en lenguaje ensamblador MIPS. Estoy interesado en ahondar en el ensamblaje x86 y he oído que es un poco más difícil (incluso mi libro de texto MIPS dice esto).¿Qué debería saber al cambiar de MIPS a ensamblaje x86?

¿Qué información básica debo conocer como programador MIPS antes de realizar la inmersión en el mundo x86?

Respuesta

14

las cosas más importantes a tener en cuenta son:

  • pocos registros de propósito general, y de los que usted tiene no son pura GP - muchas instrucciones que requieren el uso de ciertos registros para un propósito específico.
  • Las instrucciones de x86 son dos formas de código de operación en lugar de código de tres operaciones que pueden hacer que ciertas operaciones sean más complejas. Es decir, en lugar de agregar r0, r1, r2 (r0 = r1 + r2), usted agrega eax, ebx (eax + = ebx).
  • Segmentos en modo protegido (todos los códigos de 32 bits fuera de DOS, de manera efectiva) hacen que su esquema de direccionamiento de memoria sea extremadamente no obvio, lo que puede morderle el culo cuando está empezando.
  • Vas a buscar las banderas establecidas/borradas por instrucciones todo el tiempo. Aprende a amar los manuales de Intel.
  • Edición, una cosa que olvidé: el uso de subregistros (por ejemplo, ah para acceder a los 8 bits altos de los 16 bits bajos del registro eax) puede hacer que las manipulaciones de seguimiento de sus registros sean muy difíciles. Tenga cuidado y comente generosamente hasta que baje las cosas.

Aparte de eso, x86 es bastante directo. Cuando aprendes a abusar de instrucciones como 'lea' y 'test', aprendes a amarlo. Además, protip: Intel le enviará copias de los manuales del juego de instrucciones de forma gratuita, ni siquiera tendrá que pagar por el envío. Mire en su sitio el correo electrónico de cumplimiento y solicite los libros por SKU.

+0

Puede solicitar el CD [aquí] (https://secure.hibbertgroup.com/intel/spm?programId=1). La copia impresa, lamentablemente, ya no se ofrece. – new123456

+1

La arqueología entiende mejor el conjunto de instrucciones x86. Si ha visto lo que tiene un 8080, cómo informa vagamente el diseño de un 8088, y finalmente cómo el 386 agregó cosas encima, todo tiene sentido. De lo contrario, las reglas parecen un poco arbitrarias. – ijw

5

x86 tiene un conjunto muy limitado de registros disponibles en comparación con la mayoría de las demás arquitecturas. Esto realmente no hace que el lenguaje ensamblador sea más difícil de aprender, pero a veces hace que sea más difícil implementar código en la práctica.

Además, debido a la gran compatibilidad con versiones anteriores de x86, el conjunto de instrucciones no es muy simétrico (definitivamente previo a RISC) y puede haber muchas excepciones a la regla y casos de esquina a los que prestar atención.

+0

Sí, pero no es tan limitado en comparación con MIPS. :) – BobbyShaftoe

+3

@BobbyShaftoe, ¿eres un programador de montaje? MIPS tiene 32 registros de propósito general y x86 tiene 8 por lo que sé. – mmcdole

1

x86 tienen instrucciones más complejas que MIPS. Por lo tanto, probablemente haya una sola instrucción para secuencias comunes en MIPS (el más notable es el direccionamiento de memoria). La falta de numerosos registros es ciertamente una desventaja, pero en ambas arquitecturas hay convenciones que prácticamente restringen el número de lo que puede usar libremente hasta 4-5. Simplemente más pronunciado en x86. x86 tiene más excepciones para el uso de registros que los MIPS que debe tener en cuenta, pero no hay nada por lo que valga la pena quejarse constantemente.

Hablando por experiencia, cualquier idioma tiene aproximadamente la misma dificultad para aprender, convenciones incluidas. Tal vez x86 es un poco más fácil, teniendo en cuenta los abundantes recursos en línea y su popularidad.

La parte difícil de x86 es la generación de binarios, debido a sus instrucciones de longitud variable y varios modos de direccionamiento. Muy a menudo, nunca necesitas hacerlo de todos modos.

Definitivamente, puedo recomendarle que aprenda una arquitectura de instrucciones más compleja que MIPS.

Y, esto es importante, no seas parte de la guerra religiosa entre RISC v.s. CISC ...

1

He estado aprendiendo x86 y x86_64 para escribir un ensamblador yo mismo. Si no va a escribir un ensamblador usted mismo, entonces algo de lo que contaré es bastante inútil. Aunque yo no sé sobre MIPS.

x86 direccionamiento indirecto es una cosa compleja. En una sola instrucción, puede hacerlo siguientes:

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

Su codificación de instrucciones es compleja debido a esto, pero es consistente para cada instrucción que codifica esta manera. Es posible que desee leer esto en sandpile.org. Si quieres saber más sobre la codificación, siempre puedes preguntar sobre esto. Otra instrucción que codifica detalles molestos relacionados son los prefijos. Cambian mucho el significado de la instrucción. Por ejemplo, 0x66 (si mal no recuerdo) al frente y algunas instrucciones se convierten en GPR de 16 bits en lugar de 32 bits.

GPR de 32 bits (en orden): EAX, ECx, EDX, EBX, esp, ebp, ESI, EDI

GPR de 64 bits: rax, RCX, RDX, rbx, RSP, RBP, RSI, RDI, r8 , r9, r10, r11, r12, r13, r14, r15

Observe cuán pocos registros de propósito general hay, esto forzará a la mayoría de los programas a usarlo más o menos de una manera apta para la máquina de pila. Un detalle doloroso rsp se usa para la pila (instrucciones pop, push) y rbp tiende a reservarse también. x86_64 tiene más registros, pero tomará tiempo cuando las personas lo adopten, incluso si cada uno de los consumidores tuviera un procesador capaz de hacerlo.

Hay dos conjuntos de instrucciones diferentes para la aritmética de coma flotante. XMM es el más nuevo. En x86_64 hay 16 registros de 128 bits disponibles y en x86 solo hay 8 de ellos. El conjunto de instrucciones más antiguo maneja los registros como una pila. Simplemente no tiene intercambio, mordisco ni podredumbre, por lo que trabajar con él es alucinante.

En uso x86 tiende a reducirse a una máquina RISC. Algunas de esas instrucciones complejas no brindan beneficios o son incluso más lentas en las máquinas más nuevas. Lo hará con la comprensión de 30-150 instrucciones dependiendo de lo que está leyendo o escribiendo. También puede ignorar por completo algunas instrucciones antiguas y AL/HL -stuff. Tenga en cuenta todos los orígenes de este desorden detrás de 1978, que es bastante sorprendente, no es peor, 31 años después de eso y 24 años desde la primera presentación de IA-32. Muchas cosas cambian su relevancia en ese momento.

Los saltos directos y las llamadas parecen ser relativas a las siguientes instrucciones en x86. Por lo tanto:

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

termina codificada a 'JMP imm: 0, NOP'. El jmp de registro indirecto que sí hace saltos absolutos. También es bueno notar que no hay saltos condicionales de registro indirecto, también me molestó.

Esto no es todo lo que debe saber, pero lo primero que me viene a la mente es su pregunta. Pero tal vez te puedas llevar bien con esto por ahora.

Cuestiones relacionadas