Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

mov dword ptr? Sta se desava?

[es] :: Asembler :: mov dword ptr? Sta se desava?

[ Pregleda: 1974 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 891
*.sksyu.net.



+171 Profil

icon mov dword ptr? Sta se desava?22.09.2006. u 21:05 - pre 169 meseci
U C++(2005) imam sledeci kod.

Code:

#include<iostream>

//global variable
int g_One=1;

//function prototype
void func(int& pInt);

int main()
{
    int nvar=2;
    int* pvar=&nvar;
    
    func(*pvar);    
    std::cout<<*pvar<<std::endl;

    return 0;
}

void func(int& pInt)
{
    pInt=g_One;
}


U disassembly-u za func funkciju dobijem sledeci assembly code

Code:

void func(int& pInt)
{    
004114F0  push        ebp  
004114F1  mov         ebp,esp 
004114F3  sub         esp,0C0h 
004114F9  push        ebx  
004114FA  push        esi  
004114FB  push        edi  
004114FC  lea         edi,[ebp-0C0h] 
00411502  mov         ecx,30h 
00411507  mov         eax,0CCCCCCCCh 
0041150C  rep stos    dword ptr es:[edi] 
    pInt=g_One;
0041150E  mov         eax,dword ptr [pInt] 
00411511  mov         ecx,dword ptr [g_One (417004h)] 
00411517  mov         dword ptr [eax],ecx 
}


Muci me sledeca linija
Code:

mov         eax,dword ptr [pInt] 


U mom slucaju adresa pInt je na lokaciji 0x0012ff60 a vrednost sledeca 4 bajta sa te lokacije je 2. Kada se izvrsi
mov instrukcija u registru eax se nalazi vrednost 0x0012ff60 a ne 2. Zasto?

 
Odgovor na temu

Mikky

Član broj: 18
Poruke: 1563
*.dynamic.sbb.co.yu.

ICQ: 44582291


+58 Profil

icon Re: mov dword ptr? Sta se desava?22.09.2006. u 22:30 - pre 169 meseci
To je i mene jednom mucilo, naime

ovaj kod u eax stavlja promenljivu koja se nalazi na adresi koju sadrzi ecx
Code:

mov         eax,[ecx]

Npr ako na adresi 100h imamo broj 2 i ako ecx=100h, onda ce ovaj kod eax registru dodeli vrednost 2

Dok ovaj kod u eax stavlja vrednost promenljive pInt, dakle ne vrednost promenljive na koju pokazuje pInt
Code:

mov         eax,dword ptr [pInt] 

Npr ako na adresi 100h imamo broj 2 i ako pInt=100h, onda ce ovaj kod eax registru dodeli vrednost 100h

Ovaj prethodni kod je u stvari ekvivalentan ovom
Code:

mov         eax,pInt


Razlog za sve ovo je sto x86 arhitektura ne moze da pointere direktno dereferencira iz memorije nego samo iz registara, zato ona funkcija ima 3 instrukcije u asm dok samo jednu u c++. Tako da mora prvo da sadrzaj pointera smesti u registar pa onda da radi sa vrednostima na koje pokazuje registar. Problem je samo sto su ostavili takvu asm sintaksu koja omogucuje ovakve zabune, bolje bi bilo da su zabranili "dword ptr [MEMORIJA]" tip instrukcija ali eto...
Nadam se da je sad malo jasnije.
-I know UNIX, PASCAL, C, FORTRAN,
COBOL, and nineteen other high-tech
words.
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 891
*.sksyu.net.



+171 Profil

icon Re: mov dword ptr? Sta se desava?23.09.2006. u 10:16 - pre 169 meseci
Hvala na odgovru. No stvar je u sledecem
Citat:

Npr ako na adresi 100h imamo broj 2 i ako pInt=100h, onda ce ovaj kod eax registru dodeli vrednost 100h


Ovo mi je jasno. Ali problem je bio sto je, kada sam debugirao, pInt nosio vrednost 2 a adresa na koju se on nalazio je 0x0012ff60. Ili prevedeno u onom tvom primeru pInt = 2 a njegova adresa 100h. Znaci nema nikakve zabune, mov je trebao da ubaci u eax vrednost koja se nalazila na lokaciji 0x0012ff60 sto je 2, ali iz nekog razloga je instrukcija stavljala vrednost 0x0012ff60. Problem je bio sto sam ja radio debuging iz VS koji ne pokazuje tacno gde se nalazi fizicki adresa argumenta, radi svrhe debugiranja.
Konacno, "misteriju" sam resio tako sto sam disasemblovao exe u nekom free programu koji sam nasao na net-u. Odavde se videlo tacno kako je prosledjeni argument ucitan sa steka, sto se u VS, naravno, ne vidi. Ovo je bio moj propust jer sam zaboravio da promnljiva ne moze tek tako da se stvori u funkciji (pInt) nego da se mora ucitati sa steka.
 
Odgovor na temu

[es] :: Asembler :: mov dword ptr? Sta se desava?

[ Pregleda: 1974 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.