แอสเซมบลี - คำแนะนำเชิงตรรกะ
ชุดคำสั่งโปรเซสเซอร์มีคำสั่ง 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