![]() |
COURS N° 3 - Les registres du microprocesseur |
![]() |
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
mov eip, eax
mov eax, ebx
mov edi, si
mov cx, bx