|
Cuando me encontré con el siguiente código mientras aprendía lenguaje ensamblador, simplemente pensé que el programa no podía terminar normalmente. Sin embargo, tras depurar el seguimiento de un solo paso, se descubrió que el programa podía terminar normalmente, y ocurrió un fenómeno extraño: cuando el programa empezó a ejecutarse de code:0005 a code:0014, continuó saltando a code:0008 con el comando jmp. Sin embargo, al continuar realizando un paso adelante, el programa salta directamente a code:0 en lugar de code:0018 (es decir, al segmento designador S1). Al principio no entendía qué estaba pasando, pero tras muchas observaciones rápidas, seguí sintiéndome raro. Después de estudiar cuidadosamente el uso de instrucciones JMP en el libro de texto [1], y luego analizar el programa en combinación con código máquina, tengo una nueva comprensión de las instrucciones JMP. Instrucciones de máquina de desplazamiento de dirección de código ensamblado (IP) Suponga CS:Code (Unidad: H) Segmento de código mov ax, 4c00h 0000 B8004C int 21h 0003 CD21 start: mov ax,0 0005 B80000 S: Nop 0008 90 NOP 0009 90 mov di, offset s 000A BF0800 mov si, desplazamiento s2 000D BE2000 mov ax,cs:[si] CS:0020=F6EB mov cs:[di],ax CS:0008=9090 s0: jmp short s 0016 EBF0 s1: mov ax, 0 0018 B80000 int 21h 001B CD21 Mov Ax, 0 001D B80000 S2: JMP Short S1 0020 EBF6 NOP 0022 90 Fin del código fin de la salida 1. Los dos puntos siguientes deben entenderse claramente 1. El proceso de ejecución de instrucciones de CPU es el siguiente: <1>. Lee la instrucción desde la unidad de memoria a la que apunta CS:IP y colócala en el búfer de instrucciones. <2>. IP=IP+La longitud de la instrucción que se está leyendo actualmente en el búfer, es decir, la IP apunta a la siguiente instrucción. <3>. Ejecuta el comando actual en el búfer. Ve al paso <1> 2. El significado del comando corto jmp para transferir el segmento interno <1>. IP es el desplazamiento, es decir, la dirección en el designador IP = - la dirección del primer byte después del comando jmp. <2>. La función de este comando es modificar el valor de IP y, tras ejecutar el comando, IP = IP + 8 bits de desplazamiento < 3> y 8 bits tienen un rango de desplazamiento de -128~127, y el desplazamiento se expresa en forma de complemento [2]. 2. Análisis de código 1. Paso 1: El programa comienza a ejecutarse desde el inicio de la entrada (código:0005), cuando se ejecuta la instrucción código:0013~0014, el código máquina de la instrucción jmp short S1 en la etiqueta S2 se copia al código:0008, y la IP es 0016. En este momento, asumiendo que no existe una instrucción jmp short s, el programa se ejecutará a s2:jmp short s1, leerá jmp short s1 en el búfer de instrucciones e IP=0022; y la transferencia de s2 a s1 es la transferencia intra-segmento, el formato del código máquina es EB disp, y disp=designación s1-designación s2=(00018-0022) complemento=F6, por lo que el código máquina del comando jmp short s1 debería ser EBF6. Por lo tanto, EBF6 se copia a la unidad code:0008~code:0009. 2. Paso 2: Lee la instrucción jmp short s (EBF0) en el búfer de instrucciones, IP=IP+0002=0018; el código de complemento de la designación s-designación s0=(0008-0018) = F0, y la transferencia de s0 a s es la transferencia intra-segmento, y el formato de código máquina es EB disp (es decir, EBF0) 3. Paso 3: El comando jmp short s(EBF0) es un comando para modificar la IP, tras ejecutar el comando EBF0, IP=IP+(designación s-designación s0)=0008, apuntando a la unidad código:0008. 4. Paso 4: Lee el contenido del código de unidad:0008. Dado que el comando jmp short s1 (EBF6) en s2 se copia al código:0008~code:0009 unidad, tras leer el contenido de la unidad, IP=IP+0002=000A 5. Paso 5: La instrucción jmp short s1 (EBF6) es un comando para modificar IP, tras ejecutar el comando EBF6, IP=IP+(designación s1-designación s2)=0000, apuntando al código:0000 unidad. 6. Paso 6: El programa va a code:0000 para ejecutarse, es decir, se completa el final normal. 3. Posdata Analizar correctamente este código: ¿Necesitas entender el proceso de ejecución de instrucciones de CPU y jmp short? (calculado mediante modificación de IP). Además, el código de complemento del resultado del cálculo del desplazamiento también es clave. Tras analizar este código aparentemente anormal, adquirí una comprensión más profunda de las instrucciones JMP en el ensamblador.
|