Błąd przy kompilacji - asembler.

0

Procesor 8086. Nie wiem dlaczego przy kompilacji w masm wyskakuje błąd kompilacji "cannot access label through segment registers" przy tych dwóch instrukcjach wyróżnionych w kodzie.

dane1 segment 
.
.
bufor     db    ?
.
.
dane1 ends

code1 segment
.
.
.
mov dl,bufor
.
.
mov bl, byte ptr [bufor]

code1 ends 
1

Zamiast pierwszego powinno być:

mov dx, offset bufor

Zamiast drugiego jakieś:

mov di, offset bufor
mov bl, byte ptr ds:[di]
0

Przy dalszym pisaniu i kompilacji również napotkałem ten sam błąd.
W danych mam jeszcze:

tablica dw 100 dup(0)

i wykonuję jeszcze instrukcje:

mov si,0
mov ax,tablica[si]               ;błąd przy kompilacji

Jest jakiś sposób na to?

0

Jest sposób. Oduczyć sie pisania jakby to było C a zacząć pisać w asemblerze. Tam nie ma tablicy tylko blok pamięci a etykietka oznacza adres początku bloku.

mov si, offset tablica
mov di, 0 ;albo jakis inny "indeks w tablicy"
add si, di
mov ax, ds:[si]

edit: oczywiście trzeba pamiętać że ten "indeks" przeniesie nas o X bajtów, więc dla dw musisz się przesuwać o 2 bajty! Patrz co napisał niżej @Azarien

2
mov bx, offset tablica
mov si, 0   ; indeks do tablicy
shl si,1        ; mnożymy indeks *2 bo elementy są 2-bajtowe

mov ax, [bx+si]

albo (jeśli indeks ma być stały)

mov bx, offset tablica
mov ax, [bx+0]

Adresowanie 16-bitowe ma formę:

[reg1 + reg2 + displ]

gdzie:
· reg1 to rejestr bp lub bx (w zamierzeniu adres początku tablicy)
· reg2 to rejestr si lub di (w zamierzeniu indeks w tablicy)
· displ to 16-bitowy ofset podany jako liczba.

czyli [bp/bx + si/di + liczba]

każdy składnik jest opcjonalny.

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