Gå til innhold

Assembly: Hvordan fungerer Flyttallsinstruksjoner (Intel)?


Anbefalte innlegg

Hei!

 

Jeg ønsker å finne ut hvordan flyt-tall (float) blir behandlet i Pentiumsystemer.

 

Jeg har følgende C-program:

 

void main(){
float t1, t2, sum;
t1=5.25;
t2=6.75;
sum=t1+t2;
}

 

Jeg prøver å se hva assemblykoden sier om flyttalsbehandlingen, men skjønner ikke helt hva som skjer. Har skjønt hvordan tilsvarende kode med heltall fungerer, men med float blir det straks litt værre. Jeg får følgende relevante Assembly kode.

 

void main(){
00B41370  push		ebp  
00B41371  mov		 ebp,esp 
00B41373  sub		 esp,0E4h 
00B41379  push		ebx  
00B4137A  push		esi  
00B4137B  push		edi  
00B4137C  lea		 edi,[ebp+FFFFFF1Ch] 
00B41382  mov		 ecx,39h 
00B41387  mov		 eax,0CCCCCCCCh 
00B4138C  rep stos	dword ptr es:[edi] 
[b]float t1, t2, sum;
t1=5.25;
00B4138E  fld		 dword ptr ds:[00B45740h] 
00B41394  fstp		dword ptr [ebp-8] 
t2=6.75;
00B41397  fld		 dword ptr ds:[00B4573Ch] 
00B4139D  fstp		dword ptr [ebp-14h] 
sum=t1+t2;
00B413A0  fld		 dword ptr [ebp-8] 
00B413A3  fadd		dword ptr [ebp-14h] 
00B413A6  fstp		dword ptr [ebp-20h] [/b]
}

 

Den uthevede skriften er det jeg ikke skjønner helt! Er det noen her som kunne kaste litt lys over situasjonen?

 

Tusen takk!

Lenke til kommentar
Videoannonse
Annonse

Kan forresten anbefale den boken de bruker i kurset over, inf2270 datamaskinarkitektur, på det varmeste. http://csapp.cs.cmu.edu/ Computer systems a programmers perspective

 

Jeg kunne egentlig ikke så mye om hvordan hardwaren fungerte på lavnivå eller assembler-koding og sånt, men den boken var utrolig intuitiv og forklarer det meste på en lettvindt måte. Det er verken en ren hardware-bok eller assembler-bok eller c-bok, men den blander alt så du får innsikt i hvordan du kan skrive assembler og c-kode for å best utnytte den underliggende hardwaren, spesielt prosessoren og rammen/cachen. Det er vel faktisk mer C-kode i boken enn assembler, men du kommer til å forstå x86-assembler på et veldig basic grunnlag når du er ferdig og du kommer til å være en mye bedre C-programmerer når du vet hvordan kompilatoren og prosessoren oversetter C-koden til maskinkode. Spesielt kapittel 5 som handler om optimalisering av C-kode er morsomt. Hvis du er interessert i å lære mer om dette er denne boken definitivt en bra investering. Og du ser de fleste som har reviewet den syns det samme.

Lenke til kommentar
  • 2 uker senere...

Her står alt du trenger å vite: http://www.ray.masmcode.com/tutorial/index.html

 

void main() {
 float t1, t2, sum;
 t1=5.25;
 t2=6.75;
 sum=t1+t2;
}

 

t1 = 5.25

; last inn 5.25 på fpu-stakk, forutsetter at kompilatoren har lagret 5.25 som flyttall et annet sted i minnet på forhånd.
; fpu-instruksjonene tar ikke konstanter, kun variabler, så konstanter må emuleres som variabler av kompilatoren
fld dword [memaddress_of_constant_5.25]
; ta 5.25 av fpu-stakk og lagre i t1
fstp dword [memaddress_of_t1]

 

Samme som over, men med heltall:

push dword [verdi]
pop dword [t1]

 

 

sum=t1+t2; (mer tydelig men mindre effektiv versjon enn din)

fld dword [v_t1]; last inn t1 på fpu-stakk
fld dword [v_t2]; last inn t2 på fpu-stakk
faddp; summer de to øverste på fpu-stakk, pop fpu-stakk og lagre summen på toppen av fpu-stakk
fstp dword [v_sum]; pop fpu-stakk og lagre i sum

Lenke til kommentar
  • 3 måneder senere...

Historisk sett var det egne prosessorer for operasjoner på flyttall. Intel kom ut med f eks x87 som skulle jobbe i samarbeid med diverse x86. I dag er flyttallprosessoren innebygget i x86, men operasjoner blir fortsatt utført på to separate prosessorer. Derfor vil bl a flyttallprosessoren ikke ha direkte tilgang til flagg i x86 ved bruk av jumping f eks; du må overføre flaggene før du kan sjekke dem i x86. Har om dette nå på uio så er ikke helt 100 %. Rett meg om jeg tar feil! :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...