Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 15003|Resposta: 0

[Desmontagem] Explicação detalhada do uso do comando assembly JMP

[Copiar link]
Publicado em 03/11/2014 23:32:49 | | |
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.





Anterior:Evento "Sim Couple" do Dia dos Solteiros
Próximo:Como usar abstrato em Java em detalhes
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com