|
Quando me deparei com o código a seguir enquanto aprendia linguagem assembly, simplesmente pensei que o programa não poderia terminar normalmente. No entanto, após o rastreamento de depuração em um passo, descobriu-se que o programa podia terminar normalmente, e um fenômeno estranho ocorreu: quando o programa começava a ser executado do código:0005 para o código:0014, ele continuava a saltar para o código:0008 com o comando jmp. No entanto, ao continuar a realizar um passo à frente, o programa salta diretamente para o código:0 em vez do código:0018 (ou seja, o segmento do designador S1). No começo, eu não entendia o que estava acontecendo, mas depois de muitas observações rápidas, ainda me senti estranho. Depois de estudar cuidadosamente o uso das instruções JMP no livro didático [1], e depois analisar o programa em combinação com código de máquina, tenho uma nova compreensão das instruções JMP. Instruções de máquina com deslocamento de endereço de código de montagem (IP) Assuma CS:Code (Unidade: 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, offset s2 000D BE2000 mov ax,cs:[si] CS:0020=F6EB mov cs:[di],ax CS:0008=9090 s0: curto JMP 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 Fim do código fim do início 1. Os dois pontos seguintes precisam ser compreendidos claramente 1. O processo de execução das instruções da CPU é o seguinte: <1>. Leia a instrução da unidade de memória apontada pelo CS:IP e a coloque no buffer de instruções. <2>. IP=IP+O comprimento da instrução que está sendo lida no buffer, ou seja, o IP aponta para a próxima instrução. <3>. Execute o comando atual no buffer. Vá para o passo <1> 2. O significado do comando jmp short para transferir o segmento interno <1>. IP é o deslocamento, ou seja, o endereço no designador IP = - o endereço do primeiro byte após o comando jmp. <2>. A função desse comando é modificar o valor de IP e, após executar o comando, IP = IP + deslocamento de 8 bits < 3> e 8 bits têm uma faixa de deslocamento de -128~127, e o deslocamento é expresso na forma de complemento [2]. 2. Análise de código 1. Passo 1: O programa começa a ser executado desde o início da entrada (código:0005), quando a instrução code:0013~0014 é executada, o código de máquina da instrução jmp short S1 na etiqueta S2 é copiado para o code:0008, e o IP é 0016. Neste momento, assumindo que não há instrução jmp short s, o programa será executado para s2:jmp short s1, lê jmp short s1 no buffer de instruções e IP=0022; e a transferência de s2 para s1 é a transferência intra-segmento, o formato do código máquina é EB disp, e disp=designação s1-designação s2=(00018-0022) complemento=F6, então o código máquina do comando jmp short s1 deve ser EBF6. Portanto, o EBF6 é copiado para a unidade código:0008~código:0009. 2. Passo 2: Leia a instrução jmp short s (EBF0) no buffer de instrução, IP=IP+0002=0018; o código de complemento da designação s-designação s0=(0008-0018) = F0, e a transferência de s0 para s é a transferência intra-segmento, e o formato do código máquina é EB disp (ou seja, EBF0) 3. Passo 3: O comando jmp short s(EBF0) é um comando para modificar o IP, após executar o comando EBF0, IP=IP+(designação s-designação s0)=0008, apontando para a unidade código:0008. 4. Passo 4: Leia o conteúdo do código da unidade:0008. Como o comando jmp short s1 (EBF6) em s2 é copiado para a unidade code:0008~code:0009, após ler o conteúdo da unidade, IP=IP+0002=000A 5. Passo 5: A instrução jmp short s1 (EBF6) é um comando para modificar o IP, após executar o comando EBF6, IP=IP+(designação s1-designação s2)=0000, apontando para o código:0000 unidade. 6. Passo 6: O programa vai para o código:0000 para executar, ou seja, o fim normal é concluído. 3. Pós-escrito Analise corretamente este código: Precisa entender o processo de execução de instruções da CPU e o curto jmp? (calculado por modificação de IP). Além disso, o código de complemento do resultado do cálculo do deslocamento também é fundamental. Após analisar esse código aparentemente anormal, adquiri uma compreensão mais profunda das instruções JMP na assembleia.
|