dziwne:
Bez ingerowania w rejestry segmentowe i miast mov al, [dx] dałem mov al,[info] (czyli wysłanie 1 bajtu do al) to śmiga. A jak dam nawet mov al, [info+dx] to nie balanga (invalid efective adress). Zagłębiłem się w manual do NASM i wynika z tego jasno, że dobrze zrobilem. Czy mam jakoś zmusić kompilatór do posłuszeństwa (próbowałem z byte itp. ale nic nie pomogło)?
[ Dodano: 2008-07-09, 22:45 ]
Ha! Eureka (rzekł Grześ po czym z wrażenia wyskoczył z odzienia)
Genialne rzeczy są proste:
(tutaj bootsektor do pisanego przeze mnie terminala na COM'a):
org 7c00h
start:
xor ax,ax
int 10h
mov cx,2
mov bp, powitanie_text
call pisz
czytaj:
mov ax,8000h
mov es,ax
xor dx,dx
mov bx,dx
mov ax,20h
mov cx,10
int 13h
jc blad
mov cx,83
mov bp,juz_text
call pisz
xor ax,ax
int 16h
jmp 8000h:0000h
blad:
cmp ah,6
jz czytaj
mov cx, 71
mov bp, blad_text
call pisz
xor ax,ax
int 16h
mov bx,40h
mov ds,bx
mov word [ds:72h],1234h
jmp 0FFFFh:0000h
pisz:
push cs
pop es
mov ax,1301h
xor bx,bx
mov bl,0fh
int 10h
ret
powitanie_text db "Laduje PC Terminal v2.0...",13
juz_text db "PC Terminal zaladowany pomyslnie. Nacisnij dowolny klawisz, aby kontynuowac..."
blad_text db "Wystapil blad podczas operacji na dyskietce. Nacisnij dowolny klawisz..."
times 510 -($-start) db 0
dw 0aa55h
Jak można spostrzec wystarczyło zastosowac inne przerwanie a problem sam znika.
Co prawda dalej nie wiem dlaczego występował błąd LEA, chociaż sądzę, że winę tu ponosi kompilator. Poszukam w datasheet'ach Intel'a lub AMD i zapiszę tą instrukcję szesnastkowo i powinno śmigac.
THX FOR ALL HELP.
[ Dodano: 2008-07-10, 08:29 ]
A oto rozwiązanie (cały czas będące na tym kursie, który mi kolega
elemaniac polecił):
Używając rejestrów 16-bitowych:
[ (BX albo BP) lub (SI albo DI) lub liczba ]
słowo "albo" wyklucza wystąpienie obu rejestrów na raz
np.
mov al, [ nazwa_zmiennej+2 ]
mov [ di-23 ], cl
mov al, [ bx + si + nazwa_zmiennej+18 ]
bx albo bp lub si albo di <- a nie dx czy jakieś inne cuda.
Ufffffffffff....... Ulga.