¡Ayuda! ¿Por qué no se proporcionan a los usuarios conjuntos de instrucciones de CPU superiores a X86? Como X86-64, sSSE3, etc.
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) p >
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... p>
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