Upload
riley-foreman
View
30
Download
5
Embed Size (px)
DESCRIPTION
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 - PowerPoint PPT Presentation
Citation preview
Arhitektura računaraGLAVA 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
3.1.1 Arhitektura numeričkog koprocesora
Bit Naziv Opis
B busy Pokazuje da li je koprocesor zauzet izvršavanjem nekog taska može se provjeravati testiranjem statusne informacije ili korištenjem FWAIT instrukcije.Noviji koprocesori se automatski sinhronizuju s procesorom, pa nije potrebno testirati B bit
C3-C0 condition code
TOP Top of stack Pokazuje koji je registar steka adresiran kao top of stacknormalno (nakon resetovanja) to je registar 0
C3-C0
3.1.1 Arhitektura numeričkog koprocesora
Bit Naziv Opis
ES error summary setovan ako je setovan bilo koji od bita koji pokazuju neku od grešaka (PE, UE, OE, ZE, DE, IE)
PE precision error pokazuje da rezultat ili operandi premašuju selektovanu preciznost
UE underflow error pokazuje da je nenulti rezultat premalen da bi se prikazao u traženoj tačnosti
OE overflow error pokazuje da je rezultat prevelik da bi se prikazaoako je ova greška maskirana koprocesor generiše beskonačnost
ZE zero error pokazuje da je došlo do dijeljenja s nulom
DE denormalized error
pokazuje da je bar jedan od operanada denormalizovan
IE invalid error pokazuje overflow ili underflow steka, neodređenost izraza ili korištenje NAN (nenumeričkog) podatka kao operanda, npr. vađenje drugog korijena iz negativnog broja
3.1.1 Arhitektura numeričkog koprocesora
Postoje 2 načina da se testiraju biti u statusnom registru:
1. 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:
2. 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.
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
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.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
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 na ST(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
3.1.2 Instrukcijski set numeričkog koprocesora
Funkcija Identitet
10Y 2Ylog2(10)
eY 2Ylog2(e)
XY 2Ylog2(X)
log210, log2e su ugrađene konstante
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
Instrukcija Konstanta koja se stavlja na ST
FLDZ +0.0
FLD1 +1.0
FLDPI π
FLDL2T log210
FLDL2E log2e
FLDLG2 log102
FLDLN2 loge2
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
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.1.2 Instrukcijski set numeričkog koprocesora.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
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.1.2 Instrukcijski set numeričkog koprocesora.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
end3.0 ST
ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
Korak: SI = 3
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.1.2 Instrukcijski set numeričkog koprocesora.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
end9.0 ST
ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
Korak: SI = 3
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.1.2 Instrukcijski set numeričkog koprocesora.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
end3.141592653589
9.0
ST
ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
Korak: SI = 3
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.1.2 Instrukcijski set numeričkog koprocesora.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
end28.27433388230 ST
ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
Korak: SI = 3
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.1.2 Instrukcijski set numeričkog koprocesora.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
endST
ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
Korak: SI = 3
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.1.2 Instrukcijski set numeričkog koprocesora.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
end3.0 ST
ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
Korak: SI = 3
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.1.2 Instrukcijski set numeričkog koprocesora.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
end6.0 ST
ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
Korak: SI = 3
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.1.2 Instrukcijski set numeričkog koprocesora.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
end3.141592653589
6.0
ST
ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
Korak: SI = 3
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.1.2 Instrukcijski set numeričkog koprocesora.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
end18.84955592153 ST
ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
Korak: SI = 3
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.1.2 Instrukcijski set numeričkog koprocesora.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
endST
ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
Korak: SI = 3