2011-12-04 4 views
4

J'essaie d'obtenir l'adresse d'une étiquette - voici quelques exemples de code:assembleur en ligne en C avec Turbo C 3.0 - comment obtenir l'adresse d'une étiquette

int main() { 
    asm { 
     mov ax,1 
     mov bx,ax 
    } 
    _labelname: 
    asm { 
     mov ax, OFFSET _labelname 
    } 

    return 0; 
} 

Compilation de ce code renvoie cette erreur : « Undefined symbol _labelname » Si je définis l'étiquette dans le bloc asm, je ne peux même pas utiliser JMP _labelname

J'ai trouvé this et ne fonctionne pas, pour this, en fait aucun moyen. This dit simplement sauter, ne pas adresser. Et this n'aide pas du tout. Aucune suggestion?

+0

Avez-vous essayé de définir l'étiquette à l'intérieur du bloc '_asm' réel? – Cyclonecode

+4

Demandé 20 ans trop tard. Veuillez mettre à jour votre compilateur. –

+0

@Krister Oui, j'ai essayé de définir dans asm block; ça ne marche toujours pas. – Mikael

Répondre

0

J'ai trouvé un moyen, mais vous ne pouvez pas utiliser une étiquette C, il doit être une étiquette asm:

int main(void) 
{ 
    asm { 
     mov ax,1 
     mov bx,ax 
    } 

    asm { _labelname: } 

    asm { 
     mov ax, OFFSET _labelname 
     jmp cs:_labelname 
    } 

    return 0; 
} 
+0

Pourquoi voter en bas? L'OP le voulait, l'OP l'a eu. –

+0

Vous êtes probablement indisponible car il ne fonctionne pas avec Turbo C 3.0. Je l'ai juste essayé. –

+0

Cela a fonctionné avec Turbo C++ 1.01 + TASM. Le compilateur est passé à la compilation via TASM. 3.0 devrait également avoir l'option -B pour compiler via l'assembleur, quelque chose comme 'tcc.exe -v -y -B lab.c' (-v et -y sont pour les informations de débogage afin que l'on puisse inspecter le résultat .EXE dans TD. EXE facilement). –

0

Il y a habituellement une route dans toutes les langues, mais vous devez faff au sujet pour un jour ou deux parce que ces choses ne sont pas toujours documentées

Déclarez un espace op global de mémoire dans votre saveur de HLL. DIM LABELNAME1(0)

recherche Ensuite, pour la syntaxe asm qui met l'adresse dans eax

mov eax, ^LABELNAME(0) 
mov eax, dword [_lablename] 
mov eax, ^_lablename 
etc etc etc 

puis pop dans asm

Vous ne trouverez pas pop [^ partout sur google, mais il est celui qui fonctionne dans certains HLL

push eax 
pop [^LABELNAME1(0)] 

maintenant, votre HLL et asm peuvent converser entre eux quand vous le souhaitez

Il vaut bien déterminer


Undefined symbol _labelname 

probbly doit être déclaré au début du programme

._labelname 
mov dword [_lablename], 0 

et utilisé plus tard par asm comme une étiquette

Comme je l'ai dit, vous aurez à embêter et à analyser pour votre saveur particulière de HLL, et les globales semblent fonctionner mieux

Vous aurez également besoin de savoir comment déclarer des zones de mémoire séparées pour stocker des variables dynamiques asm et l'exécution des opcodes ou vous obtiendrez le cache écrase qui paralysera les avantages de la vitesse de asm

Une petite routine que j'ai écrit sans séparer ces zones ASM a pris 20 heures à courir. Avec la séparation, il a fallu 1 heure


mov ax, OFFSET _labelname 

Ce sont des choses 16 bits, (DOS etc, avec des règles de mémoire loufoques) ne sont pas vous faire des choses 32 bits avec votre HLL ???

A moins qu'il ne se passe tout en un segment que vous aurez besoin d'un opérande double mémoire pour trouver _labelname, dx:ax etc, et comme mentionné précédemment, vous avez 20 ans trop tard

jmp cs:_labelname 

Travaux dans le même segment, mais En outre, si vos variables asm dynamiques sont placées dans votre segment de code ASM, alors une règle cardinale pour maximiser la vitesse ASM a été brisée pour un programme plus grand.

Questions connexes