2016-09-21 5 views
1

ich versuche, eine Verzweigungstabelle 8086 in der Montage zu tunVerzweigungstabelle in der Montage 8086

ich es geschrieben habe:

org 100h      

    ; START THE PROGRAM 

    mov si, 1 
    jmp cs:table[si] 

    table dw C1, C2, C3 

C1: 
    add bx, 1 
    jmp EXIT 

C2: 
    add bx, 2 
    jmp EXIT 

C3: 
    add bx, 3 
    jmp EXIT 
C4: 
    add bx, 4 
    jmp EXIT 

; EXIT PRORGRAM 
EXIT: 
    mov ah, 0 
    int 16h 
    ret 

Der Code funktioniert nicht, es ist Sprung auf die falsche Bezeichnung.

Jemand kann mir ein Beispiel geben oder meinen Code korrigieren?

+5

Erinnern Sie sich daran, dass jeder Eintrag in der Tabelle zwei Bytes lang ist, daher muss der Index vorher mit 2 multipliziert werden. – fuz

Antwort

7

Darauf achten, dass

jmp cs:table[si] 

eigentlich eine verstümmelte Version von

ist
jmp cs:[table + si] 

Es ist kein Array Indizierung.
Die Assemblersprache hat keine Typen. Um Verwechslungen zu vermeiden, verwenden Sie keine so unorthodoxe Syntax.


Angenommen table beginnt bei 1000h. Dann

                                                              Table in memory at 1000h

Mit SI = 1 wird der Offset zum Springen zu 1000h + 1 = 1001h genommen.
Das Wort an dieser Stelle belegt 1001h und 1002h, also kreuzt es C1 und C2.

Die direkte Verwendung des Indexes für den Zugriff auf ein Array ist ein Komfort, der in der Assembly nicht verfügbar ist. Wir müssen den Index basierend auf der Größe der Elemente skalieren.
In diesem Fall jedes Element ist ein Wort, 2 Byte, so muss der Index von 2.

Index Scaled index Address accessed 
0   0    1000h 
1   2    1002h 
2   4    1004h 

So

mov si, 1 
shl si, 1   ;Scale index, SI = SI*2^1 = SI*2 
jmp cs:table[si] 

oder besser skaliert werden, wenn der Index auf „Kompilierung bekannt ist "

mov si, 2   ;Use scaled index directly 
jmp cs:table[si] 
+2

Schöne Antwort und +1 für die Grafik! –