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