2015-11-02 1 views
1

Je suis un peu nouveau à l'architecture x86 et aussi à l'assemblage. J'ai ce code pièce que je ne peux pas comprendre.l'utilisation de "db" dans l'architecture Intel x86 et DOSBOX

data1 SEGMENT 
    dat1 db 'ABCDEFGH' 
data1 ENDS 

qui est au début du code. Plus tard, nous utilisons ce data1 dans le code:

mov ax, data1 
mov ds, ax 

J'utilise DOSBOX comme un émulateur et le débogueur turbo et là, il apparaît comme:

mov ax, 0B14 
mov ds, ax 

Toute idée pourquoi? Je ne comprends pas non plus l'utilisation de DB en général. Parfois, il est utilisé pour afficher un message, parfois similaire à mon exemple.

Merci beaucoup à l'avance :)

+0

Est-ce une faute de frappe? 'mov ax, donnee1' Voulez-vous dire' mov ax, data1'? –

+0

@ user3144770 oui c'était merci :) – Ege

Répondre

1

La déclaration db est utilisée pour définir les octets. Ce n'est pas vraiment une instruction, mais plutôt l'utilisateur de l'assembly qui place des données personnalisées quelque part. Ces données se trouvent à un emplacement spécifique en mémoire, de sorte que les données désassemblées affichent une adresse, au lieu de l'étiquette, qui est utilisée dans le code. L'étiquette est juste un espace réservé pour l'adresse, qui est assignée par l'assembleur.

1

Le fait que data1 soit au début du code n'est pas trop important. L'assembleur/éditeur de liens lui donnera un emplacement approprié dans l'EXE. Donc, il est parfaitement possible de voir mov ax, 0B14 dans le débogueur. 0B14h est l'adresse où ce segment de données a été placé dans l'EXE.

Il n'y a pas beaucoup de différence entre votre exemple et l'utilisation de db pour afficher un message. Tout au plus dans ce dernier cas, un octet de terminaison aurait été ajouté.

dat1 db 'ABCDEFGH' 

dat1 db 'ABCDEFGH',0 

dat1 db 'ABCDEFGH','$' 
+0

ok merci beaucoup mais maintenant j'ai encore une question :) alors quand je vais en ds à 0B14 je devrais pouvoir voir 'ABCDEFGH', probablement en ascii mais quand je le fais , Je vois des nombres aléatoires. Soit dit en passant, supposons que ds: data1 doit être dans ds – Ege

+0

Si la valeur 0B14h est la valeur réellement encodée dans l'EXE, elle sera modifiée par le processus de relocalisation du chargeur de programme. Vous devez donc savoir où se trouvent les choses lorsque vous utilisez un débogueur. Je ne peux pas vous aider là-bas. –

+0

@thebok et user-numberguy: 0B14 est le * segment *, pas l'adresse dans le segment. Une fois que votre code fait 'mov ds, ax', la mémoire de' ds: [dat1] 'devrait contenir votre chaîne ASCII. Notez que 'data1' est une étiquette de segment,' dat1' est une étiquette normale. IDK si les programmes DOS obtiennent un transfert d'exécution. Le modèle de mémoire segmentée 16bit n'est pas une chose très utile à apprendre, esp. si vous essayez juste d'apprendre l'assemblage. La chose utile à faire avec asm ces jours-ci est la plupart du temps l'écriture de boucles internes optimisées (par exemple pour des choses comme les codecs vidéo), qui fonctionnent en mode 64 bits avec la mémoire paginée. Voir http://agner.org/optimize/ –