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 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