Cours n° 2 - MsgBox

COURS N° 3 - Les registres du microprocesseur

Cours n° 4 - Adressages mémoire

Ce cours a pour objectif de vous montrer comment utiliser les registres. Seuls les registres de même taille peuvent être utilisés ensemble. On ne peut pas copier le contenu d'un registre 16 bits dans un registre 32 bits. Les deux opérandes doivent être de même taille tel que : mov eax, esp

Avant de commencer ce cours il est vivement recommandé de consulter : Les registres du microprocesseur

Les registres de segment ne sont pas directement utilisables. Pour cela, Il faut utiliser les instructions adéquates. Il est préférable de laisser le système d'exploitation gérer ces segments.

Version 16 bits

.386
.MODEL FLAT, STDCALL

INCLUDE \masm32\include\kernel32.inc

INCLUDELIB \masm32\lib\kernel32.lib

MonCode SEGMENT 'CODE'

   
;Point d'entrée du programme
    Main:
   
        ;Copie le contenu d'un registre 32 bits vers un autre registre 32 bits.      
        mov eax, ebp
        mov ebx, esp
        mov edx, edi
        mov ecx, esi
        mov esi, ecx
        mov edi, edx
        mov esp, ebx
        mov ebp, eax

        ;Copie le contenu d'un registre 16 bits vers un autre registre 16 bits.      
        mov ax, bp
        mov bx, sp
        mov dx, di
        mov cx, si
        mov si, cx
        mov di, dx
        mov sp, bx
        mov bp, ax

        ;Copie le contenu d'un registre 8 bits vers un autre registre 8 bits.      
        mov ah, bh
        mov al, bl
        mov bh, dh
        mov bl, dl
        mov dh, ch
        mov dl, cl
        mov ch, ah
        mov cl, al
        mov cl, dl
        mov bl, al
        mov bl, bl
      
        ;Le registre EFLAGS n'est pas directement utilisable. Il faut utiliser les instructions
        ;spéciales pour manipuler son contenu. Récupération et restauration du registre des drapeaux.
        ;Avant la restauration on met le bit 0 : CF à 1.      
        pushfd
        pop eax
        mov al,1 ;CF = 1
        push eax
        popfd
      
        ;Le registre EIP n'est pas directement utilisable. Il faut utiliser les instructions push et ret, call et ret ou
        ;alors les instructions de saut : jcond, pour placer une adresse offset valide dans ce registre.
      
        ;1) Utilisation des instructions push et ret
      
        push Function ;On place l'adresse Function sur la pile.
        ret ;Puis on dépile avec l'instruction ret qui a pour effet de placer l'adresse dans le registre EIP.
      
    Next:
      
        ;2)Utilisation de l'instruction call
      
        call Function1 ;L'instrction call place l'adresse Function1 dans le registre EIP
      
        ;3) Utilisation de l'instruction de saut inconditionnel : jmp
      
        jmp Function2 ;L'instruction jmp place dans le registre EIP l'adresse Function2
      
    EndProg:      
        ;Fin du programme      
        push 0h
        call ExitProcess
      
    Function:      
        mov eax, esp
        push Next ;On place l'adresse de l'instruction : call Function1 sur la pile.
        ret ;On dépile l'adresse dans le registre EIP
      
    Function1:      
        mov eax, ecx
        ret
      
    Function2:      
        mov eax, edi
        jmp EndProg ;jmp place dans le registre EIP l'adresse EndProg

MonCode ENDS

END Main


Le code présenté ci-dessus vous a donné un petit aperçu de ce qui peut être fait avec les registres.

Exercices

  1. Comment s'appelle le registre qui définit les bits d'état après une opération arithmétique ?
  2. Quel est le nom du groupe des registres du registre ECX ?
  3. Quel est le nom du registre utilisé par le microprocesseur pour exécuter une instruction ?
  4. Est-ce que les instructions suivantes sont valides, écrivez le code et compilez pour repérer les erreurs :
  5. mov eip, eax
    mov eax, ebx
    mov edi, si
    mov cx, bx
  6. Qu'est-ce qu'un registre ?
  7. Où trouve-t-on les registres ?
  8. Est-ce que l'on peut copier avec l'instruction mov le contenu d'un registre 8 bits dans un registre 16 bits ?

Réponses