[Asembler+C] Zamiana dec na bin

0

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
0

Na oko to jest kod w asemblerze MASM czyli w czymś zupełnie innym niż MIPS.

0

Pewnie ze tak, ale trzeba by znać obie składnie ;) No i wątpię żeby to miało sens bo ten kod wyżej pewnie nigdy nie działał i wygląda zresztą na mega przekombinowany. Lepiej po prostu napisać to od 0.

0

Polecam zacząć od kursu tego twojego asemblera, bo ewidentnie nie potrafisz napisać w nim nawet hello world. Jak już to zrobisz to wróć za jakiś miesiąc, dwa i możemy wtedy pomyśleć o tym jak napisać program do konwersji dec na bin.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0