2016-08-13 4 views
1

Je crée un noyau et j'ai besoin d'aide pour l'instruction d'appel. J'utilise Flat Assembler pour construire le noyau.Comment utiliser fs: bx dans l'instruction d'appel de Flat Assembler?

call fs:bx 

Est-ce possible?
Parce que l'assembleur plat me donne une "taille d'opérande invalide" Erreur.

Je sais que je peux faire

call 1000h:0h 

Mais ce n'est pas ce que je veux. Est-ce que quelqu'un a la réponse à cette question?

Répondre

2

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.

+0

J'ai une question: que signifie "quoi" dans votre exemple? – SeeSoftware

+0

@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] ' –

+0

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