Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 15003|Atbildi: 0

[Demontāža] Detalizēts skaidrojums par montāžas komandas JMP izmantošanu

[Kopēt saiti]
Publicēts 03.11.2014 23:32:49 | | |
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āžā.





Iepriekšējo:Vientuļnieku dienas "Sim Couple" pasākums
Nākamo:Kā detalizēti izmantot abstraktu Java
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com