|
Kad es saskāros ar šādu kodu, mācoties montāžas valodu, es vienkārši domāju, ka programma nevar beigties normāli. Tomēr pēc atkļūdošanas viena soļa izsekošanas tika konstatēts, ka programma var beigties normāli, un radās dīvaina parādība: kad programma sāka izpildīt no code:0005 līdz code:0014, tā turpināja pāriet uz code:0008 ar jmp komandu. Tomēr, turpinot veikt soli uz priekšu, programma pāriet tieši uz kodu:0, nevis kodu:0018 (t.i., apzīmējuma S1 segmentu). Sākumā es nesapratu, kas notiek, bet pēc daudziem viena soļa novērojumiem es joprojām jutos dīvaini. Rūpīgi izpētot JMP instrukciju izmantošanu mācību grāmatā [1] un pēc tam analizējot programmu kombinācijā ar mašīnkodu, man ir jauna izpratne par JMP instrukcijām. salikt koda adreses nobīdes (IP) mašīnas instrukcijas Pieņemsim, ka cs:kods (vienība: h) koda segments MOV AX, 4C00H 0000 B8004C int 21h 0003 CD21 start: mov ax,0 0005 B80000 S: NOP 0008 90 NOP 0009 90 mov di, nobīde s 000A BF0800 mov si, nobīde s2 000D BE2000 mov ax,cs:[si] CS:0020=F6EB mov cs:[di],ax CS:0008=9090 s0: jmp īss s 0016 EBF0 S1: MOV AX,0 0018 B80000 int 21h 001B CD21 MOV AX,0 001D B80000 s2: jmp īss s1 0020 EBF6 NOP 0022 90 Kods beidzas Beigu sākums 1) Skaidri jāsaprot šādi divi aspekti 1. CPU instrukciju izpildes process ir šāds: <1>. Izlasiet instrukciju no atmiņas bloka, uz kuru norāda CS:IP, un ievietojiet to instrukciju buferī. <2>. IP=IP+Instrukcijas garums, kas pašlaik tiek nolasīts buferī, tas ir, IP norāda uz nākamo instrukciju. <3>. Izpildiet pašreizējo komandu buferī. Pārejiet uz <1. darbību> 2. Īsās komandas jmp nozīme iekšējā segmenta pārsūtīšanai <1>. IP ir nobīde, tas ir, adrese IP = apzīmējumā - pirmā baita adrese pēc jmp komandas. <2>. Šīs komandas funkcija ir modificēt IP vērtību, un pēc komandas izpildes IP = IP + 8 bitu nobīde < 3> un 8 bitu pārvietojuma diapazons ir -128 ~ 127, un nobīde ir izteikta komplementa veidā [2]. 2. Koda analīze 1. 1. solis: Programma sāk darboties no ieejas sākuma (kods: 0005), kad tiek izpildīts kods: 0013 ~ 0014 paziņojums, paziņojuma jmp īsā S1 mašīnas kods pie etiķetes S2 tiek kopēts uz kodu: 0008, un IP ir 0016. Šobrīd, pieņemot, ka nav jmp īsās s instrukcijas, programma tiks izpildīta uz s2:jmp short s1, nolasīs jmp short s1 instrukciju buferī un IP=0022; un pārsūtīšana no s2 uz s1 ir segmenta iekšējā pārsūtīšana, mašīnas koda formāts ir EB disp un disp=apzīmējums s1-apzīmējums s2=(00018-0022) complement=F6, tāpēc komandas jmp short s1 mašīnas kodam jābūt EBF6. Tāpēc EBF6 tiek kopēts uz kodu:0008~kods:0009 vienība. 2. 2. solis: nolasiet instrukciju jmp īss (EBF0) instrukciju buferī, IP=IP+0002=0018; apzīmējuma s-apzīmējuma komplementa kods s0=(0008-0018) = F0, un pārsūtīšana no s0 uz s ir segmenta iekšējā pārsūtīšana, un mašīnas koda formāts ir EB disp (t.i., EBF0) 3. 3. solis: komanda jmp short s(EBF0) ir komanda, lai modificētu IP pēc komandas EBF0, IP=IP+(apzīmējums s-apzīmējums s0)=0008, norādot uz kodu:0008 vienība. 4. 4. solis: izlasiet vienības koda saturu: 0008. Tā kā komanda jmp short s1 (EBF6) pie s2 tiek kopēta uz kodu: 0008 ~ kods: 0009 vienība, pēc vienības satura nolasīšanas IP=IP+0002=000A 5. 5. solis: Instrukcija jmp īss s1 (EBF6) ir komanda, lai modificētu IP, pēc komandas EBF6 izpildes, IP=IP+(apzīmējums s1-apzīmējums s2)=0000, norādot uz kodu:0000 vienība. 6. 6. solis: Programma dodas uz kodu: 0000, lai izpildītu, tas ir, normālais gals ir pabeigts. 3. Pēcraksts Pareizi analizējiet šo kodu: Nepieciešams saprast CPU instrukciju izpildes procesu un jmp īss? (aprēķināts pēc IP izmaiņām). Turklāt atslēga ir arī nobīdes aprēķina rezultāta papildinājuma kods. Analizējot šo šķietami nenormālo kodu, es ieguvu dziļāku izpratni par JMP instrukcijām montāžā.
|