Pregunta

En la escuela hemos estado programando en lenguaje ensamblador MIPS por algún tiempo. Estoy interesado en profundizar en el ensamblaje x86 y he oído que es algo más difícil (incluso mi libro de texto MIPS dice esto).

¿Qué información central debo saber como programador de MIPS antes de sumergirme en el mundo x86?

¿Fue útil?

Solución

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

  • Pocos registros de propósito general, y los que tiene no son GP puro; muchas instrucciones requieren que use ciertos registros para un propósito específico.
  • Las instrucciones
  • x86 son de dos códigos de operación en lugar de tres códigos de operación, lo que puede hacer que ciertas operaciones sean más complejas. Es decir, en lugar de agregar r0, r1, r2 (r0 = r1 + r2), agrega eax, ebx (eax + = ebx).
  • Los segmentos en modo protegido (todo el código de 32 bits fuera de DOS, efectivamente) hacen que su esquema de direccionamiento de memoria sea extremadamente obvio, lo que puede morderle el culo cuando esté comenzando.
  • Vas a buscar las banderas establecidas / borradas por instrucciones todo el tiempo. Aprenda a amar los manuales de Intel.
  • Editar, 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 dificultar las manipulaciones de seguimiento a sus registros. Sea cuidadoso y comente generosamente hasta que las cosas estén mal.

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

Otros consejos

x86 tiene un conjunto muy limitado de registros disponibles en comparación con la mayoría de las otras 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 el código en la práctica.

Además, debido al historial x86 de fuerte compatibilidad con versiones anteriores, el conjunto de instrucciones no es terriblemente simétrico (definitivamente anterior a RISC) y puede haber muchas excepciones a los casos de reglas y esquinas a los que prestar atención.

x86 tiene instrucciones más complejas que MIPS. Por lo tanto, es probable que haya una sola instrucción para secuencias comunes en MIPS (especialmente el direccionamiento de memoria). La falta de numerosos registros es ciertamente una desventaja, pero en ambas arquitecturas hay convenciones que restringen el número de lo que puede usar libremente hasta 4-5. Solo más pronunciado en x86. x86 tiene más excepciones para el uso del registro que MIPS que debe tener en cuenta, pero no vale la pena quejarse constantemente.

Hablando por experiencia, cualquiera de los dos idiomas tiene la misma dificultad para aprender, incluidas las convenciones. Quizás x86 sea un poco más fácil, considerando los abundantes recursos en línea y su popularidad.

La parte difícil de x86 es generar binarios, debido a sus instrucciones de longitud variable y varios modos de direccionamiento. En la mayoría de los casos, nunca es necesario hacerlo de todos modos.

Sin duda, puedo recomendarle que aprenda una arquitectura de instrucción más compleja que MIPS.

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

He estado aprendiendo x86 y x86_64 a escribir un ensamblador yo mismo. Si no va a escribir un ensamblador usted mismo, algo de lo que diré es bastante inútil. Sin embargo, no sé nada sobre MIPS.

El direccionamiento indirecto x86 es una cosa compleja. En una sola instrucción, puede hacer esto:

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 de esta manera. Es posible que desee leer esto de sandpile.org . Si quieres saber más sobre codificación, siempre puedes preguntarme. Otra instrucción que codifica detalles molestos relacionados son los prefijos. Cambian mucho el significado de la instrucción. Por ejemplo, 0x66 (si no recuerdo mal) al frente y algunas instrucciones son para 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 los pocos registros de propósito general que existen, esto obligará a la mayoría del software a usarlo más o menos de una manera apilada. Un detalle doloroso. rsp se usa para la pila (pop, push -instructions), y rbp también suele reservarse. x86_64 tiene más registros, pero llevará 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 anterior maneja los registros como una pila. Simplemente no tiene intercambio, pellizco o podredumbre, por lo que trabajar con él es alucinante.

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

Los saltos directos y las llamadas parecen ser relativas a la siguiente instrucción en x86. Por lo tanto:

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

Termina codificado en 'JMP imm: 0, NOP'. El jmp de registro indirecto que hace saltos absolutos. También es bueno notar que no hay saltos condicionales indirectos de registro, también me molestó.

Esto no es todo lo que debes saber, pero lo primero que me viene a la mente es tu pregunta. Pero quizás pueda llevarse bien con estos por ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top