- all:
- nasm test.asm -f elf
- gcc test.o -o test
Pozatym:
nie wiedziałem których rejestrów mogę używać, użyłem eax, ebx, ecx, edx
nie znam instrukcji na zmianę znaku liczby, użyłem not, i dodanie 1
program był pisany pod Linuksa, jednak jak widzę z kursu pod Win będzie działał po dodaniu '_' w nazwach funkcji
Może teraz kod:
- Kod: Zaznacz cały
- section .text
- global main
- extern printf
- extern scanf
- ;-------------------------------------------------------------------
- mystrlen:
- ;funkcja typu cdecl
- ;zwraca długość napisu typu NULL-terminated
- mov edx, [esp+4] ; ładujemy wskaźnik napisu
- mov ecx, 0 ;zerujemy licznik pętli
- petla:
- mov byte al, [edx+ecx] ;ładujemy kolejny znak
- test al, al ;sprawdzamy czy jest zerem
- jz return
- inc ecx ;zwiększamy licznik pętli
- jmp petla
- return:
- mov eax, ecx ;przenosimy licznik
- ret
- ;koniec
- ;-------------------------------------------------------------------
- myatoi:
- ;funkcja typu cdecl
- ;jako parametr przyjmuje napis zwraca liczbę
- ;w razie błędu -1
- mov ebx, [esp+4] ;ładujemy napis
- sub esp, 12 ;alokujemy zmienne lokalne
- mov dword [esp], 1 ;potęga 10 (początkowo 10^0 )
- mov dword [esp+4], 0 ;flaga znaku
- mov dword [esp+8], 0 ;liczba
- mov al, [ebx]
- cmp al, 0x2d ;sprawdzamy czy pierwszy znak to '-'
- jnz dalej
- mov dword [esp+4], 1 ;ustawiamy flagę znaku
- add ebx, 1 ;i możemy ominąć znak
- dalej:
- push dword ebx
- call mystrlen ;obliczmy dlugosc
- add esp, 4
- mov ecx, eax
- dec ecx
- xor edx, edx
- ;eax= badany znak ;ebx=wskaznik napisu ecx=dlugosc napisu ;edx=pomoc
- ;[esp]=cyfra ;[esp+4]=znak liczby ;[esp+8] liczba
- petelka:
- xor eax, eax
- mov byte al, [ebx+ecx] ;ładujemy kolejny znak
- sub al, 0x30 ;odejmujemy 0x30 48d
- ;trzeba sprawdzić czy eax jest z przedziału <0,9>
- cmp al, 0 ;jeżeli jest poniżej zera
- jl error
- cmp al, 9 ;jeżeli jest powyżej 9
- jg error
- ;do liczba trzeba dodać eax*zmienna lokalna
- mul dword [esp]
- add [esp+8], eax
- ;pomnożyć zmienną lokalną przez 10
- mov eax, [esp]
- mov edx,10
- mul edx
- mov [esp],eax
- ;
- dec ecx
- cmp ecx, -1 ;jeżeli napis się skończył
- jz koniec
- jmp petelka
- error:
- mov eax, -1
- add esp, 12
- ret
- koniec:
- mov eax, [esp+8]
- mov edx, [esp+4]
- test edx, edx
- jz no_minus
- not eax
- add eax, 1
- no_minus:
- add esp, 12
- ret
- ;koniec funkcji
- ;--------------------------------------------------------------------
- main:
- push napis ;printf
- call printf
- add esp, 4
- ;
- push dword liczba
- push dword fmt ;odczytanie liczby
- call scanf
- add esp, 8
- ;
- mov eax, liczba
- push dword eax
- call myatoi ;atoi
- add esp, 4
- push dword eax
- push dword fmt2 ;ponowne wypisanie liczby
- call printf
- add esp,8
- xor eax, eax
- ret
- section .data
- napis db "Podaj liczbe: ", 0
- liczba db " ",0 ;zapomniałem jak się wypełnia 'tablice'
- dight dd 0
- fmt db "%s",0
- fmt2 db "%d",0xd,0xa,0
i plik Makefile:
- Kod: Zaznacz cały
Proszę o jakieś komentarze, jakiekolwiek (napisałem jakiekolwiek, więc teraz będę przygotowany na wszystko :) )



