Muszę napisać program do zamiany liczby dziesiętnej na binarną.
Sęk w tym, że musi być on połączeniem asemblera z C :/
Chodzi o to, aby funkcja zamiany systemu napisana była w asemblerze, natomiast program w C wczytywałby liczbę wywoływał tę funkcję (extern) i wypisywał zamienioną liczbę na ekranie.
Ogólnie mam napisany już cały program w asm, ale muszę go jakoś przerobić, żeby zlinkować to z C. Proszę o pomoc co z tego pliku asm zostawić, a co dokładnie zaimplementować w C, żeby to sprawnie działało?
.686
_TEXT SEGMENT dword public 'CODE' use32
ASSUME cs:_TEXT
_wczytaj32 PROC ; procedura wczytujaca liczbę z klawiatury
; w postaci kodów ascii i zapisująca do eax
; w postaci binarnej
push ebx
push esi
push edi
push 11
push OFFSET liczba_ascii
push 0 ;uchwyt (klawiatura)
call __read
add esp,12 ; usunięcie parametrów ze stosu
mov esi,0 ; dotychczas obliczona wartosc
mov ebx,0 ; modyfikator
ptl_liczba:
mov al,liczba_ascii[ebx]
inc ebx ; zwiekszanie o 1
cmp al, 10 ; czy był enter
je byl_enter ; jesli tak to przechodzimy do byl_enter
sub al, '0' ; zamiana na liczbe
movzx edi, al ; zamiana na 32bit
mov eax,10 ; mnozna
mul esi ; mnozenie razy 10, wynik w eax
add eax, edi ; dodanie liczby jednosci
mov esi, eax ; zapamietanie aktualnej wartosci
jmp ptl_liczba ; procedura obsługi przerwania
byl_enter:
mov eax, esi ; wartosc zwracana przez funkcje jest w eax
pop edi ; zdejmujemy dane ze stosu do danego rejestru
pop esi
pop ebx
ret
_wczytaj32 ENDP
_wyswietl_dec PROC ; procedura pobierajaca liczbę ze zmiennej liczba_bin
; i wypisujaca ją jako liczbę dziesiętną
push ebx
push ebp
push esi
push edi
push edx
mov eax, liczba_bin ; załadowanie wprowadzonej z klawiatury liczby
mov ecx,10 ; licznik obiegow petli
mov ebx,9 ; indeks poczatkowy w tablicy wynikowej
mov esi,10 ; dzielnik
ptl:
mov edx,0 ; zerowanie starszej czesci dzielnej
div esi ; dzielenie przez 10, reszta w edx, iloraz w eax
add dl,30h ; zamiana na kod ascii
mov liczba_ascii[ebx],dl ; odeslanie cyfry
dec ebx
loop ptl ; sterowanie petla
mov ecx, koniec_d - info_dec ;dlugosc opisu
push ecx ; liczba znaków
push OFFSET info_dec
push 1 ; uchwyt
call __write
add esp,12 ; usuniecie parametrow ze stosu
push 10 ; liczba znaków
push OFFSET liczba_ascii
push 1 ; uchwyt
call __write
add esp,12 ; usuniecie parametrow ze stosu
pop edx
pop edi
pop esi
pop ebp
pop ebx
ret
_wyswietl_dec ENDP
_wyswietl_bin PROC
push ebx
push ebp
push esi
push edi
mov eax, liczba_bin ; załadowanie wprowadzonej z klawiatury liczby
mov ecx,32 ; licznik obiegow petli
mov ebx,31 ; indeks poczatkowy w tablicy wynikowej
mov esi,2 ; dzielnik
ptl:
mov edx,0 ; zerowanie starszej czesci dzielnej
div esi ; dzielenie przez 2, reszta w edx, iloraz w eax
add dl,30h ; zamiana na kod ascii
mov liczba_ascii_bin[ebx],dl ; odeslanie cyfry
dec ebx
loop ptl ; sterowanie petla
mov ecx, koniec_b - info_bin
push ecx ; liczba znaków
push OFFSET info_bin
push 1 ; uchwyt
call __write
add esp,12 ; usuniecie parametrow ze stosu
push 33 ; liczba znaków, zmiana!
push OFFSET liczba_ascii_bin
push 1 ; uchwyt
call __write
add esp,12 ; usuniecie parametrow ze stosu
pop edi
pop esi
pop ebp
pop ebx
ret
_wyswietl_bin ENDP
_TEXT ENDS
END