380 likes | 518 Views
Arhitektura računara. GLAVA 3 Napredne tehnike u računarskim arhitekturama. Timarac Igor, 2006. 3.1 Numerički koprocesor. Razlikujemo dva tipa implementacije numeričkih koprocesora u računarskim sistemima i to: Pridodati (attached) koprocesor
E N D
Arhitektura računara GLAVA 3 Napredne tehnike u računarskim arhitekturama Timarac Igor, 2006
3.1 Numerički koprocesor • Razlikujemo dva tipa implementacije numeričkih koprocesora u računarskim sistemima i to: • Pridodati (attached) koprocesor • Koprocesor je realizovan u zasebnom integrisanom kolu koje je pridodato procesoru • Karakteristično za starije Intelove procesore • (8086+8087, 80286+80287, 80386SX+80387SX, 80386DX+80387DX, 80486SX+80487SX) • Ugrađeni (built-in) koprocesor • koprocesor je integrisan (ugrađen) u CPU • karakteristično za 80486DX i Pentium procesore
3.1.1 Arhitektura numeričkog koprocesora • Čine ga dvije sekcije: • Upravljačka jedinica (Control Unit) • Numerička izvršna jedinica (Numeric Execution Unit) • Posjeduje 8-registarski stek • Registri steka su 80-bitni i u njima se drže operandi i rezultati
3.1.1 Arhitektura numeričkog koprocesora • Statusni registar • Sadrži statusnu informaciju o koprocesoru • Statusnom registru pristupa se instrukcijom FSTSW, koja kopira sadržaj statusnog registra u odgovarajuću riječ u memoriji, odnosno FSTSW AX instrukcijom (80287 i noviji), koja statusnu informaciju koprocesora direktno upisuje u AX registar procesora • Učitavanjem statusne informacije u AX lako se testira stanje pojedinih statusnih bita • Struktura statusnog registra
C3-C0 3.1.1 Arhitektura numeričkog koprocesora
3.1.1 Arhitektura numeričkog koprocesora • Postoje 2 načina da se testiraju biti u statusnom registru: • Učitati statusnu informaciju u AX pomoću FSTSW instrukcije, a zatim pomoću TEST instrukcije testirati odgovarajući bit • Primjer: FDIV BROJ ; dijeli podatak na vrhu steka s podatkom BROJ FSTSW AX ; učitava statusnu informaciju u AX TEST AX,4 ; testira ZE bit (bit 2 statusnog registra) JNZ GRESKA ; ako ima greška (bit je setovan) skoči • Primjer: FSQRT ; traži drugi korijen podatka na vrhu steka FSTSW AX ; učitava statusnu informaciju u AX TEST AX,1 ; testira IE bit (bit 0 statusnog registra) JNZ GRESKA ; ako ima greška (bit je setovan) skoči
3.1.1 Arhitektura numeričkog koprocesora • Postoje 2 načina da se testiraju biti u statusnom registru: • Učitati statusnu informaciju u AX pomoću FSTSW instrukcije, a zatim pomoću SAHF instrukcije izvršiti prenos viših 8 bita (AH) u registar stanja (flegove), a potom koristiti instrukcije uslovnog skoka (JE, JB ...) • Primjer: FCOM BROJ ; poredi podatak na vrhu steka s BROJem FSTSW AX ; učitava statusnu informaciju u AX SAHF ; kopira AH u flegove JE JEDNAKO ; skače zavisno od stanja JB MANJE JA VECE
3.1.1 Arhitektura numeričkog koprocesora NOVO • P6 familija mikroprocesora ima sljedeće instrukcije: • FCOMI • FCOMIP • One direktno utiču na EFLAGS registar, tako da nema potrebe za FSTSW i SAHF instrukcijama u prethodnom slučaju: FCOMI BROJ ; poredi podatak na vrhu steka s BROJem JE JEDNAKO ; skače zavisno od stanja JB MANJE JA VECE
3.1.1 Arhitektura numeričkog koprocesora • Kontrolni registar • Selektuje preciznost, način zaokruživanja i kontrolu beskonačnosti • Upravljačka informacija upisuje se u kontrolni registar pomoću FLDCW instrukcije, a registar se očitava pomoću instrukcije FSTCW
3.1.1 Arhitektura numeričkog koprocesora • Tag registar • Pokazuje status svakog od registara internog koprocesorskog steka.
3.1.2 Instrukcijski set numeričkog koprocesora • Instrukcije za prenos podataka FLOATING POINT • FLD Učitava floating point podatak iz memorije i smješta ga na vrh internog steka Nakon toga pokazivač vrha steka (ST) uvećava se za 1 Podatak može da se učita iz neke memorijske lokacije ili nekog od registara koprocesora FLD ST(2) ; kopira sadržaj reg 2 steka na vrh steka FLD BROJ ; kopira sadržaj lokacije BROJ na vrh steka • FST Kopira podatak sa vrha steka u memoriju ili naznačeni registar koproc. • FSTP Skida podatak sa vrha steka i upisuje ga u memoriju ili naznačeni registar koprocesora • FXCH vrši zamjenu sadržaja datog registra i vrha steka FXCH ST(3) ; mijenja sadržaj vrha steka i registra 3
3.1.2 Instrukcijski set numeričkog koprocesora • Instrukcije za prenos podataka INTEGER • FILD Učitava integer podatak iz memorije i smješta ga na vrh internog steka • FIST Kopira podatak sa vrha steka u memoriju • FISTP Skida podatak sa vrha steka i upisuje ga u memoriju
.model small .286 .287 .data broj1 dd 30.0 ; obična preciznost broj2 dq 100.25 ; dvostruka prec. broj3 dt 32.4567 ; proširena preciznost broj4 dw 10 ; 16-bitni integer broj5 dd 20 ; 32-bitni integer broj6 dq 30 ; 64-bitni integer broj7 dt 30 ; bcd podatak .code .startup fld broj1 fld broj2 fld broj3 fild broj4 fild broj5 fild broj6 fbld broj7 .exit end 3.1.2 Instrukcijski set numeričkog koprocesora • Instrukcije za prenos podataka BCD • FBLD Učitava integer podatak iz memorije i smješta ga na vrh internog steka • FBST Kopira podatak sa vrha steka u memoriju • FBSTP Skida podatak sa vrha steka i upisuje ga u memoriju
3.1.2 Instrukcijski set numeričkog koprocesora • Aritmetičke instrukcije • Oblici adresiranja u aritmetičkim instrukcijama: • Stek • Uzima podatak sa vrha steka, tj ST (izvorni operand) i podatak neposredno ispod vrha steka, tj. ST(1) (odredišni operand) Primjer: FADD ; skida podatak sa vrha steka, sabira ga sa sljedećim ; i umjesto njega upisuje zbir (sada je zbir na vrhu steka) • Registarsko • Uzima podatak sa vrha steka i podatak iz nekog od registara steka ST(n), n=0..7 Primjer: FADD ST, ST(2) FADD ST(2), ST
3.1.2 Instrukcijski set numeričkog koprocesora • Aritmetičke instrukcije • Memorija • Uzima podatak sa vrha steka i podatak iz memorije Primjer: FADD BROJ
3.1.2 Instrukcijski set numeričkog koprocesora • Aritmetičke instrukcije SABIRANJE FADD ; ST(1) + ST => ST(1) i skida ST sa steka FADD ST(i), ST ; ST(i) + ST => ST(i) FADDP ST(i), ST ; ST(i) + ST => ST(i) i skida ST sa steka FADD ST, ST(i) ; ST + ST(i) => ST FADD fp_mem ; ST + fp_mem (adresa FP podatka) => ST FIADD int_mem ; ST + int_mem (adresa Integer podatka) => ST
3.1.2 Instrukcijski set numeričkog koprocesora • Aritmetičke instrukcije ODUZIMANJE FSUB ; ST(1) - ST => ST(1) i skida ST sa steka FSUB ST(i), ST ; ST(i) - ST => ST(i) FSUBP ST(i), ST ; ST(i) - ST => ST(i) i skida ST sa steka FSUB ST, ST(i) ; ST - ST(i) => ST FSUB fp_mem ; ST - fp_mem (adresa FP podatka) => ST FISUB int_mem ; ST - int_mem (adresa Integer podatka) => ST FSUBR ; ST - ST(1) => ST(1) i skida ST sa steka FSUBR ST(i), ST ; ST - ST(i) => ST(i) FSUBRP ST(i), ST ; ST - ST(i) => ST(i) i skida ST sa steka FSUBR ST, ST(i) ; ST(i)- ST => ST FSUBR fp_mem ; fp_mem (adresa FP podatka) - ST => ST FISUB int_mem ; int_mem (adresa Integer podatka) - ST=> ST
3.1.2 Instrukcijski set numeričkog koprocesora • Aritmetičke instrukcije MNOŽENJE FMUL ; ST(1) * ST => ST(1) i skida ST sa steka FMUL ST(i), ST ; ST(i) * ST => ST(i) FMULP ST(i), ST ; ST(i) * ST => ST(i) i skida ST sa steka FMUL ST, ST(i) ; ST * ST(i) => ST FMUL fp_mem ; ST * fp_mem (adresa FP podatka) => ST FIMUL int_mem ; ST * int_mem (adresa Integer podatka) => ST
3.1.2 Instrukcijski set numeričkog koprocesora • Aritmetičke instrukcije DIJELJENJE FDIV ; ST(1) / ST => ST(1) i skida ST sa steka FDIV ST(i), ST ; ST(i) / ST => ST(i) FDIVP ST(i), ST ; ST(i) / ST => ST(i) i skida ST sa steka FDIV ST, ST(i) ; ST / ST(i) => ST FDIV fp_mem ; ST / fp_mem (adresa FP podatka) => ST FIDIV int_mem ; ST / int_mem (adresa Integer podatka) => ST FDIVR ; ST / ST(1) => ST(1) i skida ST sa steka FDIVR ST(i), ST ; ST / ST(i) => ST(i) FDIVRP ST(i), ST ; ST / ST(i) => ST(i) i skida ST sa steka FDIVR ST, ST(i) ; ST(i)/ ST => ST FDIVR fp_mem ; fp_mem (adresa FP podatka) / ST => ST FIDIV int_mem ; int_mem (adresa Integer podatka) / ST=> ST
3.1.2 Instrukcijski set numeričkog koprocesora • Aritmetičke instrukcije FSQRT ; podatak na vrhu steka mijenja njegovim drugim korijenom FSCALE ; dodaje ST(1) (posmatran kao integer) eksponentu podatka na ; vrhu steka (što je ekvivalentno brzom množenju ili dijeljenju ; nekim stepenom broja 2) FPREM ; dijeli ST po modulu ST(1) i ostatak ostavlja na ST(1), što je novi ST FRNDINT ; zaokružuje vrh steka na integer FXTRACT ; rastavlja floating point podatak sa vrha steka na eksponent i mantisu, ; mantisa je na vrhu, a nemodifikovani eksponent naST(1) FABS ; podatak na vrhu steka mijenja njegovom apsolutnom vrijednošću FCHS ; mijenja znak podatka na vrhu steka (pozitivan u negativan i obrnuto)
3.1.2 Instrukcijski set numeričkog koprocesora • Instrukcije poređenja • Porede podatak sa vrha steka sa drugim elementom, a rezultat se vraća u statusnom registru pomoću bitova C3-C0 FCOM ; poredi vrh steka (ST) s nekom mem. lokacijom ili registrom. Ako se ; ne referencira poseban podatak uzima se ST(1) FCOMP ; isto kao i FCOM, samo što skida podatak sa steka FCOMPP ; isto kao i FCOM, samo što skida dva podatka sa steka FICOM ; poredi ST sa integerom iz memorije FICOMP ; isto kao i FICOM, samo što skida podatak sa steka FTST ; provjerava ST u odnosu na nulu FXAM ; provjerava ST (postavlja C3-C0 u statusnom registru u zavisnosti od ; vrijednosti ST)
3.1.2 Instrukcijski set numeričkog koprocesora • Transcendentalne operacije FTAN ; parcijalni tangens Y/X = tg θ ; ulaz:ST = θ (u radijanima) ; rezultat: ST = X, ST(1) = Y FPATAN ; parcijalni arkus tangens θ= arctg(Y/X) ; ulaz: ST = X, ST(1) = Y (0<=Y<X< θ) ; rezultat: skida X, a umjesto Y upisuje rezultat θ F2XM1 ; 2X-1 ; ulaz: ST = X ; rezultat: ST = 2X-1 log210, log2e su ugrađene konstante
3.1.2 Instrukcijski set numeričkog koprocesora • Transcendentalne operacije FSIN ; mijenja ugao na vrhu steka θ (u radijanima) sa sinθ FCOS ; mijenja ugao na vrhu steka θ (u radijanima) sa cosθ FSINCOS ; traži sinθ i cosθ ugla θ sa vrha steka (u radijanima) i ; ostavlja ST = sinθ i ST(1) = cosθ FYL2X; Ylog2X ; ulaz: ST = X, ST(1) = Y ; rezultat: skida X, a umjesto Y upisuje Ylog2X FYL2XP1 ; Ylog2(X+1) ; ulaz: ST = X, ST(1) = Y ; rezultat: skida X, a umjesto Y upisuje Ylog2(X+1)
3.1.2 Instrukcijski set numeričkog koprocesora • Operacije s konstantama Instrukcije koje na stek stavljaju odgovarajuću konstantu
3.1.2 Instrukcijski set numeričkog koprocesora • Upravljačke instrukcije FINIT/FNINIT ; resetuje i inicijalizuje koprocesor FLDCW ; puni kontrolni registar odgovarajućom upravljačkom ; informacijom adresiranom datim operandom FSTCW/FNSTCW ; pohranjuje kontrolni registar u datu memorijsku ; lokaciju tipa WORD FSTSW AX/FNSTSW AX ; kopira sadržaj statusnog registra u AX registar FINCST ; inkrementira ST FDECST ; dekrementira ST FNOP ; No OPeration za koprocesor FWAIT ; procesor čeka da koprocesor završi operaciju ; ovu instrukciju treba koristiti prije pristupa nekoj ; memorijskoj lokaciji od strane procesora koju koristi
.model small .286 .287 .data rad dd 1.0, 2.0, 3.0, 4.0, 5.0 povrsine dd 5 dup (?) obimi dd 5 dup (?) dva dd 2.0 .code .startup mov si,0 mov cx,5 petlja: fld rad[si] ; st <= r fmul st,st(0) ; st <= r * r fldpi ; st(1) <= r*r, st <= pi fmul ; st <= pi * r*r ; pohrani povrsinu i skini sa steka: fstp povrsine[si] fld rad[si] ; st <= r fmul dva ; st <= 2*r fldpi ; st(1) <= 2*r, st <= pi fmul ; st <= pi * 2*r ; pohrani obim i skini sa steka: fstp obimi[si] add si,4 loop petlja .exit end 3.1.2 Instrukcijski set numeričkog koprocesora • Primjer: Napisati asemblerski program koji računa površine i obime krugova čiji se radijusi nalaze u intervalu [1..5] s korakom 1, a rezultate smješta u nizove POVRSINE i OBIMI.
.model small .286 .287 .data rad dd 1.0, 2.0, 3.0, 4.0, 5.0 povrsine dd 5 dup (?) obimi dd 5 dup (?) dva dd 2.0 .code .startup mov si,0 mov cx,5 petlja: fld rad[si] ; st <= r fmul st,st(0) ; st <= r * r fldpi ; st(1) <= r*r, st <= pi fmul ; st <= pi * r*r ; pohrani povrsinu i skini sa steka: fstp povrsine[si] fld rad[si] ; st <= r fmul dva ; st <= 2*r fldpi ; st(1) <= 2*r, st <= pi fmul ; st <= pi * 2*r ; pohrani obim i skini sa steka: fstp obimi[si] add si,4 loop petlja .exit end 3.1.2 Instrukcijski set numeričkog koprocesora • Primjer: Napisati asemblerski program koji računa površine i obime krugova čiji se radijusi nalaze u intervalu [1..5] s korakom 1, a rezultate smješta u nizove POVRSINE i OBIMI. 3.0 ST Korak: SI = 3 ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)
.model small .286 .287 .data rad dd 1.0, 2.0, 3.0, 4.0, 5.0 povrsine dd 5 dup (?) obimi dd 5 dup (?) dva dd 2.0 .code .startup mov si,0 mov cx,5 petlja: fld rad[si] ; st <= r fmul st,st(0) ; st <= r * r fldpi ; st(1) <= r*r, st <= pi fmul ; st <= pi * r*r ; pohrani povrsinu i skini sa steka: fstp povrsine[si] fld rad[si] ; st <= r fmul dva ; st <= 2*r fldpi ; st(1) <= 2*r, st <= pi fmul ; st <= pi * 2*r ; pohrani obim i skini sa steka: fstp obimi[si] add si,4 loop petlja .exit end 3.1.2 Instrukcijski set numeričkog koprocesora • Primjer: Napisati asemblerski program koji računa površine i obime krugova čiji se radijusi nalaze u intervalu [1..5] s korakom 1, a rezultate smješta u nizove POVRSINE i OBIMI. 9.0 ST Korak: SI = 3 ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)
.model small .286 .287 .data rad dd 1.0, 2.0, 3.0, 4.0, 5.0 povrsine dd 5 dup (?) obimi dd 5 dup (?) dva dd 2.0 .code .startup mov si,0 mov cx,5 petlja: fld rad[si] ; st <= r fmul st,st(0) ; st <= r * r fldpi ; st(1) <= r*r, st <= pi fmul ; st <= pi * r*r ; pohrani povrsinu i skini sa steka: fstp povrsine[si] fld rad[si] ; st <= r fmul dva ; st <= 2*r fldpi ; st(1) <= 2*r, st <= pi fmul ; st <= pi * 2*r ; pohrani obim i skini sa steka: fstp obimi[si] add si,4 loop petlja .exit end 3.1.2 Instrukcijski set numeričkog koprocesora • Primjer: Napisati asemblerski program koji računa površine i obime krugova čiji se radijusi nalaze u intervalu [1..5] s korakom 1, a rezultate smješta u nizove POVRSINE i OBIMI. 3.141592653589 ST Korak: SI = 3 9.0 ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)
.model small .286 .287 .data rad dd 1.0, 2.0, 3.0, 4.0, 5.0 povrsine dd 5 dup (?) obimi dd 5 dup (?) dva dd 2.0 .code .startup mov si,0 mov cx,5 petlja: fld rad[si] ; st <= r fmul st,st(0) ; st <= r * r fldpi ; st(1) <= r*r, st <= pi fmul ; st <= pi * r*r ; pohrani povrsinu i skini sa steka: fstp povrsine[si] fld rad[si] ; st <= r fmul dva ; st <= 2*r fldpi ; st(1) <= 2*r, st <= pi fmul ; st <= pi * 2*r ; pohrani obim i skini sa steka: fstp obimi[si] add si,4 loop petlja .exit end 3.1.2 Instrukcijski set numeričkog koprocesora • Primjer: Napisati asemblerski program koji računa površine i obime krugova čiji se radijusi nalaze u intervalu [1..5] s korakom 1, a rezultate smješta u nizove POVRSINE i OBIMI. 28.27433388230 ST Korak: SI = 3 ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)
.model small .286 .287 .data rad dd 1.0, 2.0, 3.0, 4.0, 5.0 povrsine dd 5 dup (?) obimi dd 5 dup (?) dva dd 2.0 .code .startup mov si,0 mov cx,5 petlja: fld rad[si] ; st <= r fmul st,st(0) ; st <= r * r fldpi ; st(1) <= r*r, st <= pi fmul ; st <= pi * r*r ; pohrani povrsinu i skini sa steka: fstp povrsine[si] fld rad[si] ; st <= r fmul dva ; st <= 2*r fldpi ; st(1) <= 2*r, st <= pi fmul ; st <= pi * 2*r ; pohrani obim i skini sa steka: fstp obimi[si] add si,4 loop petlja .exit end 3.1.2 Instrukcijski set numeričkog koprocesora • Primjer: Napisati asemblerski program koji računa površine i obime krugova čiji se radijusi nalaze u intervalu [1..5] s korakom 1, a rezultate smješta u nizove POVRSINE i OBIMI. ST Korak: SI = 3 ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)
.model small .286 .287 .data rad dd 1.0, 2.0, 3.0, 4.0, 5.0 povrsine dd 5 dup (?) obimi dd 5 dup (?) dva dd 2.0 .code .startup mov si,0 mov cx,5 petlja: fld rad[si] ; st <= r fmul st,st(0) ; st <= r * r fldpi ; st(1) <= r*r, st <= pi fmul ; st <= pi * r*r ; pohrani povrsinu i skini sa steka: fstp povrsine[si] fld rad[si] ; st <= r fmul dva ; st <= 2*r fldpi ; st(1) <= 2*r, st <= pi fmul ; st <= pi * 2*r ; pohrani obim i skini sa steka: fstp obimi[si] add si,4 loop petlja .exit end 3.1.2 Instrukcijski set numeričkog koprocesora • Primjer: Napisati asemblerski program koji računa površine i obime krugova čiji se radijusi nalaze u intervalu [1..5] s korakom 1, a rezultate smješta u nizove POVRSINE i OBIMI. 3.0 ST Korak: SI = 3 ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)
.model small .286 .287 .data rad dd 1.0, 2.0, 3.0, 4.0, 5.0 povrsine dd 5 dup (?) obimi dd 5 dup (?) dva dd 2.0 .code .startup mov si,0 mov cx,5 petlja: fld rad[si] ; st <= r fmul st,st(0) ; st <= r * r fldpi ; st(1) <= r*r, st <= pi fmul ; st <= pi * r*r ; pohrani povrsinu i skini sa steka: fstp povrsine[si] fld rad[si] ; st <= r fmul dva ; st <= 2*r fldpi ; st(1) <= 2*r, st <= pi fmul ; st <= pi * 2*r ; pohrani obim i skini sa steka: fstp obimi[si] add si,4 loop petlja .exit end 3.1.2 Instrukcijski set numeričkog koprocesora • Primjer: Napisati asemblerski program koji računa površine i obime krugova čiji se radijusi nalaze u intervalu [1..5] s korakom 1, a rezultate smješta u nizove POVRSINE i OBIMI. 6.0 ST Korak: SI = 3 ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)
.model small .286 .287 .data rad dd 1.0, 2.0, 3.0, 4.0, 5.0 povrsine dd 5 dup (?) obimi dd 5 dup (?) dva dd 2.0 .code .startup mov si,0 mov cx,5 petlja: fld rad[si] ; st <= r fmul st,st(0) ; st <= r * r fldpi ; st(1) <= r*r, st <= pi fmul ; st <= pi * r*r ; pohrani povrsinu i skini sa steka: fstp povrsine[si] fld rad[si] ; st <= r fmul dva ; st <= 2*r fldpi ; st(1) <= 2*r, st <= pi fmul ; st <= pi * 2*r ; pohrani obim i skini sa steka: fstp obimi[si] add si,4 loop petlja .exit end 3.1.2 Instrukcijski set numeričkog koprocesora • Primjer: Napisati asemblerski program koji računa površine i obime krugova čiji se radijusi nalaze u intervalu [1..5] s korakom 1, a rezultate smješta u nizove POVRSINE i OBIMI. 3.141592653589 ST Korak: SI = 3 6.0 ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)
.model small .286 .287 .data rad dd 1.0, 2.0, 3.0, 4.0, 5.0 povrsine dd 5 dup (?) obimi dd 5 dup (?) dva dd 2.0 .code .startup mov si,0 mov cx,5 petlja: fld rad[si] ; st <= r fmul st,st(0) ; st <= r * r fldpi ; st(1) <= r*r, st <= pi fmul ; st <= pi * r*r ; pohrani povrsinu i skini sa steka: fstp povrsine[si] fld rad[si] ; st <= r fmul dva ; st <= 2*r fldpi ; st(1) <= 2*r, st <= pi fmul ; st <= pi * 2*r ; pohrani obim i skini sa steka: fstp obimi[si] add si,4 loop petlja .exit end 3.1.2 Instrukcijski set numeričkog koprocesora • Primjer: Napisati asemblerski program koji računa površine i obime krugova čiji se radijusi nalaze u intervalu [1..5] s korakom 1, a rezultate smješta u nizove POVRSINE i OBIMI. 18.84955592153 ST Korak: SI = 3 ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)
.model small .286 .287 .data rad dd 1.0, 2.0, 3.0, 4.0, 5.0 povrsine dd 5 dup (?) obimi dd 5 dup (?) dva dd 2.0 .code .startup mov si,0 mov cx,5 petlja: fld rad[si] ; st <= r fmul st,st(0) ; st <= r * r fldpi ; st(1) <= r*r, st <= pi fmul ; st <= pi * r*r ; pohrani povrsinu i skini sa steka: fstp povrsine[si] fld rad[si] ; st <= r fmul dva ; st <= 2*r fldpi ; st(1) <= 2*r, st <= pi fmul ; st <= pi * 2*r ; pohrani obim i skini sa steka: fstp obimi[si] add si,4 loop petlja .exit end 3.1.2 Instrukcijski set numeričkog koprocesora • Primjer: Napisati asemblerski program koji računa površine i obime krugova čiji se radijusi nalaze u intervalu [1..5] s korakom 1, a rezultate smješta u nizove POVRSINE i OBIMI. ST Korak: SI = 3 ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7)