Red de conocimientos sobre prescripción popular - Colección de remedios caseros - Acerca de las instrucciones de suma, resta, multiplicación y división en lenguaje ensamblador de Wang Shuang

Acerca de las instrucciones de suma, resta, multiplicación y división en lenguaje ensamblador de Wang Shuang

Instrucciones de operaciones aritméticas de ensamblaje

Las instrucciones de operaciones aritméticas del 8086 pueden sumar, restar, multiplicar y dividir números binarios o decimales (código BCD). La forma de datos de los operandos puede ser Is. un número de 8 o 16 bits con o sin signo. Para instrucciones de un solo operando, no se permite la forma inmediata; para instrucciones de doble operando, solo la operación fuente puede usar números inmediatos y uno de los dos operandos debe estar en un registro.

1. Formato de instrucción de instrucción de suma: Suma ADD DST, SRC (DST) ← (SRC) + (DST)

Suma con acarreo ADC DST, SRC (DST); (SRC) + (DST) + CF

Agregar 1 INC OPR (OPR) ← (OPR) + 1

Nota: Los resultados de estas tres instrucciones afectarán el indicador de estado. bit, pero la instrucción INC no afecta la bandera CF. A continuación se toma la operación de suma de 8 dígitos como ejemplo para una breve explicación. [Ejemplo 4.20] Debido a que el resultado de la operación no excede el rango de números sin signo de un solo byte, CF = 0; 1. Las operaciones anteriores se pueden implementar con dos instrucciones: MOV AH, 01 ADD AH, 7FH

La instrucción ADC se utiliza principalmente para operaciones de suma de datos de múltiples bytes o de precisión múltiple. Por ejemplo, al agregar dos conjuntos de números de cuatro bytes (doble precisión) 1122 3344H y 5566 7788H, el uso de una instrucción de suma de un solo byte requiere realizar 4 operaciones de suma. Durante la operación, la instrucción ADC se usa para agregar los números de baja precisión. Los datos de bytes generados por la operación se agregan al byte de orden superior y, utilizando la instrucción de suma de palabras, solo es necesario realizar dos operaciones de suma. Por supuesto, el acarreo generado por la operación de byte de orden inferior también debe realizarse. procesado a través de la instrucción ADC. Para utilizar la instrucción ADC, el indicador CF debe establecerse en 0 primero. 2. Instrucción de resta

Formato de instrucción:

Resta SUB DST, SRC (DST) ← (DST); - (SRC)

Resta con acarreo SBB DST, SRC; (DST)←(DST)-(SRC)-CF

Restar 1 DEC OPR (OPR)←(OPR; )-1

Complemento NEG OPR (OPR)←0FFFFH-(0PR)+1

Comparar CMP OPR1, OPR2 (OPR1)-(OPR2)

SBB La instrucción se utiliza principalmente para la operación de resta de datos de múltiples bytes o de precisión múltiple; la instrucción NEG realiza la operación de invertir el operando y suma 1; la instrucción CMP realiza la operación de resta similar a la instrucción SUB; no produce el resultado de la operación. El impacto en los bits de bandera se muestra en la tabla 4.3. Todos los resultados de operación de estas instrucciones afectan el bit del indicador de estado, pero la instrucción DEC no afecta el indicador CF.

[Ejemplo 4.22]

El resultado de la resta directa es: (4006AH)=520FH, SF=0, ZF=0, CF=0, OF=0

El resultado de la fórmula de suma en complemento a dos es: (4006AH) = 520FH, SF=0, ZF=0, CF=1, OF=0

En la fórmula, FECAH es el complemento de (-0136H).

Se puede ver que los resultados de los dos cálculos son los mismos, pero el impacto en la bandera CF es diferente. Debido a que es una operación de resta, el resultado correcto debe ser CF=0. Utilice la suma de complemento para obtener el resultado de la operación CF=1, que debe invertirse y luego enviarse a CF.

Tabla 4-3 El impacto de las instrucciones CMP en los indicadores de estado

3. Instrucciones de multiplicación Las operaciones de multiplicación se dividen en operaciones con números sin signo y operaciones con números con signo, cada una con sus correspondientes instrucciones y utilizando operandos dobles. Cuando se multiplican dos números binarios de 8 bits, el producto es un número binario de 16 bits; cuando se multiplican dos números binarios de 16 bits, el producto es un número binario de 32 bits. Formato de instrucción:

Multiplicación de números sin signo MUL SRC (AX) ← (AL) × (SRC) Multiplicación de 8 dígitos

(DX, AX) ← (AX) × ( SRC; ) Multiplicación de 16 bits

Multiplicación con signo IMUL SRC; la operación es la misma que la anterior, pero el operando es un número con signo

Nota:

Realizar byte operaciones Al realizar operaciones de palabra, el operando de destino debe ser el acumulador AL y el producto está en el registro AX; al realizar operaciones de palabra, el operando de destino debe ser el acumulador AX y el producto está en los registros DX y AX; No se permite el direccionamiento inmediato para el operando de origen.

El resultado de la instrucción de multiplicación solo afecta a los indicadores de estado CF y OF, y no tiene ningún efecto sobre otros indicadores de estado (el estado es incierto).

Para la instrucción MUL, si el producto de la multiplicación de datos de bytes (AH) = 0 o el producto de la multiplicación de datos de palabras (DX) = 0, entonces CF=OF=0, de lo contrario CF=OF= 1 Para la instrucción IMUL, si el contenido del producto de los datos del byte AH o el producto de los datos de la palabra DX es la mitad inferior de la extensión del signo, entonces CF=OF=0; de lo contrario, CF=OF=1.

4. Instrucciones de división Las operaciones de división se dividen en operaciones con números sin signo y operaciones con números con signo, cada una con sus correspondientes instrucciones y utilizando operandos dobles. Cuando el divisor es un número binario de 8 o 16 bits, se requiere que el dividendo sea un número binario de 16 o 32 bits. Formato de instrucción:

División de números sin signo DIV SRC (AL) ← (AX) / (SRC) cociente de división de números binarios de 8 bits

(AH) ← (AX) / (SRC) Resto de división de números binarios de 8 bits

O (AX) ← (DX, AX)/(SRC) Cociente de división de números binarios de 16 bits

( DX) ← (DX, AX)/(SRC) Resto de la división binaria de 16 bits

División con signo IDIV SRC La operación es la misma que la anterior, pero el operando es un número con signo

;

Nota:

Cuando el divisor son datos de bytes, el dividendo debe colocarse en AX. Cuando el divisor son datos de palabras, el dividendo debe colocarse en DX, AX.

El resultado de la instrucción de división no tiene definición para el indicador de estado (el estado no está definido). Sin embargo, si el divisor es 0 o un número con signo, cuando el resultado de la división excede el rango especificado, se generará la interrupción número 0, independientemente del indicador de desbordamiento OF.

8086/8088 estipula que el signo del resto del resultado de la operación de la instrucción IDIV es el mismo que el dividendo.

En la operación de división con signo, cuando el número de dígitos del dividendo no es suficiente, el dividendo debe ampliarse al número requerido de dígitos. 8086/8088 ha firmado instrucciones de extensión de número.

Formato de instrucción:

Extiende el byte a la palabra CBW; extiende el bit de signo en el registro AL al registro AH

Extiende la palabra al doble palabra CWD; el bit de signo en el registro AX se extiende al registro DX

Estas dos instrucciones no afectan el bit de bandera.

5. El código BCD de instrucción de ajuste decimal es un número decimal codificado en binario, también conocido como número binario-decimal. El código BCD en 8086/8088 se divide en dos formas: una es usar un número binario de cuatro dígitos para representar un número decimal, que se llama código BCD comprimido, la otra es usar un número binario de ocho dígitos para representar; un número decimal, que se denomina código BCD no codificado. Código BCD comprimido, sus cuatro bits inferiores son el código BCD y los cuatro bits superiores no tienen sentido.

Dado que el código BCD es un código binario de cuatro dígitos, el número binario de cuatro dígitos tiene 16 códigos. El código BCD solo usa 10 de ellos, y los códigos inútiles restantes se denominan códigos no válidos. Cuando el resultado de la operación del código BCD ingresa o omite el área del código no válido, se producirá un error. Para obtener resultados correctos, se deben realizar ajustes. 8086/8088 tiene dos conjuntos de instrucciones de ajuste decimal para códigos BCD comprimidos y códigos BCD sin comprimir, y los métodos de ajuste son ligeramente diferentes.

(1) Formato de comando de instrucción de ajuste decimal del código BCD comprimido:

Ajuste decimal adicional DAA (AL) ←Ajuste la suma en AL al formato del código BCD comprimido

Ajuste decimal sustractivo DAS (AL) ←Ajustar la diferencia en AL al formato de código BCD comprimido

El método de ajuste es:

Los 4 bits inferiores del acumulador AL son mayores que 9 o Cuando el indicador de acarreo auxiliar AF=1, el acumulador AL se corrige sumando 06H. Si los 4 bits altos del acumulador AL son mayores que 9 o el indicador de acarreo CY=1, el acumulador AL se corregirá sumando 60H. Si los 4 bits altos del acumulador AL son mayores o iguales a 9, y los 4 bits bajos son mayores que 9, entonces el acumulador AL se corrige sumando 66H.

[Ejemplo 4.26] Realizar la operación de suma de código BCD 59+68=127

En este ejemplo, los cuatro bits bajos del resultado de la suma de código BCD hacen que AF=1, y el alto cuatro bits son mayores que 9, así que agregue 66H para la corrección.

Nota: La instrucción de ajuste decimal de suma o resta de código BCD comprimido debe usarse después de la instrucción ADD (ADC) o SUB (SBB). El resultado del ajuste no tiene impacto en el indicador OF, pero sí. en otros bits de bandera de estado.

El método de ajuste decimal sustractivo es similar al ajuste decimal aditivo, excepto que sumar 6 se convierte en restar 6.