Vielen Dank schonmal für die Antwort!
Leider funktioniert es immer noch nicht.
Sieht jetzt so aus:
Code: Alles auswählen
procedure dummy;
begin
end;
procedure decode_bitstream; assembler;
asm
jmp @suchen
@sprungtabelle:
dw offset dummy { 0 }
dw offset decode_bitstream_asm_1 { 1 }
dw offset decode_bitstream_asm_2 { 2 }
dw offset decode_bitstream_asm_3 { 3 }
dw offset decode_bitstream_asm_4 { 4 }
dw offset decode_bitstream_asm_5 { 5 }
dw offset dummy { 6 }
dw offset dummy { 7 }
dw offset dummy { 8 }
dw offset decode_bitstream_asm_1_transp { 9 }
dw offset decode_bitstream_asm_2_transp { 10 }
dw offset decode_bitstream_asm_3_transp { 11 }
dw offset decode_bitstream_asm_4_transp { 12 }
dw offset decode_bitstream_asm_5_transp { 13 }
@suchen:
mov al, blocktype { 1 oder 2 ( 2 = transparent) }
dec al { jetzt 0 oder 1 }
{###}and al, 1
shl al, 3 { jetzt 0 oder 8 }
mov bl, bits { 1-5 }
{###}and bl, 01fh
add bl, al { 1-5 oder 9-13 }
{###}cmp bl, 13
{###}jg @dummy
xor bh, bh
shl bx, 1
lea si, [bx+offset @sprungtabelle]
call si
@dummy:
end;
Einen Sprung in eine Procedure wollte ich nicht machen, daher nur Sprung zu label wenn größer 13...
Ich glaube aber auch nicht, dass das Problem bei den Variablen "blocktype" und "bits" zu suchen ist.
Die sind schon verlässlich in ihren Bereichen, sonst würde das bisherige Programm auch nicht
funktionieren.
Ich glaube da stimmt eher noch etwas nicht mit den Adressen.
SI muss doch den Offset enthalten, der tatsächlich in IP geladen wird, oder?
Was macht LEA... LEA erwartet eine Variable. Diese wäre hier [bx+offset @sprungtabelle]
und somit ein Eintrag aus der Tabelle. Wenn ich soweit schonmal richtig liege.
Somit hätten wir aber in SI nicht den Offset zu einer Procedure, sondern lediglich
den Offset zur Position in der Sprungtabelle...