Je suppose que vous voulez call fs:bx
pour définir cs=fs
et ip=bx
, comme un appel lointain.
Les appels éloignés indirects nécessitent que seg: offset soit en mémoire et non en registre. Voir the insn ref entry for call
pour confirmer que le seul disponible indirect far call
est le formulaire call m16:16
.
Donc, dans le code 16 bits, vous pouvez
push fs
push bx
... ; push args
far call [bp-whatever] ; assuming you know the difference between bp and sp at this point
add sp, 4 + arg_size ; clean up args and the far-pointer
ou l'espace réserve sur la pile à l'avance afin que vous puissiez faire quelque chose comme
my_function:
push bp
mov bp, sp
sub sp, 16 ; or whatever size you need for locals. 16 and 8 are just for example.
...
mov [bp - 8], fs
mov [bp - 6], bx ; separately store both parts of fs:bx into [bp-8]
far call [bp - 8]
...
leave
ret
Vous ne pouvez pas mov cs, fs
ou quelque chose comme que (même en utilisant un registre GP scratch). Changement cs
serait un saut, de sorte que vous devez faire le tout comme un far call
.
Bien sûr, vous avez probablement Rapprochez la valeur du segment dans fs
en premier lieu à mettre en place pour cette instruction, donc ne pas le faire en premier lieu.
J'ai une question: que signifie "quoi" dans votre exemple? – SeeSoftware
@SeeSoftware: Il s'agit d'une constante numérique qui dépend de la taille de la pile (c.-à-d. La différence entre bp et sp après avoir appuyé sur fs et bx.) Equivalemment, vous pouvez réserver de l'espace dans votre pile de fonctions. mov [bp - 8], fs '/ mov [bp - 6], bx'/... /' call [bp - 8] ' –
en fait vous pouvez simplement utiliser [sp] au lieu de [bp-whatever] et cela fonctionne bien pour moi comment y retourner? "ret" ou "retf" ou autre chose EDIT: vous ne pouvez pas utiliser sp directement vous devez le mettre dans un autre registre – SeeSoftware