#program: konverzija iz internog formata u ceo oktalni broj u znakovnom obliku
.section .data
broj: .long 7628572
okt_duz=11
okt_br: .fill okt_duz,1,0
greska: .byte 0
.section .text
.globl main
#deklaracija funkcije na c-u glasi:
#long conv3(long broj, long duz_niz, char* niz)
#ovo znaci:
# prvi argument je na ebp+8, prenosi se preko vrenosti (broj koji se konvertuje)
# drugi argument je na ebp+12, prenosi se preko vrednosti (max duzina stringa)
# treci argument je na ebp+16, prenosi se po adresi (adresa izlaznog niza)
# greska se vraca preko povratne vrednosti f-je, odnosno preko eax
conv3:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax #broj koji se konvertuje
movl 16(%ebp), %edi #adresa stringa
movl $8, %ebx #baza
c3_cifra:
cmpl $1, 12(%ebp) #da li ima jos mesta u stringu
jle c3_greska
xorl %edx, %edx #neophodno zbog divl
divl %ebx
addb $'0', %dl
movb %dl, (%edi)
incl %edi
decl 12(%ebp) #u stringu sada ima jedno mesto manje
andl %eax, %eax #kraj algoritma?
jnz c3_cifra
movb $0, (%edi) #kraj stringa
xorl %eax, %eax #nema greske
decl %edi #obrtanje niza
movl 16(%ebp), %esi
c3_obrni:
cmpl %edi, %esi
jae c3_kraj
movb (%esi), %bh
movb (%edi), %bl
movb %bl, (%esi)
movb %bh, (%edi)
decl %edi
incl %esi
jmp c3_obrni
c3_greska:
movl $1, %eax
c3_kraj:
movl %ebp, %esp
popl %ebp
ret
main:
pushl $okt_br
pushl $okt_duz
pushl broj
call conv3
addl $12, %esp
movb %al, greska
kraj:
nop
Ako vidite gde je greska,napisite mi.
Meni pise segmentation fault kada kompajliram.