Opérateurs SEG et OFFSET d’assemblage Open Watcom Inline

Aujourd’hui, j’ai appris que l’opérateur SEG dans MASM renvoie par défaut l’adresse du GROUPE et non l’adresse du SEGMENT de l’expression en question, et qu’il existe des options et des méthodes pour le remplacer.

Étant donné que je suis actuellement en train de réaliser un projet complexe sous DOS Open Watcom 1.9 / 16 bits où C et assemblage (en ligne et autonome) sont mélangés (en fait, le DOS n’est nécessaire que pour le démarrage, puis mon propre MINI-OS sachant que WASM est un peu compatible avec MASM, j’ai la question suivante:

Lors de l’assemblage en ligne et de la prise du segment d’une variable, l’opérateur SEG renvoie-t-il le groupe ou le segment dans lequel se trouve la variable?

Supposons qu’il existe un GROUPE nommé MY_GROUP, un SEGMENT appelé MY_SEG appartenant à MY_GROUP et une variable / étiquette nommée MY_VAR placée dans MY_SEG.

Ensuite, si je le fais

_asm { MOV AX, SEG MY_VAR } 

quelle valeur est chargée dans AX? Est-ce l’adresse de MY_GROUP ou l’adresse de MY_SEG (étant donné qu’ils sont différents)?

Je n’ai trouvé aucun commutateur de ligne de commande lié à ce problème dans l’assemblage en ligne . J’ai ensuite essayé la syntaxe MASM:

 _asm { MOV AX, SEG MY_GROUP:MY_VAR MOV AX, SEG MY_SEG:MY_VAR } 

Les deux lignes ci-dessus entraînent l’erreur suivante: “Seule une étiquette de segment ou de groupe est autorisée”.

Veuillez noter que mon problème concerne uniquement l’assemblage en ligne. En fait, j’utilise JWASM pour les modules d’assemblage autonomes, et la syntaxe ci-dessus fonctionne bien avec les résultats escomptés.

Quelqu’un pourrait-il me dire ce que l’assembleur en ligne fait dans cette situation et s’il existe des moyens de contrôler son comportement?

Merci beaucoup!

Je ne pense pas qu’il soit possible de convaincre le compilateur OpenWatcom d’émettre un transfert de segment basé sur un groupe. Une partie du problème est qu’il n’ya aucun moyen de déclarer ou de définir le groupe afin que vous puissiez y faire référence dans l’assemblage en ligne.

Cependant, il semble que l’éditeur de liens OpenWatcom ignore le fait que les relocalisations sont basées sur un segment et utilise à la place le groupe auquel le segment appartient en tant que base. En supposant que vous utilisiez wlink dans votre premier exemple, AX serait chargé avec une valeur de segment qui pointe vers le début de MY_GROUP. D’autre part, si vous utilisez l’éditeur de liens segmenté de Microsoft, AX contiendra une valeur de segment qui pointe vers MY_SEG.