Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 15003|Respuesta: 0

[Desmontaje] Explicación detallada del uso del comando ensamblador JMP

[Copiar enlace]
Publicado en 3/11/2014 23:32:49 | | |
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.





Anterior:Evento "Sim Couple" del Día de los Solteros
Próximo:Cómo usar abstracto en Java en detalle
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com