แอสเซมบลี - คำแนะนำเชิงตรรกะ

ชุดคำสั่งโปรเซสเซอร์มีคำสั่ง AND, OR, XOR, TEST และ NOT Boolean logic ซึ่งจะทดสอบตั้งค่าและล้างบิตตามความต้องการของโปรแกรม

รูปแบบสำหรับคำแนะนำเหล่านี้ -

ซีเนียร์ คำแนะนำ รูปแบบ
1 และ AND operand1, operand2
2 หรือ หรือ operand1, operand2
3 XOR XOR operand1, operand2
4 ทดสอบ TEST operand1, operand2
5 ไม่ ไม่ใช่ตัวถูกดำเนินการ 1

ตัวถูกดำเนินการตัวแรกในทุกกรณีอาจอยู่ในรีจิสเตอร์หรือในหน่วยความจำ ตัวถูกดำเนินการที่สองอาจอยู่ในรีจิสเตอร์ / หน่วยความจำหรือค่า (ค่าคงที่) ในทันที อย่างไรก็ตามไม่สามารถดำเนินการจากหน่วยความจำต่อหน่วยความจำได้ คำแนะนำเหล่านี้จะเปรียบเทียบหรือจับคู่บิตของตัวถูกดำเนินการและตั้งค่าแฟล็ก CF, OF, PF, SF และ ZF

คำสั่ง AND

คำสั่ง AND ใช้เพื่อสนับสนุนนิพจน์เชิงตรรกะโดยดำเนินการบิต AND การดำเนินการ bitwise AND จะส่งกลับ 1 หากบิตที่ตรงกันจากตัวถูกดำเนินการทั้งสองเป็น 1 มิฉะนั้นจะส่งกลับ 0 ตัวอย่างเช่น -

Operand1: 	0101
             Operand2: 	0011
----------------------------
After AND -> Operand1:	0001

การดำเนินการ AND สามารถใช้สำหรับการล้างบิตหนึ่งหรือหลายบิต ตัวอย่างเช่นสมมติว่า BL register มี 0011 1010 หากคุณต้องการล้างบิตลำดับสูงให้เป็นศูนย์ให้คุณและด้วย 0FH

AND	BL,   0FH   ; This sets BL to 0000 1010

ลองดูตัวอย่างอื่น หากคุณต้องการตรวจสอบว่าตัวเลขที่ระบุเป็นเลขคี่หรือคู่การทดสอบง่ายๆคือการตรวจสอบจำนวนบิตที่มีนัยสำคัญน้อยที่สุด ถ้านี่คือ 1 จำนวนนั้นเป็นเลขคี่มิฉะนั้นจำนวนจะเป็นคู่

สมมติว่าหมายเลขอยู่ในทะเบียน AL เราสามารถเขียน -

AND	AL, 01H     ; ANDing with 0000 0001
JZ    EVEN_NUMBER

โปรแกรมต่อไปนี้แสดงให้เห็นถึงสิ่งนี้ -

ตัวอย่าง

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

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -

Even Number!

เปลี่ยนค่าในการลงทะเบียน ax ด้วยเลขคี่เช่น -

mov  ax, 9h                  ; getting 9 in the ax

โปรแกรมจะแสดง:

Odd Number!

ในทำนองเดียวกันเพื่อล้างทะเบียนทั้งหมดคุณสามารถทำได้และด้วย 00H

หรือคำแนะนำ

คำสั่ง OR ใช้สำหรับสนับสนุนนิพจน์เชิงตรรกะโดยดำเนินการตามบิตหรือการดำเนินการ ตัวดำเนินการ bitwise OR จะคืนค่า 1 หากบิตที่ตรงกันจากตัวถูกดำเนินการอย่างใดอย่างหนึ่งหรือทั้งสองเป็นหนึ่ง จะคืนค่า 0 ถ้าทั้งสองบิตเป็นศูนย์

ตัวอย่างเช่น,

Operand1:     0101
             Operand2:     0011
----------------------------
After OR -> Operand1:    0111

การดำเนินการ OR สามารถใช้สำหรับการตั้งค่าหนึ่งบิตขึ้นไป ตัวอย่างเช่นสมมติว่า AL register มี 0011 1010 คุณต้องตั้งค่าบิตลำดับต่ำสี่ตัวคุณสามารถหรือด้วยค่า 0000 1111 เช่น FH

OR BL, 0FH                   ; This sets BL to  0011 1111

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงคำสั่ง OR ให้เราเก็บค่า 5 และ 3 ในการลงทะเบียน AL และ BL ตามลำดับจากนั้นคำสั่ง

OR AL, BL

ควรจัดเก็บ 7 ในทะเบียน 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

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -

7

คำสั่ง XOR

คำสั่ง XOR ใช้การดำเนินการ XOR แบบบิต การดำเนินการ XOR ตั้งค่าบิตผลลัพธ์เป็น 1 ในกรณีที่บิตจากตัวถูกดำเนินการต่างกัน ถ้าบิตจากตัวถูกดำเนินการเหมือนกัน (ทั้ง 0 หรือทั้ง 1) บิตผลลัพธ์จะถูกเคลียร์เป็น 0

ตัวอย่างเช่น,

Operand1:     0101
             Operand2:     0011
----------------------------
After XOR -> Operand1:    0110

XORing ตัวถูกดำเนินการกับตัวเองเปลี่ยนตัวถูกดำเนินการเป็น 0. ใช้เพื่อล้างทะเบียน

XOR     EAX, EAX

คำแนะนำในการทดสอบ

คำสั่ง TEST ทำงานเหมือนกับการดำเนินการ AND แต่ไม่เหมือนกับคำสั่ง AND คือไม่เปลี่ยนตัวถูกดำเนินการตัวแรก ดังนั้นหากเราต้องการตรวจสอบว่าตัวเลขในรีจิสเตอร์เป็นเลขคู่หรือเลขคี่เราสามารถทำได้โดยใช้คำสั่ง TEST โดยไม่ต้องเปลี่ยนหมายเลขเดิม

TEST    AL, 01H
JZ      EVEN_NUMBER

ไม่ใช่คำแนะนำ

คำสั่ง NOT ใช้การดำเนินการบิตไม่ การดำเนินการ NOT กลับบิตในตัวถูกดำเนินการ ตัวถูกดำเนินการอาจอยู่ในรีจิสเตอร์หรือในหน่วยความจำ

ตัวอย่างเช่น,

Operand1:    0101 0011
After NOT -> Operand1:    1010 1100