Code:
#potprogam za deljenje u dvostrukoj preciznosti (a:b) (greska ide u eax)
#Autor: Delic Bojan
#############################################
# NAPOMENA
#Ukoliko program treba da racuna i ostatak on se nalazi u registarskom
#paru edx:eax
#############################################
.section .data
a_gornji: .long 0x8000
a_donji: .long 0
b_gornji: .long 0x8000
b_donji: .long 0
c: .long 0
.section .text
.globl main
deljenje:
push %ebp
movl %esp, %ebp
subl $4, %esp #za gresku
movl $0, -4(%ebp) #postavlja gresku na nula
xorl %ecx, %ecx #anulira %ecx
movl 24(%ebp), %ebx #adresa rezultata
deljenje_provera_a:
movl 12(%ebp), %eax #smeska se broj a u registarski par edx:eax radi provera
movl 8(%ebp), %edx
andl %edx, %edx #uporedjuje znacajnije cifre broja a
jnz deljenje_provera_b #ako je %edx nula, proverava broj b
deljenje_proveri_donji_a:
andl %eax, %eax #a ako jeste %edx jeste nula, proverava manje znacajne cifre
jz deljenje_kraj #ako su manje znacajne cifre nula zavrsava program
deljenje_provera_b:
movl 20(%ebp), %eax #smeska se broj b u registarski par edx:eax radi provera
movl 16(%ebp), %edx
andl %edx, %edx #uporedjuje znacajnije cifre broja b
jnz deljenje_deli #ako je %edx nula prelazimo na deljenje
deljenje_provera_donji_b:
andl %eax, %eax #a ako %edx jeste nula, proveravamo manje znacajne cifre
jz i_greska #ako su i manje znacajne cifre nula povecavamo gresku i zavrsavamo program
deljenje_deli:
movl 12(%ebp), %eax #postavljamo broj a u ragistarski par edx:eax, sada radi deljenja
movl 8(%ebp), %edx
deljenje_ponovo:
cmpl b_gornji, %edx
jb deljenje_kraj #ako su znacajnije cifre broja a manje od znacajnijih cifara broja b zavrsavamo program
cmpl b_donji, %eax
jb deljenje_kraj #ako su manje znacajne cifre boja a manje od manje znacajnih cifara broja b zavrsavamo program
subl b_donji, %eax #ako je broja a veci od broja b, oduzimamo b od a i smestamo u a
sbbl b_gornji, %edx
incl %ecx #povecavamo rezultat za jedan
jmp deljenje_ponovo #i ponavljamo proces
i_greska:
incl -4(%ebp) #povecanje greske za jedan
deljenje_kraj:
movl %ecx, (%ebx) #postavljanje rezultata u promenljivu c (njena adresa se nalazi u %ebx)
movl -4(%ebp), %eax #postavljanje greske u %eax
addl $4, %esp #unistavanje lokalne promenljive
pop %ebp #ucitavanje stare vrednosti %ebp
ret #povratak iz potprograma
main:
push $c #postavljanje parametara potprograma na stek
push b_donji
push b_gornji
push a_donji
push a_gornji
call deljenje #pozivanje potprogama
addl $20, %esp #unistavanje argumenata sa steka
kraj:
nop #kraj programa
#potprogam za deljenje u dvostrukoj preciznosti (a:b) (greska ide u eax)
#Autor: Delic Bojan
#############################################
# NAPOMENA
#Ukoliko program treba da racuna i ostatak on se nalazi u registarskom
#paru edx:eax
#############################################
.section .data
a_gornji: .long 0x8000
a_donji: .long 0
b_gornji: .long 0x8000
b_donji: .long 0
c: .long 0
.section .text
.globl main
deljenje:
push %ebp
movl %esp, %ebp
subl $4, %esp #za gresku
movl $0, -4(%ebp) #postavlja gresku na nula
xorl %ecx, %ecx #anulira %ecx
movl 24(%ebp), %ebx #adresa rezultata
deljenje_provera_a:
movl 12(%ebp), %eax #smeska se broj a u registarski par edx:eax radi provera
movl 8(%ebp), %edx
andl %edx, %edx #uporedjuje znacajnije cifre broja a
jnz deljenje_provera_b #ako je %edx nula, proverava broj b
deljenje_proveri_donji_a:
andl %eax, %eax #a ako jeste %edx jeste nula, proverava manje znacajne cifre
jz deljenje_kraj #ako su manje znacajne cifre nula zavrsava program
deljenje_provera_b:
movl 20(%ebp), %eax #smeska se broj b u registarski par edx:eax radi provera
movl 16(%ebp), %edx
andl %edx, %edx #uporedjuje znacajnije cifre broja b
jnz deljenje_deli #ako je %edx nula prelazimo na deljenje
deljenje_provera_donji_b:
andl %eax, %eax #a ako %edx jeste nula, proveravamo manje znacajne cifre
jz i_greska #ako su i manje znacajne cifre nula povecavamo gresku i zavrsavamo program
deljenje_deli:
movl 12(%ebp), %eax #postavljamo broj a u ragistarski par edx:eax, sada radi deljenja
movl 8(%ebp), %edx
deljenje_ponovo:
cmpl b_gornji, %edx
jb deljenje_kraj #ako su znacajnije cifre broja a manje od znacajnijih cifara broja b zavrsavamo program
cmpl b_donji, %eax
jb deljenje_kraj #ako su manje znacajne cifre boja a manje od manje znacajnih cifara broja b zavrsavamo program
subl b_donji, %eax #ako je broja a veci od broja b, oduzimamo b od a i smestamo u a
sbbl b_gornji, %edx
incl %ecx #povecavamo rezultat za jedan
jmp deljenje_ponovo #i ponavljamo proces
i_greska:
incl -4(%ebp) #povecanje greske za jedan
deljenje_kraj:
movl %ecx, (%ebx) #postavljanje rezultata u promenljivu c (njena adresa se nalazi u %ebx)
movl -4(%ebp), %eax #postavljanje greske u %eax
addl $4, %esp #unistavanje lokalne promenljive
pop %ebp #ucitavanje stare vrednosti %ebp
ret #povratak iz potprograma
main:
push $c #postavljanje parametara potprograma na stek
push b_donji
push b_gornji
push a_donji
push a_gornji
call deljenje #pozivanje potprogama
addl $20, %esp #unistavanje argumenata sa steka
kraj:
nop #kraj programa
Ja mislim da je greška negde kod deljenje_deli, ali nikako da skontam šta je... Non stop mi je na vrh jezika, ako znate na šta mislim...
PS: Nije domaći , samo vežbam