Cześć, coś mi strzeliło do łba, żeby zacząć uczyć się asemblera. Skoro już wiem, jak wyświetlić tekst, postanowiłem wyświetlić liczbę, żeby mieć podgląd, jak działają moje testowe programiki. Piszę wszystko w FAsm. No i pojawia się problem.
Jeśli podprogram IntToStr umieszczam przed etykietą start w segmencie .code, to nie mam błędów w kompilacji(wywala się niestety gdzieś tam). Jeśli podprogramy są tam, gdzie teraz, to mam błąd: "undefined symbol 'start.data'" w mov ax, .data
Dlaczego?
Kod mam taki:
format mz
entry .code:start
segment .code
start:
mov ax, .data ; ustawiam data segment - tu mam błąd
mov ds, ax
mov eax, liczba ;kładę do EAX liczbę, którą chcę pokazać(może być 32b)
call intToStr ;wywołuję intToStr
; teraz w EDX mam do wyświetlenia
mov ah, 09h ; wyświetlam
int 21h;
call wait_char
mov ah, 4ch ;zakończenie programu
int 21h
intToStr:
put_stack:
xor EDX, edx ;zeruję EDX - potrzebne do dzielenia
div [d] ;dzielę EAX przez 10
push DX ;po takim dzieleniu, w DX mam resztę, a więc ostatnią cyfrę liczby, odkładam ja na stos
inc [i] ;pomocnicza, żebym wiedzial, ile cyfr ma liczba
cmp ax, 0 ;jeśli ax>0, to wykonuj nadal
jne put_stack
xor dx, dx ;zeruję dx, żebym wypisał tam liczbę
xor al, al
mov cx, i ; ustawiam licznik pętli
print_digit:
pop ax ; zdejmuję ze stosu pierwszą cyfrę
add ax, 48d ; dodaję do niej 48 - zamieniam na odpowiedni znak łańcucha
mov dl, al ; umieszczam w dl
shl edx, 8 ; przesuwam w lewo, żebym mógł znowu umieścić w dl kolejną cyfrę
loop print_digit
ret
wait_char:
mov ah, 01h ;czekanie na znak
int 21h
ret
segment .data
liczba dd 312d
i dw 0
d dd 10d