Po pytaniu sądzę, że jesteś raczej początkującym programistą w Asemblerze, choć - tutaj musze Ciebie pochwalić - świetnie sobie radzisz z używaniem znaków "[]". Mam na myśli to, że doskonale orientujesz się w adresowaniu (no może prawie, inaczej przecież byś nie pytał

). Dobra, przejde do rzeczy.
Nie możesz używać zmiennej do adresowania, w sensie nie jako indeks. Oczywiście zmienna może być "bazą" dla adresowania, ale nie cyferką która będzie "robiła za przesunięcie". Pomyśl w ten sposób. Masz taki oto zapis:
bardzo dobrze wiemy, że to oznacza załadowanie adresu zmiennej "string" do rejestru ECX. A teraz weźmy ten kawałek kodu:
to spowoduje umieszczenie liczby 66 w komórce pamięci o adresie o 1 bajt większy niż adres zmiennej string, innymi słowy w kolejnej komórce pamięci, albo jak kto woli w kolejnej zmiennej w tablicy

Zatem jak NASM zobaczył coś takiego:
to nie bardzo wiedział o co chodzi. dla niego ten zapis oznaczałby, że przesunięciem "index" jest adres tej zmiennej nie zaś jej zawartości. A przecież zupełnie bez sensu jest ten (pseudo)kod:
To już jest absurd, jak sam mogłeś zauważyć. Zresztą nie jest to ograniczenie Asemblera, tylko procesora. Żaden z procesorów 80x86 ani 80x86_64 nie potrafi tak adresować pamięci. Tak, czyli indeks nie może być zmienną. Musi to być wartość bezpośrednia jak np "1" albo w rejestrze. I tutaj właśnie pięknie dobrnąłem do zapomianych rejestrów wskaźnikowych: ESI oraz EDI. Tak, właśnie po to one powstały aby odwalać tę brudną robotę. Twój program można tak zmodyfikować:
Kod: Zaznacz cały
section .text
global _start
_start:
mov esi, 1
mov byte [string + esi], 66
mov eax, 4
mov ebx, 1
mov ecx, string
mov edx, string_l
int 80h
mov eax, 1
xor ebx, ebx
int 80h
section .data
string db 90, 111, 100, 10
string_l equ $ - string
index db 1
To nie jedyna możliwość. Zawsze można pokobinować z rozkazem LEA. Oto i kod:
Kod: Zaznacz cały
section .text
global _start
_start:
lea eax,[string] ;pobierz adres zmiennej string i zapisz go w eax
inc eax ;tenże adres zwiększ o 1
mov byte [eax],66 ;[eax] czyli do adresu w eax wpisz 66
mov eax, 4
mov ebx, 1
mov ecx, string
mov edx, string_l
int 80h
mov eax, 1
xor ebx, ebx
int 80h
section .data
string db 90, 111, 100, 10
string_l equ $ - string
index db 1
Jeśli to wszystko wiedziałeś i chciałeś tylko zapytać czy możesz użyć zmiennej w pamięci jako indeks to powiedziedź jest ultra krótka: Nie.