sub modes instruction assembly x86 nasm accumulator addressing-mode

modes - sub instruction assembly



¿Por qué la instrucción mov tiene uso de hacha en lugar de dos registros de segmento directamente? (4)

No se puede mover el segmento de registro al registro de segmento, no hay instrucciones para ello.

Veo código como:

mov ax, cs mov ds, ax mov es, ax

¿Por qué no puedo simplemente comprimir esto para:

mov ds, cs mov es, cs

¿Es la primera manera más rápida ya que usa el registro del acumulador? Pero eso no parece intuitivo, ya que los cs y los ds son registros de segmentos. ¿O hay alguna restricción que desconozco?

Estoy usando Nasm por cierto.


Solo hay mucho espacio en un procesador para el microcódigo para todas sus instrucciones. Por lo tanto, a menudo se prefiere una instrucción general sobre varias de propósito especial para operaciones raramente utilizadas, registros de segmentos que cambian el lago. Además, para algunos procesadores el número de instrucciones está absolutamente limitado por la arquitectura; por ejemplo, el procesador 8080 original estaba limitado a 256 instrucciones, ya que todos tenían que codificar el código de operación en un solo byte.


No es realmente el lenguaje ensamblador, sino el lenguaje de máquina subyacente que previene estas operaciones.

Mientras que el ensamblaje se compone de palabras fáciles de leer o mnemotécnicas, en realidad representan bastante directamente los 1s y 0s del código máquina. En las CPU x86, cada instrucción se compone típicamente de una secuencia de bytes con bytes individuales o incluso bits dentro de los bytes que tienen significado. Ciertos bits representan la instrucción, otros representan el modo de direccionamiento . En los modos de direccionamiento de registros tales como los ejemplos, algunos bits representan los registros específicos que se utilizarán como fuente y destino de la instrucción mov .

Ahora la familia de procesadores x86 se remonta a la década de 1970 cuando la arquitectura de la CPU era más simple. En aquellos días, el concepto del acumulador era de vital importancia: ax es el acumulador x86 de 16 bits. Todos los cálculos se construyeron o "acumularon" en este registro, por lo que estaban disponibles para todas las instrucciones. Otros registros de propósito general tenían un rango de uso más restringido.

Debido a que las instrucciones se basaban en bytes, usted quería que hubiera pocos bytes para representar una instrucción lo más posible para mantener rápida la decodificación de la instrucción. Para mantener tantas instrucciones como sea posible, el uso del acumulador se hace central.

En CPUs más modernas como Motorola 680x0, los registros de propósito más general tienen más habilidades que antes eran el dominio del acumulador. En las CPU RISC, todos los registros son tan flexibles como los acumuladores. He oído que en el modo de 64 bits, el conjunto de instrucciones actual x86 / amd64 ahora es mucho menos restringido.


Consulte la Referencia del conjunto de instrucciones del Volumen 2 de Intel Manual - 325383-056SPLA "Instrucción" de la columna "MOV Move" de septiembre de 2015 .

El único mov de 16 bits para registros está codificado en:

mov r/m16, Sreg

Y "3.1.1.3 Columna de instrucciones en la tabla de resumen del código de operación" explica:

  • r / m16 - Un registro de propósito general de palabra o un operando de memoria utilizado para instrucciones cuyo atributo de tamaño de operando es de 16 bits. Los registros de propósito general de la palabra son: AX, CX, DX, BX, SP, BP, SI, DI.
  • Sreg - Un registro de segmento.

Por lo tanto, mov ds, cs no es codificable, ya que no hay mov Sreg, Sreg versión de mov Sreg, Sreg .