Ocena wątku:
- 0 Głosów - 0 Średnio
- 1
- 2
- 3
- 4
- 5
|
Problem w TP i Asembler
|
| Autor |
Wiadomość |
Chucio
Początkujący

Liczba postów: 3
Dołączył: Mar 2010
Reputacja: 0
€: 6
OS:
|
Problem w TP i Asembler
Dobry,
sprawa wygląda tak...
Chciałem ostatnio przyśpieszyć mój program rysujący tło i zabrałem się za mozolne poznawanie składni Asemblera. Wszystko szło dość dobrze, ale do czasu... Dojechałem do przesuwania bitów w lewo i prawo (shl ah, 2) (shr al, 2) w systemie binarnym i po skompilowaniu mój Turbo Pascal 7 wywala mi błąd. Przeczytałem, że coś tam mu się nie podoba (286) i musze użyć dyrektywy globalnej {$G}, no i niestety, ale nie mam bladego pojęcia jak się jej używa. Owszem, jest napisane, że mamy {$G-} i {$G+}, ale gdzie to sie wstawia do kodu? Dość intuicyjnie wstawiłem pierwszy przed samym programem tak jak zmienne globalne, ale również dał błąd.
Czy ktoś mógłby to wyjaśnić? (W necie też szukałem, ale poza mało pomocnym wyjaśnieniem działania, niczego nie znalazłem)
|
|
| 21.03.2010 15:36 |
|
Chucio
Początkujący

Liczba postów: 3
Dołączył: Mar 2010
Reputacja: 0
€: 6
OS:
|
RE: Problem w TP i Asembler
Pożyczyłem dzisiaj książkę "Tworzenie gier 2d i 3d..." od znajomego. Pomijając fakt, że autor "jeździ trochę wyżej" ode mnie w Asemblerze, to jego kod także u mnie nie chodzi... Ciągle wywala mi błąd w tym miejscu. W książce autor tego nawet nie uwzględnia, przynajmniej nie zauważyłem.
Tutaj instrukcja rysująca poziomą kreskę o podanych współrzędnych. Zależy mi na tej metodzie, bo chce otrzymać maksymalną szybkość rysowania.
Kod:
Program poziom_w_13h;
Uses Crt;
Var
x1,x2,y:word;
kolor:byte;
Procedure pozioma_linia_13h(x1,x2,y:word; kolor:byte);
Begin
asm
mov cx, x2 {zaladuj x2 do cx}
sub cx, x1 {odejmij x1 od cx}
add cx, 1 {w razie gdyby x1 = x2 zeby cokolwiek narysowac}
mov ax, y {zaladuj y do ax}
mov di, ax {zaladuj ax do di}
shl ax, 8 {przesuwamy bity w lewo o 8}{BŁĄD W TEJ LINIJCE, W NASTĘPNEJ TAKŻE BĘDZIE}
shl di, 6 {przesuwamy bity w lewo o 6}
add di, ax {dodaj ax do di}
add di, x1 {dodaj x1 do di}
mov ax, 0a000h {A000 do ax}
mov es, ax {ax do es}
mov al, kolor {kolor do al}
cld {zerowanie znacznikow kierunku}
rep stosb {cx razy zapisanie koloru z al do komorek o wspolrzednych es:di}
end;
End;
Begin
randomize;
clrscr;
{tryb graficzny 13h}
asm
mov ah, 00h
mov al, 13h
int 10h
end;
{wartosci zmiennych}
x1:=10;
x2:=110;
y:=100;
kolor:=white;
g_rysuj_pionowa_linia_13h(x1,x2,y,kolor);
{wcisnij dowolny klawisz}
readkey;
End.
Error 159: 286/287 instructions are not enabled.
Gdzie wstawić tą {SG-} właśnie sam nie wiem, ale w tym miejscu mi wywala błąd.
Oczywiście tego programu także jeszcze do końca nie rozumiem, ale jak mówiłem - dopiero poznaję składnie.
Pozdrawiam
(Ten post był ostatnio modyfikowany: 22.03.2010 20:32 przez Chucio.)
|
|
| 22.03.2010 20:28 |
|
Propagandi
Początkujący

Liczba postów: 91
Dołączył: Mar 2010
Reputacja: 8
€: 100
OS:
|
RE: Problem w TP i Asembler
Ten błąd dotyczy klasy procesora. W tym konkretnym przypadku niedostępne są instrukcje dla starszych, 16-bitowych modeli o oznaczeniu 286 i 287.
Jak odpalisz TP, to w menu Options-->Compiler zaznacz opcję "286 instuctions" i powinno ruszyć.
PS Jestem ciekaw co to za program, że musisz optymalizować kod z inline asm  Jeśli to nie problem to upnij gdzieś cały projekt.
|
|
| 24.03.2010 15:58 |
|
Użytkownicy przeglądający ten wątek: 3 gości