assembler - procesor 8086, instrukcja loop

assembler - procesor 8086, instrukcja loop
pieczara
  • Rejestracja: dni
  • Ostatnio: dni
0

Mam fragment kodu:

Kopiuj
mov cx,2

c: add ax,2
loop c

Po skompilowaniu w/w w pamięci pierwsza instrukcja zajmie 3b (b9 02 00) pod adresem 0,
druga z etykietą c: też zajmie 3b (05 02 00) pod adresem 3,
trzecia, loop zajmie 2b (e2 fb) pod adresem 6

Tu następuje moje pytanie skąd kompilator wie, że pętla ma odwoływać się pod adres instrukcji za etykietą (adr 3) i dlaczego drugi bajt instrukcji loop to fb (przypuszczam że jest tam zakodowany jakoś adres instrukcji drugiej za etykietą c: ?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Nie bardzo rozumiem pytanie. Loop to jest zwykłe

Kopiuj
sub cx
cmp cx,0
ja adres_etykietki

W tym skoku oczywiście masz już zakodowany adres gdzie skaczesz.

pieczara
  • Rejestracja: dni
  • Ostatnio: dni
0

I właśnie skąd kompilator wie co to będzie za adres pod który skoczyć (chyba że jest określany na innym etapie). Zlicza jakoś długość wcześniejszych instrukcji czy jeszcze inaczej?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Ach no w chwili kompilacji etykietki są zamieniane na wyliczone adresy.

pieczara
  • Rejestracja: dni
  • Ostatnio: dni
0

Ok dzięki, o to mi chodziło. Rozumiem że kompilator zlicza adres każdej kolejnej instrukcji i w chwili napotkania instrukcji skoku przypisuje adres tej przy etykiecie.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

i dlaczego drugi bajt instrukcji loop to fb (przypuszczam że jest tam zakodowany jakoś adres instrukcji drugiej za etykietą c: ?

Adres jest podany jako 1-bajtowa liczba ze znakiem, w tym przypadku wartość oznacza -5, czyli 5 bajtow wstecz licząc od początku następnej instrukcji.

Kopiuj
b9 02 00 05 02 00 e2 fb XX
         -5 -4 -3 -2 -1  0

jak widzisz 5 bajtów do tyłu licząc od hipotetycznej następnej instrukcji wskazuje na początek instrukcji, która była oznaczona etykietą.

Zlicza jakoś długość wcześniejszych instrukcji czy jeszcze inaczej?
Zlicza.

pieczara
  • Rejestracja: dni
  • Ostatnio: dni
0

Dzięki, czyli adres to przesunięcie od kolejnej instrukcji zakodowane w U2, ok.
Czy analogicznie ma się sytuacja nie tylko w przypadku loop ale innych instrukcji skoku?

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

Tak. Większość instrukcji skoków tak wygląda (np. wszystkie skoki warunkowe), ale są też instrukcje skoków bezwzględnych, pod konkretnie podany adres.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.