Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 15003|Svare: 0

[Demontering] Detaljert forklaring av bruken av assemblerkommando JMP

[Kopier lenke]
Publisert på 03.11.2014 23:32:49 | | |
Da jeg kom over følgende kode mens jeg lærte assembler, tenkte jeg rett og slett at programmet ikke kunne avsluttes normalt. Etter feilsøking med enkeltstegssporing ble det imidlertid oppdaget at programmet kunne avsluttes normalt, og et merkelig fenomen oppsto: da programmet begynte å kjøre fra kode:0005 til kode:0014, fortsatte det å hoppe til kode:0008 med kommandoen jmp. Men når man fortsetter å utføre et steg fremover, hopper programmet direkte til kode:0 i stedet for kode:0018 (dvs. segmentet for betegnelsen S1). Først forsto jeg ikke hva som foregikk, men etter mange enkeltstegsobservasjoner følte jeg meg fortsatt rar. Etter nøye å ha studert bruken av JMP-instruksjoner i læreboken [1], og deretter analysert programmet i kombinasjon med maskinkode, har jeg fått en ny forståelse av JMP-instruksjoner.

assemble code address offset (IP) maskininstruksjoner  

Anta CS:Code (enhet: H)

Kodesegment

        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: 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

Koden avsluttes

slutt start

1. De to følgende punktene må forstås klart
1. Prosessen med CPU-instruksjonsutførelse er som følger:
<1>. Les instruksjonen fra minneenheten som CS:IP peker på, og legg den inn i instruksjonsbufferen.
<2>. IP=IP+Lengden på instruksjonen som for øyeblikket leses inn i bufferen, det vil si at IP-en peker på neste instruksjon.
<3>. Utfør den nåværende kommandoen i bufferen. Gå til steg <1>
2. Betydningen av jmp short-kommandoen for å overføre det interne segmentet
<1>. IP er offset, det vil si adressen på IP = designator – adressen til den første byten etter jmp-kommandoen.
<2>. Funksjonen til denne kommandoen er å endre verdien av IP, og etter å ha utført kommandoen, IP = IP + 8-bits offset
< 3> og 8 biter har et forskyvningsområde på -128~127, og offset uttrykkes som komplement [2].
2. Kodeanalyse
1. Trinn 1: Programmet begynner å kjøre fra inngangsstarten (kode:0005), når kode:0013~0014-setningen kjøres, blir maskinkoden til setningen jmp short S1 på etiketten S2 kopiert til kode:0008, og IP-adressen er 0016. På dette tidspunktet, forutsatt at det ikke finnes noen jmp short s-instruksjon, vil programmet kjøres til s2:jmp short s1, lese jmp short s1 inn i instruksjonsbufferen og IP=0022; og overføringen fra s2 til s1 er intra-segmentoverføringen, maskinkodeformatet er EB disp, og disp=betegnelse s1-betegnelse s2=(00018-0022) komplement=F6, så maskinkoden til kommandoen jmp short s1 bør være EBF6. Derfor kopieres EBF6 til enheten kode:0008~kode:0009.
2. Trinn 2: Les instruksjonen jmp short s (EBF0) inn i instruksjonsbufferen,
IP=IP+0002=0018; komplementkoden til betegnelsen s0=(0008-0018) = F0, og overføringen fra s0 til s er intrasegmentoverføringen, og maskinkodeformatet er EB disp (dvs. EBF0)
3. Trinn 3: Kommandoen jmp short s(EBF0) er en kommando for å endre IP, etter å ha utført kommandoen EBF0, IP=IP+ (betegnelse s-betegnelse s0)=0008, som peker på kode:0008-enheten.
4. Trinn 4: Les innholdet i enhetskode:0008. Siden kommandoen jmp short s1 (EBF6) på s2 kopieres til kode:0008~kode:0009-enheten, etter å ha lest innholdet i enheten, IP=IP+0002=000A
5. Trinn 5: Instruksjon jmp short s1 (EBF6) er en kommando for å endre IP, etter å ha utført kommandoen EBF6, IP=IP+ (betegnelse s1-betegnelse s2)=0000, og peker på kode:0000-enheten.
6. Trinn 6: Programmet går til kode:0000 for å kjøre, det vil si at den normale slutten er fullført.
3. Etterskrift
Analysere denne koden korrekt: Trenger du å forstå prosessen med CPU-instruksjonskjøring og JMP-kortslutning? (beregnet ved IP-modifikasjon). I tillegg er komplementkoden til offset-beregningsresultatet også en nøkkel. Etter å ha analysert denne tilsynelatende unormale koden, fikk jeg en dypere forståelse av JMP-instruksjonene i assemblyen.





Foregående:Singles' Day "Sim Couple"-arrangement
Neste:Hvordan bruke abstrakt i Java i detalj
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com