Assemblage - Cordes

Nous avons déjà utilisé des chaînes de longueur variable dans nos exemples précédents. Les chaînes de longueur variable peuvent comporter autant de caractères que nécessaire. En général, nous spécifions la longueur de la chaîne de l'une des deux manières -

  • Stockage explicite de la longueur de la chaîne
  • Utiliser un personnage sentinelle

Nous pouvons stocker la longueur de la chaîne de manière explicite en utilisant le symbole de compteur $ location qui représente la valeur actuelle du compteur de localisation. Dans l'exemple suivant -

msg  db  'Hello, world!',0xa ;our dear string
len  equ  $ - msg            ;length of our dear string

$ pointe vers l'octet après le dernier caractère de la variable chaîne msg . Par conséquent,$-msgdonne la longueur de la chaîne. On peut aussi écrire

msg db 'Hello, world!',0xa ;our dear string
len equ 13                 ;length of our dear string

Vous pouvez également stocker des chaînes avec un caractère sentinelle de fin pour délimiter une chaîne au lieu de stocker explicitement la longueur de la chaîne. Le caractère sentinelle doit être un caractère spécial qui n'apparaît pas dans une chaîne.

Par exemple -

message DB 'I am loving it!', 0

Instructions de chaîne

Chaque instruction de chaîne peut nécessiter un opérande source, un opérande de destination ou les deux. Pour les segments 32 bits, les instructions de chaîne utilisent les registres ESI et EDI pour pointer respectivement vers les opérandes source et destination.

Pour les segments de 16 bits, cependant, les registres SI et DI sont utilisés pour pointer respectivement vers la source et la destination.

Il existe cinq instructions de base pour le traitement des chaînes. Ils sont -

  • MOVS - Cette instruction déplace 1 octet, mot ou double mot de données d'un emplacement de mémoire à un autre.

  • LODS- Cette instruction se charge depuis la mémoire. Si l'opérande est d'un octet, il est chargé dans le registre AL, si l'opérande est d'un mot, il est chargé dans le registre AX et un double mot est chargé dans le registre EAX.

  • STOS - Cette instruction stocke les données du registre (AL, AX ou EAX) dans la mémoire.

  • CMPS- Cette instruction compare deux éléments de données en mémoire. Les données peuvent être de la taille d'un octet, d'un mot ou d'un double mot.

  • SCAS - Cette instruction compare le contenu d'un registre (AL, AX ou EAX) avec le contenu d'un élément en mémoire.

Chacune des instructions ci-dessus a une version octet, mot et double mot, et les instructions de chaîne peuvent être répétées en utilisant un préfixe de répétition.

Ces instructions utilisent la paire de registres ES: DI et DS: SI, où les registres DI et SI contiennent des adresses de décalage valides qui se réfèrent aux octets stockés en mémoire. SI est normalement associé à DS (segment de données) et DI est toujours associé à ES (segment supplémentaire).

Les registres DS: SI (ou ESI) et ES: DI (ou EDI) pointent respectivement vers les opérandes source et destination. L'opérande source est supposé être à DS: SI (ou ESI) et l'opérande de destination à ES: DI (ou EDI) en mémoire.

Pour les adresses 16 bits, les registres SI et DI sont utilisés, et pour les adresses 32 bits, les registres ESI et EDI sont utilisés.

Le tableau suivant fournit différentes versions des instructions de chaîne et l'espace supposé des opérandes.

Instruction de base Opérandes à Opération d'octet Opération Word Opération de double mot
MOVS ES: DI, DS: SI MOVSB MOVSW MOVSD
LODS AX, DS: SI LODSB LODSW LODSD
STOS ES: DI, AX STOSB STOSW STOSD
CMPS DS: SI, ES: DI CMPSB CMPSW CMPSD
SCAS ES: DI, AX SCASB SCASW SCASD

Préfixes de répétition

Le préfixe REP, lorsqu'il est défini avant une instruction de chaîne, par exemple - REP MOVSB, provoque la répétition de l'instruction basée sur un compteur placé dans le registre CX. REP exécute l'instruction, diminue CX de 1 et vérifie si CX est égal à zéro. Il répète le traitement des instructions jusqu'à ce que CX soit nul.

Le drapeau de direction (DF) détermine la direction de l'opération.

  • Utilisez CLD (Clear Direction Flag, DF = 0) pour effectuer l'opération de gauche à droite.
  • Utilisez STD (Set Direction Flag, DF = 1) pour effectuer l'opération de droite à gauche.

Le préfixe REP a également les variations suivantes:

  • REP: C'est la répétition inconditionnelle. Il répète l'opération jusqu'à ce que CX soit nul.

  • REPE ou REPZ: C'est une répétition conditionnelle. Il répète l'opération tandis que l'indicateur zéro indique égal / zéro. Il s'arrête lorsque le ZF indique pas égal / zéro ou lorsque CX est nul.

  • REPNE ou REPNZ: C'est aussi une répétition conditionnelle. Il répète l'opération tandis que l'indicateur zéro indique pas égal / zéro. Il s'arrête lorsque le ZF indique égal / zéro ou lorsque CX est décrémenté à zéro.