Assemblage - Instructions logiques
Le jeu d'instructions du processeur fournit les instructions de logique booléenne AND, OR, XOR, TEST et NOT, qui teste, définit et efface les bits en fonction des besoins du programme.
Le format de ces instructions -
N ° Sr. | Instruction | Format |
---|---|---|
1 | ET | ET opérande1, opérande2 |
2 | OU | OU opérande1, opérande2 |
3 | XOR | Opérande XOR1, opérande2 |
4 | TESTER | TEST opérande1, opérande2 |
5 | NE PAS | NOT opérande1 |
Le premier opérande dans tous les cas peut être soit en registre, soit en mémoire. Le deuxième opérande peut être soit dans le registre / mémoire, soit dans une valeur immédiate (constante). Cependant, les opérations de mémoire à mémoire ne sont pas possibles. Ces instructions comparent ou correspondent aux bits des opérandes et définissent les indicateurs CF, OF, PF, SF et ZF.
L'instruction AND
L'instruction AND est utilisée pour prendre en charge les expressions logiques en exécutant l'opération AND au niveau du bit. L'opération AND au niveau du bit renvoie 1, si les bits correspondants des deux opérandes sont 1, sinon elle renvoie 0. Par exemple -
Operand1: 0101
Operand2: 0011
----------------------------
After AND -> Operand1: 0001
L'opération ET peut être utilisée pour effacer un ou plusieurs bits. Par exemple, disons que le registre BL contient 0011 1010. Si vous devez effacer les bits de poids fort à zéro, vous ET avec 0FH.
AND BL, 0FH ; This sets BL to 0000 1010
Prenons un autre exemple. Si vous voulez vérifier si un nombre donné est pair ou impair, un test simple serait de vérifier le bit le moins significatif du nombre. Si c'est 1, le nombre est impair, sinon le nombre est pair.
En supposant que le nombre est dans le registre AL, nous pouvons écrire -
AND AL, 01H ; ANDing with 0000 0001
JZ EVEN_NUMBER
Le programme suivant illustre cela -
Exemple
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov ax, 8h ;getting 8 in the ax
and ax, 1 ;and ax with 1
jz evnn
mov eax, 4 ;system call number (sys_write)
mov ebx, 1 ;file descriptor (stdout)
mov ecx, odd_msg ;message to write
mov edx, len2 ;length of message
int 0x80 ;call kernel
jmp outprog
evnn:
mov ah, 09h
mov eax, 4 ;system call number (sys_write)
mov ebx, 1 ;file descriptor (stdout)
mov ecx, even_msg ;message to write
mov edx, len1 ;length of message
int 0x80 ;call kernel
outprog:
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
even_msg db 'Even Number!' ;message showing even number
len1 equ $ - even_msg
odd_msg db 'Odd Number!' ;message showing odd number
len2 equ $ - odd_msg
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -
Even Number!
Changez la valeur dans le registre de la hache avec un chiffre impair, comme -
mov ax, 9h ; getting 9 in the ax
Le programme afficherait:
Odd Number!
De même, pour effacer tout le registre, vous pouvez ET avec 00H.
L'instruction OR
L'instruction OR est utilisée pour prendre en charge l'expression logique en exécutant une opération OR au niveau du bit. L'opérateur OR au niveau du bit renvoie 1, si les bits correspondants de l'un ou des deux opérandes sont un. Il renvoie 0, si les deux bits sont nuls.
Par exemple,
Operand1: 0101
Operand2: 0011
----------------------------
After OR -> Operand1: 0111
L'opération OR peut être utilisée pour définir un ou plusieurs bits. Par exemple, supposons que le registre AL contient 0011 1010, vous devez définir les quatre bits de poids faible, vous pouvez OU avec une valeur 0000 1111, c'est-à-dire FH.
OR BL, 0FH ; This sets BL to 0011 1111
Exemple
L'exemple suivant illustre l'instruction OR. Stockons respectivement la valeur 5 et 3 dans les registres AL et BL, puis l'instruction,
OR AL, BL
devrait stocker 7 dans le registre AL -
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov al, 5 ;getting 5 in the al
mov bl, 3 ;getting 3 in the bl
or al, bl ;or al and bl registers, result should be 7
add al, byte '0' ;converting decimal to ascii
mov [result], al
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 0x80
outprog:
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .bss
result resb 1
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -
7
L'instruction XOR
L'instruction XOR implémente l'opération XOR au niveau du bit. L'opération XOR met le bit résultant à 1, si et seulement si les bits des opérandes sont différents. Si les bits des opérandes sont identiques (tous les deux 0 ou les deux 1), le bit résultant est remis à 0.
Par exemple,
Operand1: 0101
Operand2: 0011
----------------------------
After XOR -> Operand1: 0110
XORing un opérande avec lui-même change l'opérande en 0. Ceci est utilisé pour effacer un registre.
XOR EAX, EAX
L'instruction TEST
L'instruction TEST fonctionne de la même manière que l'opération AND, mais contrairement à l'instruction AND, elle ne change pas le premier opérande. Donc, si nous avons besoin de vérifier si un nombre dans un registre est pair ou impair, nous pouvons également le faire en utilisant l'instruction TEST sans changer le nombre d'origine.
TEST AL, 01H
JZ EVEN_NUMBER
L'instruction NOT
L'instruction NOT implémente l'opération NOT au niveau du bit. L'opération NOT inverse les bits d'un opérande. L'opérande peut être dans un registre ou dans la mémoire.
Par exemple,
Operand1: 0101 0011
After NOT -> Operand1: 1010 1100