Red de conocimiento de recetas - Industria de la restauración - ¡Ayuda! ¿Por qué no se proporcionan a los usuarios conjuntos de instrucciones de CPU superiores a X86? Como X86-64, sSSE3, etc.

¡Ayuda! ¿Por qué no se proporcionan a los usuarios conjuntos de instrucciones de CPU superiores a X86? Como X86-64, sSSE3, etc.

La clave para aprender lenguaje ensamblador es dominar el conjunto de instrucciones ensamblador y comprender el modo de funcionamiento de la computadora. Las siguientes son algunas instrucciones de ensamblaje que se utilizan con frecuencia en el proceso de ensamblaje de 80X86.

Debido al límite de caracteres de Baidu, no se puede enviar completo.

1. Instrucciones de transferencia de datos: MOV, XCHG, LEA, LDS, LES, PUSHF, POPF, CBW, CWD, CWDE.

Instrucciones aritméticas: ADD, ADC, INC, SUB, SBB, DEC, CMP, MUL, DIV, DAA, DAS, AAA, AAS.

Tres. Instrucciones lógicas: AND, OR, XOR, NOT, test, SHL, SAL, SHR, SAR, RCL, RCR, ROL, ROR.

Cuatro. Instrucciones de transferencia de control: JMP, Jcc, JCXZ, LOOP, LOOPZ, LOOPNZ, LOOPNE, CALL, RET, INT.

Instrucciones de operación de sartas de tuberías verbo (abreviatura de verbo): MOVS, LODS, STOS, CMPS, SCAS.

Instrucciones para el manejo de marcas con verbos intransitivos: CLC, STC, CLD, STD.

7. Nuevas instrucciones para CPU de 32 bits (adiciones y mejoras posteriores)

Además de algunas de las instrucciones anteriores, la CPU 80X86 de 32 bits también tiene muchas instrucciones nuevas. que en ocasiones son Programación simplificada. Pero como acabo de aprender a ensamblar, leí estas instrucciones de los libros, por lo que todavía no entiendo muchas de ellas. El propósito de escribir estas instrucciones es simplemente ayudarme a recordar mejor las funciones y el uso de estas instrucciones. Mis colegas también esperan que los novatos como yo puedan aprender más, sin ningún otro propósito. No todos los ejemplos se han probado con código real.

-

1, MOV (transmisión)

Escritura de instrucciones: destino MOV, origen

Descripción de la función: convertir el operando de origen. El valor se copia al destino, dejando el valor de origen sin cambios.

Nota: 1) El objetivo no puede ser CS (registro de segmento de código). Tengo entendido que el segmento de código no se puede escribir, solo leer, por lo que CS no se puede copiar en el lugar correspondiente. 2) El destino y el origen no pueden ser números de memoria al mismo tiempo, registro de segmento (CS\DS\ES\SS\FS\GS) 3) Los datos inmediatos no se pueden pasar al registro de segmento 4) El destino y el origen deben coincidir con el tipo, por ejemplo, ambos deben ser un byte, una palabra o una palabra doble. 4) Dado que no existe un tipo inmediato claro, cuando los datos inmediatos se transmiten al objetivo, el sistema expandirá automáticamente los datos inmediatos al mismo número de dígitos que el número objetivo antes de transmitir. A veces se necesitan bytes PTR, palabras PTR y DWORD PTR para representar explícitamente el número de bits literales.

Ejemplo de escritura: MOV dl, 01H; MOV eax, [BP]; Eax =ss: [bp] transmisión de palabra doble.

2.XCHG (Exchange)

La instrucción está escrita: XCHG objeto1, objeto2.

Descripción de la función: Intercambia los valores de objeto1 y objeto2.

Nota: 1) Los valores de dos números de memoria no se pueden intercambiar directamente. 2) Los tipos deben coincidir. 3) Ninguno de los operandos puede ser un registro de segmento. Parece que las restricciones para escribir registros de segmento son muy estrictas y la instrucción MOV no puede escribir en registros de segmento. 4) Debe ser un registro general (ax, bx, cx, dx, si, di) o número de memoria.

Ejemplos de escritura: XCHG ax, [bx][si]; mem

Descripción de la función: Carga el valor de la dirección efectiva MEM en un registro de uso general de 16 bits.

Ejemplo de escritura: Supongamos bx=5678H, EAX=1, EDX=2.

Lea si, 2[bx]; si=567AH

Lea di, 2[eax][EDX]; es una dirección válida, no un valor real en la memoria. Si desea obtener el valor correspondiente a esta dirección en la memoria, debe agregar una dirección de segmento. La dirección del segmento puede almacenarse en DS, ss o CS:> No sé si lo entendí correctamente. . . .

4.LDS\LES\LGS\LSS (tenga en cuenta que, a diferencia de LEA, este es un valor cargado, no una dirección válida).

Estos comandos tienen nombres diferentes pero funciones similares.

Escribe: LDS reg16, mem32.

Descripción de la función: reg16 es igual a la palabra de orden inferior de mem32, DS corresponde a la palabra de orden superior de mem32 (en el caso de LES, ES aquí corresponde a la palabra de orden superior de mem32 ).

Se utiliza para copiar un registro de segmento y un registro general de 16 bits al mismo tiempo.

Nota: El primer operando debe ser un registro de propósito general de 16 bits.

Antes de continuar, familiarízate con el concepto de pila. La pila está ubicada en el segmento de pila de la memoria. Es parte de la memoria y tiene las características de "primero en entrar, último en salir". La pila tiene solo una entrada, que es la parte superior actual de la pila. Cuando la pila está vacía, la parte superior e inferior de la pila apuntan a la misma dirección de memoria. En WINDOWS, una pila puede entenderse como una botella de cerveza al revés, con una dirección grande en la parte superior y una dirección pequeña en la parte inferior. Esto se llama pila, hum, muy simple.

En lenguaje ensamblador, la unidad más pequeña de operación de la pila es una palabra, es decir, solo puede ser una palabra o una palabra doble. Al mismo tiempo, SS: SP apunta a la parte superior de la pila. (SS es el registro del segmento de la pila, SP es el puntero de la pila, los dos se suman para formar la dirección de memoria en la parte superior de la pila).

5. Empujar (push)

Escribir: push reg 16(32)/seg/mem 16(32)/IMM.

Descripción de la función: inserta el valor del registro general/registro de segmento/número de memoria/valor inmediato en la pila, es decir:

SP=SP-2 SS: [SP]= Valor de 16 bits (cuando se inserta un valor de 32 bits en la pila, SP=SP-4, SS:[SP]=32 es el valor).

6. Bang

Escribir: pop reg 16(32)/seg/mem 16(32) no se puede insertar en CS.

Descripción de la función: inserta los datos de 16 (32) bits del puerto de pila en el registro/memoria general/registro de segmento, es decir:

Registro/registro de segmento/memoria = SS: [SP ] SP=SP 2 (al extraer un valor de 32 bits, SP=SP 4) (tenga en cuenta que no se permite extraer un valor inmediato y que las constantes son inmutables).

Pusa, Pusader, POPA, Popade

Función: Poner todos los registros de propósito general de 16/32 bits dentro/fuera de la pila.

Por ejemplo, AX, CX, DX, BX, SP original, BP, SI, DI se apilan en secuencia. POPA abre la pila en orden inverso, pero es importante tener en cuenta que el valor enviado al SP se descarta y el SP se restaura añadiendo 16 bits (por supuesto, de lo contrario, la dirección superior de la pila se modificaría, provocando desalineación y posible confusión).

POPAD PUSHAD, sólo 32 bits.

8. PUSHF, PUSHFD, POPF, POPFD

Descripción de la función: coloque la bandera de registro de bandera (EFLAGS) en la pila o sáquela de la pila.

Por ejemplo: la bandera pushf ingresa a la pila POPF;; la palabra en la parte superior de la pila aparece en la posición de la bandera.

En resumen, POP y PUSH generalmente se pueden usar para intercambiar los valores de dos registros y también se pueden usar para proteger el valor del registro, de la siguiente manera:

Intercambiar los valores de ax y cx: pushax empuja CX; pop axpop cx

Proteger registro: pushax empuja CX;... Se está ejecutando mucho código en el medio ... popcxpop ax

9.LAHF\SAHF( Instrucción de transferencia de registro de bandera)

Escritura: lahf;

Función: ah = los 8 bits inferiores de la bandera

Escritura: sahf;

Función: Los 8 bits inferiores de la bandera = AH

10, extensión de signo y cero instrucciones de extensión

CBW; la extensión del signo AL es AX

CWD; extensión del signo AX DX:AX para números de 32 bits.

CWDE;Notación AX extendida a EAX;;

Notación CDQ:EAX extendida a EDX:EAX de 64 bits.

MOVSX (forma general de instrucción de extensión de signos)

Escritura: MOVSX reg16\32, reg 8\reg 16\me M8\mem 16.

Función: Se utiliza para firmar extender de 8 bits a 16 bits, o extender de 16 bits a 32 bits.

Instrucciones de extensión cero

Escritura: MOVZX reg16\32, reg 8\reg 16\me M8\mem 16.

Extensión cero significa que los bits altos se extienden sumando 0. A menudo se utiliza para copiar datos en un registro diferente, como la extensión todo cero de EBX. La extensión cero del mismo registro se puede lograr utilizando el bit 0 alto de MOV.

11, BSWAP (intercambio de bytes)

Escritura: bswap reg32

Función: intercambia los bytes 0.º y 3.º de reg32, así como el 1.º y 2.º byte .

Por ejemplo: establezca EAX=12345678h.

Después de ejecutar bswapaax, eax=78563412H.

12, XLAT (código de escape)

Escritura: XLAT;

Rol: AL=DS: [bx AL]

En la memoria a la que apunta DS:BX, asigne un byte en el desplazamiento especificado por a1 a a1. (Parece que esta es una instrucción conveniente para la pereza...) Resulta que su objetivo principal es buscar tablas. Tenga en cuenta que puede proporcionar operandos para especificar qué dirección de segmento usar, por ejemplo:

XLAT ES: tabla usando ES como dirección de segmento, la tabla no tiene ningún efecto.

Tabla XLAT; utilice el registro de segmento correspondiente al segmento donde se encuentra la tabla como dirección del segmento.

-

-Iniciar instrucciones aritméticas.

13. Agregar (Agregar)

Operación de escritura: agregar registro/registro de memoria/memoria/memoria.

Función: Suma el siguiente operando al operando anterior.

Nota: Los tipos de los dos operandos deben coincidir y no pueden ser ambos operandos de memoria.

ADC (adición con acarreo)

Escritura: adcreg/mem, reg/mem/IMM;

Función: dest=dest src cf

Cuando CF=0, ADD tiene la misma función que ADC.

Por ejemplo: agregue EDX de 64 bits: EAX y ECX: EBX

Agregue EAX, EBX

ADC

14; , Empresa (agregue uno usted mismo)

Escritura: incrg/MEM;

Función: dest = dest 1;

15, XADD (exchange plus)

Escribir: registro XADD/registro mem

Función: primero intercambia dos números y luego envía la suma de los dos números al primer número.

16, SUB (resta)

Escribir: subregistro/memoria, registro/memoria/IMM;

rol: dest = dest-src;

p>

SBB (resta con préstamo)

Escritura: registro/memoria SBB, registro/memoria/inmigración

Rol: dest = dest-src -cf;

p>

Nota: Los dos operandos deben ser del mismo tipo y no pueden ser ambos números de memoria.

17 de diciembre (menos 1)

Escritura: decreg/mem;

Función: dest = dest-1;

18 , CMP (Comparar)

Escribir: registro/memoria CMP, registro/memoria/imm.

Función: dest-src

Nota: El resultado no se almacena en dest, solo se realiza la operación de resta para afectar el indicador EFLAG según el resultado de la operación.

19, negativo (complemento)

Escribe: registro/memoria negativo

Función: El complemento es el inverso, es decir, dest = 0-dest ;

20. Comparar intercambios

Escribir: CMPXCHG reg/mem, reg

Rol: AL/AX/EAX-oprd1, si es igual a 0, entonces oprd1= oprd2, de lo contrario, AL/AX/eax = oprd 1;

Es decir, compare AL/AX/EAX con el primer operando. Si son iguales, establezca ZF=1 y reemplace el segundo operando con Copias. al primer operando; de lo contrario, establece ZF=0 y copia el primer operando a AL/AX/EAX.

Descripción: CMPXCHG proporciona principalmente soporte para operaciones atómicas.

CMPXCHG8B (instrucción de intercambio de comparación de 8 bytes)

Escribe: CMPXCHG8B MEM64

Función: Compara EDX: números de 64 bits en EAX y 64 dígitos en memoria Si es igual, configure ZF=1 y almacene la dirección de memoria especificada por ECX:EBX en mem64. De lo contrario, configure ZF=0 y configure EDX:EAX con el contenido de 8 bytes de mem64.

21, MUL (multiplicación sin signo)

Escritura: mul reg/mem;

Función: Cuando el operando es de 8 bits, ax = al * src

Cuando el operando es de 16 bits, dx: ax = ax * src;

Cuando el operando es de 32 bits, EDX: EAX = EAX * src;

22. Multiplicación de bits de signo

Escritura: imul reg/mem; (misma función que arriba)

IMUL reg16, reg16/mem16, IMM 16;

IMUL reg32, reg32/mem32, imm32

IMUL reg16, IMM 16/reg 16/IMM 16;

IMUL reg32, reg 32/mem 32/IMM 32;

Nota: No hay dos operandos que sean multiplicación de múltiples operandos de 8 bits.

Para el mismo número binario, los resultados de MUL e IMUL pueden ser diferentes. Suponga AL=0FF, BL=1 y ejecute las siguientes instrucciones respectivamente, obtendrá resultados diferentes:

Mul blAX = 0 ffh(255);

Imul blAX=0FFFFH( -1 )(La parte superior es una extensión de la parte inferior)

23.DIV (división sin signo)/IDIV (división con signo)

Escribe: div reg/mem;/ Área/memoria IDIC

Función: Si el operando es de 8 bits, AXSRC, entonces el resultado es AL y el resto es AH;

Si el operando es de 16 bits, DX: AXSRC, entonces El cociente del resultado está en AX y el resto en DX;

Si el operando es de 32 bits, EDX: EAXSRC, el cociente del resultado está en EAX y el resto está en EDX;

Nota: los números de 8 dígitos no se pueden dividir con 8 dígitos, los números de 16 dígitos no se pueden dividir entre números de 16 dígitos y 32 no se pueden dividir directamente entre 32. Si es necesario, se debe ampliar el signo o el cero del divisor a 16, 32 y 64 bits antes de utilizar la instrucción de división.

Para IDIV, los signos del resto y del dividendo son iguales, por ejemplo: -5 IDIV 2 = cociente -2, resto: -1

En los siguientes casos; , la CPU se interrumpirá: 1. El divisor es 0; 2: debido a que el cociente es demasiado grande, EAX\AX o AL no pueden acomodarlo, lo que provoca un desbordamiento.

-Suplemento de instrucciones de ajuste de código BCD (instrucciones de ajuste decimal).

24. Código BCD: el código BCD es una representación de codificación binaria de números decimales, que se divide en código BCD comprimido y código BCD sin comprimir. El código BCD comprimido utiliza cuatro dígitos binarios para representar un dígito decimal, es decir, 0000B ~ 1001B representa el decimal 0 ~ 9, como 0165438.

El uso de binario de 8 bits para representar un código decimal se denomina código BCD sin comprimir. Los cuatro bits inferiores son los mismos que el código BCD comprimido y los cuatro bits superiores no tienen sentido.

Las instrucciones de ajuste del código BCD comprimido incluyen DAA (ajuste de código BCD comprimido aditivo) y DAS (ajuste de código BCD comprimido sustractivo).

Escritura:

DAA;

Función: Ajustar y comprimir código BCD en AL.

Función: cuando se utiliza la instrucción DAA, la instrucción ADD/ADC generalmente se ejecuta primero para agregar los dos códigos BCD comprimidos y el resultado se almacena en AL. Luego use esta instrucción para ajustar AL al comprimido. Formato de código BCD.

Algoritmo de ajuste DAA;

IF (4 dígitos inferiores de AL>; 9 o AF=1)

Entonces

AL = AL 6;

AF = 1;

ENDIF

IF (AL alto 4 dígitos>; 9 o CF=1)

Entonces

AL = AL 60H;

CF = 1;

ENDIF

Nota: CF refleja el acarreo adicional del código BCD comprimido.

DAS

Función: Ajusta la diferencia en AL para comprimir el código BCD.

Función: cuando se usa la instrucción DAS, la instrucción SUB/SBB generalmente se ejecuta primero para restar los dos códigos BCD comprimidos y el resultado se almacena en AL. Luego use esta instrucción para ajustar AL al comprimido. Formato de código BCD.

Algoritmo de ajuste del DAS:

SI (4 dígitos inferiores de AL>; 9 o AF=1)

Entonces

AL = AL-6;

AF = 1;

ENDIF

IF (AL alto 4 dígitos>; 9 o CF=1)

Entonces

AL = AL-60H;

CF = 1;

ENDIF

Nota: CF refleja el código BCD comprimido. de la resta.

Tenga en cuenta especialmente que si utiliza la instrucción DAA o DAS, los operandos involucrados en la suma o resta deben ser códigos BCD comprimidos. Si se suman o restan dos números binarios cualesquiera y luego se ajustan, no se obtendrá el resultado correcto.

La clave son las reglas de ajuste, en las que la bandera AF está especialmente diseñada para el ajuste del código BCD. Cuando se produce un acarreo o préstamo desde el mordisco inferior, el valor es 1. Cuando hay un acarreo o préstamo del bit más alto, CF es 1.

Instrucciones de ajuste de código BCD sin comprimir, incluidos AAA, AAS, AAM y AAD.

Escritura: AAA

Función: Ajusta la suma en AL al código BCD sin comprimir después del ajuste, los 4 bits superiores de AL son iguales a 0, Ah generado por Ah = CF<; /p> p>

Función: cuando se utiliza la instrucción AAA, la instrucción ADD/ADC generalmente se ejecuta primero, con AL como operando de destino, se agregan dos códigos BCD sin comprimir (independientemente del orden superior) y luego AAA se utiliza para ajustar AL Es un formato de código BCD sin comprimir, los 4 bits de orden superior son iguales a 0 y el acarreo generado por el ajuste se agrega a AH.

Algoritmo de ajuste AAA:

SI(AL 4 dígitos inferiores>; 9 o AF=1)

Entonces

AL = AL 6;

AH = AH 1;

AF = 1;

CF = 1

Otros

< p; >AF = 0; CF = 0;

ENDIF

Al = Al y OFH;; todos los 4 bits altos se ponen a 0.

Escritura: AAS

Función: ajusta la diferencia entre AL y el código BCD sin comprimir; después del ajuste, los 4 bits altos de AL son iguales a 0, AH = CF generado por AH.

Función: cuando se utiliza la instrucción AAS, normalmente se ejecuta primero la instrucción SUB/SBB, se utiliza AL como operando de destino, se restan dos códigos BCD sin comprimir (independientemente del orden superior) y luego se utiliza AAS para convertir. AL Se ajusta al formato de código BCD sin comprimir, los 4 bits de orden superior son iguales a 0 y los bits prestados generados por el ajuste se restan de AH.

Algoritmo de ajuste AAA:

SI(AL 4 dígitos inferiores>; 9 o AF=1)

Entonces

AL = AL -6;

AH = AH-1;

AF = 1;

CF = 1;

AF = 0; CF = 0;

ENDIF

Al = Al y OFH;; todos los 4 bits altos se ponen a 0.

Escritura: AAM;

Función: ah = axdiv 10, al = ax mod 10;

Función: Cuando se usa AAM, generalmente se ejecuta MUL/IMUL. primera instrucción para multiplicar dos códigos BCD sin comprimir de un byte (los cuatro bits superiores deben ser 0) y almacenar el resultado en AX. Luego use la instrucción AAM para ajustar AX (AH=0) al formato de código BUC comprimido de dos bytes.

Escritura: AAD

Función: AL=AH*10 AL, AH = 0;

Función: Cuando se usa AAD, la instrucción generalmente se ejecuta primero y AX El código BCD sin comprimir de dos bytes (los cuatro bits de orden superior de AH y AL deben ser 0) se ajusta a la representación binaria correspondiente y luego se divide por un código BCD sin comprimir de un byte (los cuatro bits de orden superior debe ser 0) usando la instrucción DIV/IDIV 0), puede obtener el resultado de la división del código BCD sin comprimir.

Se debe prestar especial atención al hecho de que los 4 bits superiores de los operandos involucrados en operaciones de multiplicación o división de código BCD sin comprimir deben ser 0.

-La instrucción de aritmética ha terminado.

-Comienzan las instrucciones.

25. AND\OR\XOR\NOT\test

Escribiendo:

Y reg/mem, reg/mem/IMM;

O reg/mem, reg/mem/IMM;

XOR registro/memoria, registro/memoria/registro;

No reg/mem;

Registro de prueba/memoria, registro/memoria/memoria;

Rol: AND\TEST\OR\XOR, los dos operandos deben ser del mismo tipo y no pueden ser operandos de memoria al mismo tiempo.

XOR se usa generalmente para borrar registros, como XOR AX, AX.

La relación entre TEST y AND es similar a CMP y SUB; El uso típico de TEST es verificar si un determinado bit es 1, por ejemplo:

Test DX, 109h;

Si al menos uno de los bits 0, 3 y 8 de DX es 1, entonces ZF=0, de lo contrario ZF = 1;

26 Comando de desplazamiento

Desplazamiento lógico a la izquierda

Escribe: SHL REG\mem, 1\CL;

Función: desplaza cada bit binario de DEST hacia la izquierda en 1 bit (CL), genera el desplazamiento más alto de destino a CF y genera el desplazamiento más bajo a 0.

Desplazamiento aritmético a la izquierda

Escribir: SAL REG\mem, 1\CL;

Función: Desplaza cada bit binario de DEST a la izquierda en 1 (CL ) bit, genera el desplazamiento más alto del destino a CF y el desplazamiento más bajo a 0 (igual que SHL).

Desplazamiento lógico a la derecha

Escribir: SHR REG\mem, 1\CL;

Función: Desplaza cada bit binario de DEST a la izquierda en 1 (CL ) bit, genera el desplazamiento más bajo del destino a CF y el desplazamiento más alto a 0.

Desplazamiento aritmético a la derecha

Escribe: SAR REG\mem, 1\CL;

Función: Desplaza cada bit binario de DEST a la izquierda en 1 (CL ) bit, mueva el bit más bajo de destino a CF y deje el bit más alto sin cambios.

Desplazamiento a la izquierda de doble precisión

Escritura: shld reg16/reg32/mem 16/mem 32, reg 16/reg 32, im M8/cl (los tipos deben coincidir)

Función: Desplaza cada bit binario de OPRD1 hacia la izquierda, mueve el bit más alto de oprd1 a CF y mueve el bit más alto de oprd2 al bit más bajo de oprd1, pero el valor de OPRD2 permanece sin cambios.

SHRD (Desplazamiento a la derecha de doble precisión)

Escrito y funcionalmente similar a Desplazamiento a la izquierda de doble precisión. Tenga en cuenta que la dirección del movimiento es hacia la derecha.

El impacto de las instrucciones de cambio anteriores en los bits de bandera:

Si el bit de signo cambia después del cambio, entonces = 1, de lo contrario = 0 CF es la última marcha; a las reglas generales Impacto en el gobierno y San Francisco. Pero si el número de turno es 0, el bit de bandera no se ve afectado; si el número de turnos es mayor que 1, OF no está definido.

27. Instrucción de turno de rotación

ROL (girar a la izquierda)

Escritura: rolreg\mem, 1\cl o ROL area/MEM, IMM8 (Tipos) puede no coincidir)

Función: desplaza cada bit binario de DEST hacia la izquierda, mientras desplaza el bit más alto de CF hacia el bit más bajo.

Ciclo de desplazamiento hacia la derecha

Escritura: rorreg\mem,1\cl; o ROR REG/MEM,IMM8 (el tipo puede no coincidir)

Función: Mover Cada bit binario de DEST se desplaza hacia la derecha, el bit más bajo se desplaza fuera de CF y el bit más alto se mueve hacia adentro al mismo tiempo.

RCL (desplazamiento a la izquierda con bucle de acarreo)

Escribir: rclreg\mem,1\cl o RCL region/mem,imm8 (los tipos pueden no coincidir)

<; p>Función: Desplaza cada bit binario de DEST hacia la izquierda, mueve el desplazamiento más alto a CF y mueve el CF original al bit más bajo.

RCR (Carry Rotate Right)

Escritura: rcrreg\mem,1\cl; o RCR region/mem,imm8 (los tipos pueden no coincidir)

Función: Desplaza cada bit binario de DEST hacia la derecha, desplaza el bit más bajo a CF y mueve el CF original al bit más alto.

28. Instrucciones de prueba

Prueba de bits

Método de escritura: Bt reg 16/mem 16, reg 16/im M8 o BT REG32/MEM32, reg; 32 /im M8;

Función: cf = índice CF = DEST, DEST permanece sin cambios.

Prueba y configuración de bits

Escribe: BTS reg 16/mem 16, reg 16/im M8 o BTS REG32/MEM32, reg 32/im M8

Función: cf = bit de índice de destino, bit de índice de destino = 1;

BTR (prueba y reinicio de bits)

Escritura: BTR reg 16/mem 16, reg 16 /im M8; o BTR REG32/MEM32, reg 32/im M8;

Función: cf = bit de índice de destino, bit de índice de destino = 0;

BTC (prueba de bits) y restablecer)

Escritura: BTC reg 16/mem 16, reg 16/im M8; o BTC REG32/MEM32, reg 32/im M8

Función: cf = dest The; el bit de índice de destino se invierte;

Nota: Si destino es un registro, el resto del índice dividido por 16 (dest es reg16) o 32 (dest es reg32) se utiliza como bit de prueba. Por supuesto, el índice no debe exceder el número de operandos.

Si dest es un operando de memoria, ya sea una palabra o una palabra doble, el bit de prueba es el desplazamiento relativo a la dirección inicial. Por ejemplo, si BX=50 y X es una variable de tipo palabra, entonces la instrucción BT

Las instrucciones BTS, BTC y BTR se pueden utilizar para programación concurrente.

29. Instrucción de escaneo de bits

BSF (escaneo de bits hacia adelante)

Escritura: BSF reg16/reg32, reg 16/reg 32/mem 16/mem 32 ; (los tipos deben coincidir)

Función: dest = el dígito más bajo en src con un valor de 1 (búsqueda de menor a mayor).

BSR (exploración de bits inversos)

Escritura: BSR reg16/reg32, reg 16/reg 32/mem 16/mem 32 (los tipos deben coincidir)

< p; >Función: dest = el mayor número de dígitos en src con un valor de 1 (búsqueda de mayor a menor).

Descripción: BSF y BSR buscan la posición de 1 en el operando SRC por primera vez, BSF busca de bit bajo a bit alto y BSR busca de bit bajo a bit alto. Si se encuentra 1, se establece ZF=0 y el número de bits se almacena en el operando DEST. Si SRC=0, es decir, 1 no aparece, entonces establezca ZF=1 y el valor de dest es incierto.

Por ejemplo, existe el siguiente número binario 011111110100.

El número de dígitos después de bsf es 2 y el número de dígitos después de bsr es 14.

30. Instrucciones para establecer condiciones

Escritura general: SETcc reg8/mem8

Función: si la condición cc es verdadera, dest = 1; de lo contrario, dest = 0; ;

SETcc tiene múltiples formas de comando, de las cuales cc es solo un descriptor. Consulte las tres tablas siguientes para obtener más detalles, donde E (igual) significa igual, g (grande) significa mayor con signo, L (pequeña) significa menor con signo, A (superior) significa mayor sin signo, B (inferior) significa menor sin signo que.

Tabla 1: Instrucción SETcc para probar un bit de bandera único;

Instrucción SETcc

Descripción

Establecer 1 condición

SETC, SETB, Setna

Con carry, set 1

CF=1

SETNC, SETNB, Seta

SETZ SIN CARRY TIME 1

CF=0

SETZSETZ

Cuando es 0 (igual a), establezca 1.

ZF=1

Setna, Settner

Configuración de tiempo 1 distinto de cero (no igual)

ZF=0

Establezca

en 1 cuando sea negativo.

SF=1

SETNS

Establece 1 para cronometrar.

SF=0

Establezca 0

Cuando se produzca un desbordamiento, establezca 1.

OF=1

Setno

Establece 1 cuando no hay desbordamiento.

OF=0

SETP,SETP

Cuando "1" es un número par, establezca 1.

PF=1

SETNP, SETPO

Cuando el número de "1" es un número impar, establezca 1.

PF=0

Tabla 2: Instrucción SETcc para comparación de números con signo, a menudo utilizada después de la instrucción CMP para determinar el tamaño del número con signo:

SETcc instrucción

Descripción

Establecer 1 condición

SETLER SETG

Cuando sea mayor que (no menor o igual a), establezca 1.

SF=OF, ZF=0

Setqi

Cuando sea mayor o igual a (no menor que), establezca 1.

SF=OF

SETANG·SETL

Establezca 1 cuando sea menor que (no mayor ni igual que).

SF≠OF

Settler

Cuando sea menor o igual a (no mayor que), establezca 1

SF≠OF o ZF=1

Tabla 3: Instrucción SETcc para comparar números sin signo, a menudo utilizada después de la instrucción CMP para determinar el tamaño de un número sin signo:

Instrucción SETcc

Describir

Establecer 1 condición

Seta, Setembe

Cuando sea mayor que (no menor o igual a), establezca 1.

CF=0, ZF=0.

Cerdas, cerdas, cerdas

Establecer en 1 cuando sea mayor o igual a (no menor que).

CF=0

SETB, Setna, SETC

Establezca 1 cuando sea menor que (ni mayor ni igual que).

CF=1

Setbe, Setna

Cuando sea menor o igual a (no mayor que), establezca 1

CF= 1 o ZF=1.

-

-

-

31, JMP (instrucción de rama incondicional)

El salto de código es Dos tipos: uno es la transferencia dentro del segmento, la dirección del código que se va a omitir está en el mismo segmento que la dirección actual y luego se puede modificar la IP (puntero de instrucción de registro especial); el otro es la transferencia entre segmentos; : el código que se debe omitir La dirección y la dirección del código actual no están en la misma sección y los valores de CS e IP deben modificarse al mismo tiempo.

Escritura:

1. Etiqueta JMP; si la etiqueta y la instrucción están ubicadas en el mismo segmento de código, IP = la dirección de desplazamiento de la etiqueta; de lo contrario, CS: IP = la dirección de desplazamiento; La dirección del segmento de la etiqueta es simple. Dice que salta a la dirección de la etiqueta.

2. JMP reg 16/mem 16; transferencia dentro del segmento, dirección de compensación = reg16/[mem16]

3. CS = palabra alta mem32, dirección de desplazamiento IP = palabra baja mem32.

Nota: Cuando el operando es un operando de memoria, si el operando de memoria es un tipo de palabra doble, se producirá una transferencia entre segmentos. Si el operando de memoria es un tipo de palabra, se producirá una transferencia indirecta dentro del segmento. ocurrirá. Cuando no se puede determinar el tipo, el compilador informa un error.

32. Instrucción de bifurcación condicional

Escritura: etiqueta Jcc;;

Función: si la condición es verdadera, IP = IP = dirección de desplazamiento de la etiqueta; de lo contrario, la CPU ignorará la rama condicional y continuará ejecutando la siguiente instrucción.

Las transferencias condicionales tienen las siguientes formas:

Tabla 1: Instrucciones Jcc para probar bits de bandera única;

Instrucciones Jcc

Descripción

Condición de transferencia

JC, JB, JNAE

Tiempo de transferencia de transferencia

CF=1

JAE JNB JNC

Sin transferencia de tiempo de acarreo

CF=0

JE JZ

Conversión cero (igual)

ZF =1

JNE JNZ

Conversión de tiempo distinto de cero (desigual)

ZF=0

Investigación a reacción...

Transición de tiempo negativo

SF=1

JNS

Para transición hacia adelante

SF=0

Joe

Transferencia por desbordamiento

OF=1

[Nombre masculino] Jon

Sin transferencia de desbordamiento

p>

OF=0

JP, JPE

Transferir cuando '1' es un número par.

PF=1

JPO JNP

Transferencia cuando el número “1” sea impar.

PF=0

Tabla 2: Instrucciones Jcc para comparación de números con signo (normalmente el tamaño del número con signo se determina después de la instrucción CMP)

Instrucción Jcc

Descripción

Condición de transferencia

JNLE JG

Transferencia cuando sea mayor que (no menor o igual a)

SF=OF, ZF=0

JNL JGE

Transferir cuando sea mayor o igual a (no menor que)

SF=OF

UK JL

Transferencia cuando menos de (no mayor o igual a)

SF lt gt pertenece a...

JLE, LNG

Menor que o Ramificación cuando es igual a (no mayor que)

SF lt gtZF=1

Tabla 3: La instrucción Jcc se utiliza para comparar números sin signo ( generalmente juzgado después de la instrucción CNO) tamaño)

Comando Jcc

Descripción

Condición de transferencia

Sí, JNBE

es mayor que (no menor o igual que)

CF=0, ZF=0.

JAE, JNB, JNC

Transferir cuando sea mayor o igual a (no menor que)

CF=0

JB, LNAE, JC

Transferir cuando sea menor que (no mayor o igual que)

CF=1

LNA JBE

Cuando sea menor mayor o igual a (no mayor que) Transferencia

ZF=1 o CF=1.

33. JCXZ/JECXZ (si CX/ECX es cero, salta)

Escribiendo: jcxzlabel (si CX=0, salta a etiqueta)

JECXZ. tag; (si ECX=0, vaya a la etiqueta)

Nota: el desplazamiento relativo de la etiqueta debe estar entre -126~127.

34. Comando de bucle

Etiqueta de bucle;

Función: CX = CX-1; si CX

Etiqueta LOOPZ/LOOPE;

Función: CX = CX-1; si CX

Etiqueta LOOPNZ/LOOPNE;

Función: CX = CX-1;

Nota: El desplazamiento relativo de la etiqueta debe estar entre -128~127.

35. Llamada a procedimiento e instrucciones de devolución

Llamada (llamada a procedimiento)

Escrito: calllabel