Dopiero zaczynam się uczyć asemblera, ale nie mogę zacząć bo nie mogę skompilować pliku (jest dobrze napisany bo sprawdzałem na uczelni)
Problem jest w tym że jak wpisuję tasm nazwa pliku to wszystko jest ok.
ale jak pożniej pisze tlink nazwa to wyświetla się tylko komunikat
" No program entry point ". I za każdym razem to samo.
Próbowałem już kilku tasm'ów ale za każdym razem to samo.
Pomóżcie!!!
Pokaz ten kod zrodlowy
A z jakimi parametrami wlaczasz Tasma?
"No entry point" czyli nie masz zadeklarowanej etykiety startowej. Prawdopodobnie piszesz program typu .com, ale nie linkujesz go jako taki. Zerknij w "tlink -h" jaka opcja jest odpowiedzialna za generowanie plików .com (chyba -t, ale nie pamiętam). I linkuj podając ten parametr.
Kod wygląda tak:
ASSUME CS:Code, DS:Data ;pokazanie kompilatorowi ktory segment to segment kodu i danych
Code SEGMENT ;poczatek segmentu kodu
first PROC ;poczatek programu - czyli glownej procedury
mov ax,Data ;przepisanie adresu segmentu danych
mov ds,ax ;przepisanie
mov ax,_Stos
mov ss,ax ;inicjalizacja stosu
mov sp,100h
mov cx,10
skok1:
push cx
mov si,offset tablica
mov cx, 9
skok2:
mov ax,word ptr ds:[si]
mov bx,word ptr ds:[si+2]
cmp ax,bx
jc nie_zm
mov word ptr ds:[si+2],ax
mov word ptr ds:[si],bx
nie_zm:
add si,2
loop skok2
pop cx
loop skok1
mov cx,10
mov si,offset tablica
mov bx,0
petla: mov ax,word ptr ds:[si]
cdloop: inc bx
call wysw
add si,2
loop petla
mov al,00
mov ah,4Ch ;nr funkcji DOSa konczacej program
int 21h ;zakonczenie programu i powrot do DOSa
wysw PROC ;poczatek procedury wyswietajacej zawartosc rejestru AX
mov dx,0 ;wpisanie do DX 0 gdzyz DIV dzieli liczbe 32 bitowa DX:AX
mov bx, 10000 ;zapisanie do BX dzielnej
div bx ;dzielenie
push dx ;odlozenie wartosci rejestru DX na stos
add ax, 30h ;dodanie do AX wartosci 30h (tak aby prawidlowo wyswietlic cyfre)
mov dx, ax ;przepisanie AX do DX
mov ah, 2 ;zapisanie w AH numeru wywolywanej funkcji
int 21h ;wywolanie przerwania 21h funkca 02 (wyswietlenie znaku ktory lezy w AL)
pop ax
mov dx, 0
mov bx, 1000
div bx
push dx
add ax, 30h
mov dx, ax
mov ah, 2
int 21h
pop ax
mov dx, 0
mov bx, 100
div bx
push dx
add ax, 30h
mov dx, ax
mov ah, 2
int 21h
pop ax
mov dx, 0
mov bx, 10
div bx
push dx
add ax, 30h
mov dx, ax
mov ah, 2
int 21h
pop dx
add dx, 30h
mov ah, 2h
int 21h
mov dx,10
mov ah,2
int 21h
mov dx,13
mov ah,2
int 21h
ret ;powrot z procedury
wysw ENDP ;koniec procedury
first ENDP ;koniec procedury glownej
ENDS ;koniec segmentu kodu
Data SEGMENT ;poczatek segmentu dancyh
tablica DW 10 DUP(143,4,54,11,654,48,545,85,43,34)
Wynik DB ?
Data ENDS ;koniec segmentu danych
_Stos SEGMENT STACK ;poczatek segmentu stosu
DB 100h DUP(?) ;deklaracja wielkosci stosu (tablica wielkosc 100h wypelniona '?')
ENDS ;koniec segmentu stosu
END ;koniec calego kodu
Kompilowałem go bez żadnych parametrów, później próbowałem wygenerować .com (z parametrem /t) ale też lipa:
"Fatal: Cannot generate COM file : stack segment present"
Może do skompilowania są potrzebne jeszcze jakieś pliki poza tasm i tlink?
tlink plik /entry first
ew zobacz do readme
Wolverine nie bardzo wiem o co ci chodiło z tym: tlink plik /entry first
Jeśli ktoś się zna na tym to proszę o pomoc bo to dosyć pilne.
Plizzz!!!
dawno tasma nie stosowałem, ale mam propozycję: daj przez first etykietę start. Czyli:
ASSUME CS:Code, DS:Data ;pokazanie kompilatorowi ktory segment to segment kodu i danych
Code SEGMENT ;poczatek segmentu kodu
start: ;i o to chodzi
first PROC ;poczatek programu - czyli glownej procedury
mov ax,Data ;przepisanie adresu segmentu danych
mov ds,ax ;przepisanie
mov ax,_Stos
mov ss,ax ;inicjalizacja stosu
mov sp,100h
Etykieta start wskazuje domyślnie ep programu. może pomoże :) Może pomoże :)
Dzięki za odpowiedź Deus ale nie pomogło.
Normalnie wymiękam. U wszystkich kumpli działa dobrze a u mnie ni chu...