Assembly - Hướng dẫn logic
Tập lệnh bộ xử lý cung cấp các lệnh AND, OR, XOR, TEST và NOT Boolean logic, kiểm tra, thiết lập và xóa các bit tùy theo nhu cầu của chương trình.
Định dạng cho các hướng dẫn này -
Sr.No. | Chỉ dẫn | định dạng |
---|---|---|
1 | VÀ | AND toán hạng1, toán hạng2 |
2 | HOẶC LÀ | HOẶC toán hạng1, toán hạng2 |
3 | XOR | Toán hạng XOR1, toán hạng2 |
4 | KIỂM TRA | TEST toán hạng 1, toán hạng 2 |
5 | KHÔNG PHẢI | KHÔNG phải toán hạng 1 |
Toán hạng đầu tiên trong tất cả các trường hợp có thể nằm trong thanh ghi hoặc trong bộ nhớ. Toán hạng thứ hai có thể nằm trong thanh ghi / bộ nhớ hoặc một giá trị tức thời (hằng số). Tuy nhiên, không thể thực hiện các thao tác chuyển bộ nhớ vào bộ nhớ. Các lệnh này so sánh hoặc khớp các bit của toán hạng và đặt cờ CF, OF, PF, SF và ZF.
Hướng dẫn AND
Lệnh AND được sử dụng để hỗ trợ các biểu thức logic bằng cách thực hiện thao tác AND bit. Phép toán bitwise AND trả về 1, nếu các bit phù hợp từ cả hai toán hạng là 1, ngược lại nó trả về 0. Ví dụ:
Operand1: 0101
Operand2: 0011
----------------------------
After AND -> Operand1: 0001
Phép toán AND có thể được sử dụng để xóa một hoặc nhiều bit. Ví dụ, giả sử thanh ghi BL chứa 0011 1010. Nếu bạn cần xóa các bit bậc cao về 0, bạn VÀ nó với 0FH.
AND BL, 0FH ; This sets BL to 0000 1010
Hãy lấy một ví dụ khác. Nếu bạn muốn kiểm tra xem một số nhất định là số lẻ hay số chẵn, một bài kiểm tra đơn giản sẽ là kiểm tra bit quan trọng nhất của số đó. Nếu số này là 1, số này là số lẻ, số khác là số chẵn.
Giả sử số có trong thanh ghi AL, chúng ta có thể viết:
AND AL, 01H ; ANDing with 0000 0001
JZ EVEN_NUMBER
Chương trình sau đây minh họa điều này -
Thí dụ
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
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Even Number!
Thay đổi giá trị trong thanh ghi ax bằng một chữ số lẻ, như -
mov ax, 9h ; getting 9 in the ax
Chương trình sẽ hiển thị:
Odd Number!
Tương tự để xóa toàn bộ sổ đăng ký, bạn có thể VÀ nó với 00H.
Hướng dẫn HOẶC
Lệnh OR được sử dụng để hỗ trợ biểu thức logic bằng cách thực hiện phép toán OR theo bit. Toán tử OR theo bitwise trả về 1, nếu các bit phù hợp từ một trong hai hoặc cả hai toán hạng là một. Nó trả về 0, nếu cả hai bit đều bằng không.
Ví dụ,
Operand1: 0101
Operand2: 0011
----------------------------
After OR -> Operand1: 0111
Phép toán OR có thể được sử dụng để thiết lập một hoặc nhiều bit. Ví dụ, giả sử thanh ghi AL chứa 0011 1010, bạn cần đặt bốn bit bậc thấp, bạn có thể HOẶC nó với giá trị 0000 1111, tức là FH.
OR BL, 0FH ; This sets BL to 0011 1111
Thí dụ
Ví dụ sau minh họa lệnh OR. Hãy để chúng tôi lưu trữ giá trị 5 và 3 trong thanh ghi AL và BL, sau đó là lệnh,
OR AL, BL
nên lưu trữ 7 trong thanh ghi 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
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
7
Hướng dẫn XOR
Lệnh XOR thực hiện thao tác XOR theo bit. Phép toán XOR đặt bit kết quả thành 1, nếu và chỉ khi các bit từ các toán hạng khác nhau. Nếu các bit từ các toán hạng giống nhau (cả 0 hoặc cả 1), bit kết quả được xóa thành 0.
Ví dụ,
Operand1: 0101
Operand2: 0011
----------------------------
After XOR -> Operand1: 0110
XORing một toán hạng với chính nó sẽ thay đổi toán hạng thành 0. Điều này được sử dụng để xóa sổ đăng ký.
XOR EAX, EAX
Hướng dẫn TEST
Lệnh TEST hoạt động giống như hoạt động AND, nhưng không giống như lệnh AND, nó không thay đổi toán hạng đầu tiên. Vì vậy, nếu chúng ta cần kiểm tra xem một số trong thanh ghi là chẵn hay lẻ, chúng ta cũng có thể thực hiện việc này bằng cách sử dụng lệnh TEST mà không cần thay đổi số ban đầu.
TEST AL, 01H
JZ EVEN_NUMBER
Hướng dẫn NOT
Lệnh NOT thực hiện thao tác NOT bitwise. Phép toán NOT đảo ngược các bit trong một toán hạng. Toán hạng có thể nằm trong thanh ghi hoặc trong bộ nhớ.
Ví dụ,
Operand1: 0101 0011
After NOT -> Operand1: 1010 1100