วันพฤหัสบดีที่ 13 สิงหาคม พ.ศ. 2552

Bit Shift

การกระทำระดับบิต

การจัดการกับข้อมูลที่เราได้ศึกษาในบทก่อน ๆ นั้นมีหน่วยย่อยในการจัดการเป็นไบต์ โดยเราไม่สามารถจัดการข้อมูลที่มีขนาดย่อยกว่านั้นได้ แต่ในการทำงานจริงในบางครั้งรูปแบบของข้อมูลที่เราต้องจัดการจะอยู่ในรูปของบิต เราจึงใช้คำสั่งเกี่ยวกับการจัดการระดับบิตในการประมวลผลข้อมูลกลุ่มนี้ และในบางกรณีคำสั่งกระทำระดับบิตสามารถช่วยให้การคำนวณต่าง ๆ ทำได้ง่ายขึ้นด้วย
คำสั่งปฏิบัติการกับบิต
คำสั่งที่สามารถปฏิบัติการกับบิตในรีจิสเตอร์กับหน่วยความจำ แบ่งออกเป็น 3 พวก คือ คำสั่งพวก logical , shift และ rotate ดังตาราง

ตาราง คำสั่งปฏิบัติการกับบิต
Mnemonic
Assembler Format
Flags
OF DF IF TF SF ZF AF PF CF


AND
OR
XOR
NOT
TEST


AND destination,source
OR destination,source
XOR destination,source
NOT destination
TEST destination,source

LOGICAL
0 - - - * * ? * 0
0 - - - * * ? * 0
0 - - - * * ? * 0
- - - - - - - - -
0 - - - * * ? * 0



SAL/SHL
SAR
SHR


SAL destination,count
SAR destination,count
SHR destination,count

SHIFT
* - - - * * ? * *
* - - - * * ? * *
* - - - 0 * ? * *



ROL
ROR
RCL
RCR



ROL destination,count
ROR destination,count
RCL destination,count
RCR destination,count

ROTATE
* - - - - - - - *
* - - - - - - - *
* - - - - - - - *
* - - - - - - - *
Note: * means changed,- means unchanged,? means undefined


คำสั่งทางตรรกศาสตร์
คำสั่งในกลุ่มนี้เป็นคำสั่งประมวลผลข้อมูลระดับบิต โดยจะนำค่าในแต่ระบิตของข้อมูลมาประมวลผลทางตรรกศาสตร์ คำสั่งในกลุ่มนี้ได้แก่ คำสั่ง AND คำสั่ง OR คำสั่ง XOR และคำสั่ง NOT รูปแบบการใช้งานของคำสั่ง AND คำสั่ง OR และคำสั่ง XOR จะมีลักษณะเหมือนกัน คือจะรับโอเปอร์แรนด์สองตัว และจะนำข้อมูลในโอเปอร์แรนด์ตัวแรกมากระทำกับข้อมูลตัวที่สอง และจะเก็บผลลัพธ์ของการกระทำนั้นในโอเปอร์แรนด์ตัวแรก ส่วนในกรณีของคำสั่ง NOT จะรับโอเปอร์แรนด์ตัวเดียว และจะทำการกลับค่าในบิตแล้วเก็บผลลัพธ์ลงในโอเปอร์แรนด์ตัวนั้นเลย ตารางค่าความจริงของการกระทำทางตรรกศาสตร์เป็นดังตารางที่ 1

A B
A and B A or B A xor B not B
0 0
0 0 0 1
0 1
0 1 1 0
1 0
0 1 1 1
1 1
1 1 0 0
ตารางที่ 1 ค่าของการกระทำทางตรรกศาสตร์

คำสั่ง AND
คำสั่งนี้จะนำบิตแต่ละบิตมากระทำลอจิก AND กันโดยผลลัพธ์จะเก็บใน destination ค่าของ destination อาจเป็นค่าในหน่วยความจำหรือรีจิสเตอร์ก็ได้ ส่วนค่าของ source จะเป็นค่าในรีจิสเตอร์ หน่วยความจำ หรือการอ้างแอดเดรสแบบ immediate ก็ได้ ( ผลลัพธ์ของคำสั่ง AND จะมีบิตที่เป็น 1 เมื่อบิตของข้อมูลตัวตั้งทั้งสองตัวมีค่าเป็น 1 ดังตารางที่ 1)
รูปแบบของคำสั่งเป็นดังนี้

AND destination,source

ภาษาแอสเซมบลี
การทำงาน

AND AL,BL
AND CX,DX
AND CL,33H
AND DI,4FFFH
AND AX,[DI]



AL = AL AND BL
CX = CX AND DX
CL = CL AND 33H
DI = DI AND 4FFFH
นำ AX มา AND กับเวิร์ดข้อมูลที่อยู่ในเซกเมนต์หน่วยความจำข้อมูลที่ชี้ตำแหน่งโดย DI

ตัวอย่าง จงเขียนคำสั่งเคลียร์บิตเครื่องหมายในรีจิสเตอร์ AL
วิธีทำ ใช้คำสั่ง AND โดยนำข้อมูล 01111111b = 7FH ไป AND เขียนคำสั่งได้
ดังนี้
AND AL,7FH

ตัวอย่าง จงแสดงผลลัพธ์ต่อไปนี้
MOV BL,35H
AND BL,0FH
วิธีทำ
35H 0 0 1 1 0 1 0 1
0FH 0 0 0 0 1 1 1 1
05H 0 0 0 0 0 1 0 1
แฟลกต่าง ๆ เป็นดังนี้ SF = 0, ZF = 0, PF = 1, CF = OF = 0

ตัวอย่าง ถ้าหากค่าในรีจิสเตอร์ AL เก็บค่ารหัส ASCII ของเลข 7 เราสามารถใช้คำสั่ง
AND เปลี่ยนค่าในรีจิสเตอร์ AL ให้เป็นเลข 7 ฐานสิบได้ดังตัวอย่างคำสั่งต่อไปนี้
ค่าในรีจิสเตอร์ AL 0011 0111
ค่าในรีจิสเตอร์ BL 0000 1111
หลังจากทำคำสั่ง AND AL,BL ค่าในริจิสเตอร์ AL จะมีค่าเป็น 0000 0111 ซึ่งค่านี้จะมีค่าเท่ากับเลข 7 ในฐานสิบ

คำสั่ง AND จะมีผลต่อแฟลก เราสามารถนำคำสั่งนี้มาทำงานร่วมกับคำสั่งกระโดดได้ อย่างเช่นถ้าต้องการทดสอบว่าค่าในรีจิสเตอร์เป็นศูนย์หรือไม่สามารถเขียนได้ดังนี้
AND DH,DH
JZ XXXX
….
XXXX: .…
ถ้าหาก ZF เป็น 1 หมายความว่าผลลัพธ์เป็นศูนย์ จะกระโดดไปทำงานที่ XXXX

คำสั่ง OR
คำสั่งนี้จะคล้ายกับคำสั่ง AND ค่าของ destination จะเป็นค่าในรีจิสเตอร์หรือหน่วยความจำก็ได้ ค่าของ source อาจเป็นค่าในรีจิสเตอร์ หน่วยความจำ หรือการอ้างแอดเดรสแบบ immediate การทำงานของคำสั่งนี้จะมีผลต่อแฟลกเช่นเดียวกับคำสั่ง AND
ถ้าต้องการใช้คำสั่งนี้ตรวจสอบว่าค่าใน BL เป็นศูนย์หรือไม่อาจทำได้โดย OR BL,0 โดยทำการ OR ค่าในรีจิสเตอร์ BL กับค่า 0 ถ้าหากผลลัพธ์เป็น 0 แฟลก ZF จะเป็น 1
คำสั่ง OR สามารถใช้เซ็ตบิตที่ต้องการได้โดยนำลอจิก 1 ไปทำการ OR
(ผลลัพธ์ของคำสั่ง OR จะมีบิตที่เป็น 1 เมื่อบิตของข้อมูลตัวตั้งตัวใดตัวหนึ่งหรือทั้งสองตัวมีค่าเป็น 1 ดังตารางที่ 1) รูปแบบของคำสั่งเป็นดังนี้

OR destination,source

ตัวอย่าง จงเขียนโปรแกรมเซ็ตบิตเครื่องหมายและบิตต่ำสุดของรีจิสเตอร์ AL
วิธีทำ ใช้คำสั่ง OR โดยนำค่า 10000001b = 81H ไป OR ซึ่งเขียนคำสั่งได้ดังนี้
OR AL,81H

ตัวอย่าง จงหาผลลัพธ์จากการกระทำต่อไปนี้
MOV AX,0504 ;AX = 0504
OR AX,0DA68H ;AX = DF6C
วิธีทำ
0504H 0000 0101 0000 0100
DA68H 1101 1010 0110 1000
DF6C 1101 1111 0110 1100
ค่าแฟลกต่าง ๆ จะเป็นดังนี้ SF =1, ZF = 0, PF = 1, CF = OF = 0
ค่า parity จะเช็กเฉพาะ 8 บิตล่างเท่านั้น

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

XOR destination,source

ตัวอย่าง จงเปลี่ยนบิตเครื่องหมายของรีจิสเตอร์ DX
วิธีทำ ใช้คำสั่ง XOR โดยกระทำกับค่า 8000H ซึ่งเขียนคำสั่งได้ดังนี้
XOR DX,8000H

ตัวอย่าง จงหาผลลัพธ์จากการกระทำต่อไปนี้
MOV DH,54H
XOR DH,78H
วิธีทำ
54H 0 1 0 1 0 1 0 0
78H 0 1 1 1 1 0 0 0
2C 0 0 1 0 1 1 0 0
ค่าแฟลกต่าง ๆ จะเป็นดังต่อไปนี้ SF = 0, ZF = 0, PF = 0, CF = OF = 0

ตัวอย่าง คำสั่ง XOR สามารถใช้เคลียร์ค่าในรีจิสเตอร์ได้ อย่างเช่นถ้า AH = 45H เรา
สามารถเคลียร์ค่าในรีจิสเตอร์ได้โดยการทำคำสั่งต่อไปนี้
XOR AH,AH
วิธีทำ สิ่งที่เกิดขึ้นจะเป็นดังนี้
45H 01000101
45H 01000101
00 00000000
แฟลกต่าง ๆ จะเป็นดังนี้ SF = 0, ZF = 1, PF = 1,CF = OF = 0


คำสั่ง NOT
คำสั่ง NOT จะสลับบิตของโอเปอร์แรนด์จาก 0 เป็น 1 และ 1 เป็น 0 ดังตารางที่ 1
รูปแบบของคำสั่งเป็นดังนี้

NOT destination

ตัวอย่าง จงหาผลลัพธ์จากการกระทำต่อไปนี้
MOV AX,1234H
NOT AX ;AX = not(0001 0010 0011 0100)
;AX = (1110 1101 1100 1011)=0EDCBH

คำสั่ง TEST
คำสั่ง TEST จะทำงานเหมือนคำสั่ง AND ทุกประการ แต่ผลลัพธ์จากการ AND จะไม่เขียนค่าลงในโอเปอร์แรนด์ตัวแรก ผลจากการใช้คำสั่งนี้จะปรากฏในแฟลก เรานิยมใช้คำสั่งนี้ในการทดสอบว่าข้อมูลในบิตที่ต้องการมีค่าเป็น 1 หรือไม่ โดยเราจะพิจารณาจากแฟลกทด
คำสั่งนี้จะคล้ายกับคำสั่ง CMP แต่ต่างกันที่คำสั่ง TEST จะกระทำแบบบิตต่อบิตโดยทั่วไปแล้วคำสั่ง TEST จะตามด้วยคำสั่ง JZ (jump if zero) หรือ JNZ (jump if not zero) ในการใช้งานมักจะทกสอบทีละบิต โดยจะกระทำกับข้อมูลแบบ immediate

ตัวอย่าง
TEST AL,01
JNZ RIGHT
TEST AL,128
JNZ LEFT
นอกจากนี้คำสั่ง TEST ยังสามารถนำมาประยุกต์สร้างเป็นคำสั่งเลือกทำแบบหลาย ๆ ทางได้ อย่างเช่นในตัวอย่างต่อไปนี้จะทดสอบค่าในรีจิสเตอร์ AL ถ้าบิตที่ 0 เป็น 1 จะกระโดดไปที่ CASE_A ถ้าบิตที่ 1 เป็น 1 จะกระโดดไปที่ CASE_B
MOV AL,XXXX
TEST AL,0000 0001B
JNZ CASE_A
TEST AL,0000 0010B
JNZ CASE_B
…..
…..
CASE_A: …..
…..
CASE_B: …..

เราสามารถเปรียบเทียบการทำคำสั่ง TEST และคำสั่ง AND ได้ดังนี้
AH DL Z-flag
ก่อนทำคำสั่ง 01010011 10001100 ?
หลังจากทำคำสั่ง AND DL,AH
01010011 00000000 1
หลังจากทำคำสั่ง TEST DL,AH
01010011 10001100 1

จะเห็นว่าคำสั่งทั้งสองมีผลต่อแฟลก แต่คำสั่ง TEST จะไม่ทำให้ค่าผลลัพธ์ในรีจิสเตอร็เปลี่ยนแปลง



การประยุกต์ใช้งานคำสั่งทางตรรกศาสตร์
เราสามารถนำคำสั่งทางตรรกศาสตร์มาใช้ในการประมวลผลข้อมูลระดับบิตได้ จากตารางที่ 1 เราสามารถสร้างตารางที่ 2 ซึ่งแสดงผลของการใช้คำสั่งทางตรรกศาสตร์กับข้อมูลได้


B A and B A or B A xor B
0 0 A A
1 A 1 ~A

ตารางที่ 2 ผลของการใช้คำสั่งทางตรรกศาสตร์กับข้อมูล

จากตารางเราจะพบว่าถ้าเราต้องการให้บิตใดของข้อมูลมีค่าเป็น 1 โดยที่บิตอื่นมีค่าคงเดิม เราสามารถใช้คำสั่ง AND ได้ และถ้าเราต้องการจะทำให้บิตใดของข้อมูลมีค่าเป็น 0 โดยไม่มีผลกระทบกับแฟลกอื่น ๆ เราสามารถใช้คำสั่ง OR สำหรับคำสั่ง XOR เราจะใช้ในกรณีที่ต้องการกลับบิตของข้อมูลจาก 0 เป็น 1

ตัวอย่างการประยุกต์ใช้งานคำสั่งทางตรรกศาสตร์
โปรแกรมตัวอย่างต่อไปนี้จะเปลี่ยนบิตที่ 1 และ 2 ของ AL ให้มีค่าเป็น 0 (การนับบิตจะนับบิตที่มีนัยสำคัญต่ำสุดเป็นบิตที่ 0) และเปลี่ยนบิตที่ 4 และ 6 ให้มีค่าเท่ากับ 1 พร้อมทั้งกลับบิตที่ 3 ให้มีค่าตรงกันข้าม การทำงานคร่าว ๆ มีลักษณะดังรูปที่ 1

AL XXXX XXXX
AND 1111 1001
OR 0101 0000
XOR 0000 1000
RESULT X1X1 X00X
รูปที่ 1 ขั้นตอนการแปลงค่าของ AL

โปรมแกรมจะมีลักษณะดังนี้
AND AL,0F9H ;clear bit 1&2
OR AL,50H ;set bit 4&6
XOR AL,08H ;switch bit 3


คำสั่งเลื่อนข้อมูล
การเลื่อน Shifting ถือว่าเป็นประโยชน์อย่างยิ่งในการเขียนโปรแกรม อย่างเช่นถ้าจะตรวจสอบว่าข้อมูลที่มีอยู่เป็นเลขบวกหรือลบอาจใช้วิธีการเลื่อนค่าข้อมูลให้บิตเครื่องหมายออกมาอยู่ที่บิตแฟลกแล้วตรวจว่าเป็นลอจิก 1 หรือ 0 ก็สามารถทำให้บอกว่าข้อมูลที่มีอยู่เป็นเลขบวกหรือลบ คำสั่งเลื่อนข้อมูลจะมีโอเปอแรนด์สองตัว ตัวแรกจะเป็นข้อมูลที่จะเลื่อนเป็นจำนวนครั้งเท่าไร ถ้ามีการเลื่อนมากกว่าหนึ่งครั้งจะใช้รีจิสเตอร์ CL

การเลื่อนไปทางขวา
การเลื่อนแบบนี้จะใช้คำสั่ง SHR(Shift Right) โดยข้อมูลทุกบิตจะถูกเลื่อนไปทางขวาบิตที่ถูกเลื่อนออกไปจะถูกเก็บในบิตตัวทดและในการเลื่อนนั้นจะใส่ลอจิก 0 เข้าไป ดังรูป โดยรูปแบบของคำสั่งการเลื่อนบิตไปทางซ้าย SHL(Shift Left) จะมีลักษณะเหมือนคำสั่ง SHR เพียงแต่ย้ายข้อมูลไปทางซ้าย

ถ้าหากมีการทำคำสั่งต่อไปนี้

MOV BX,0FFFFH ;BX = FFFFH
SHR BX,1 ;เลื่อนรีจิสเตอร์ BX ไปทางขวาหนึ่งครั้ง

ผลลัพธ์ที่ได้จากการเลื่อนค่าของรีจิสเตอร์ BX จะเป็น 7FFFH และแฟลก CF เป็น 1 การทำงานของคำสั่ง SHR จะมีผลต่อแฟลก OF,SF,PF และ ZF ถ้าหากต้องการเลื่อนหลายครั้งจะต้องใส่รีจิสเตอร์ CX เก็บจำนวนครั้งที่เลื่อน อย่างเช่นต้องการเลื่อนข้อมูลใน BX จำนวน 3 ครั้ง ทำได้ดังต่อไปนี้

MOV CL,3
SHR BX,CL

ตัวอย่าง จงแสดงผลลัพธ์จากการทำคำสั่งต่อไปนี้
MOV AL,9AH
MOV CL,3
SHR AL,CL
วิธีทำ 9AH = 10011010
01001101 CF = 0 เลื่อนหนึ่งครั้ง
00100110 CF = 1 เลื่อนสองครั้ง
00010011 CF = 0 เลื่อนสามครั้ง
หลังจากทำคำสั่งแล้วจะได้ AL = 13H และ CF = 0

การเลื่อนไปทางขวาแบบคิดเครื่องหมาย
การเลื่อนแบบนี้จะใช้ในการคำนวณทางคณิตศาสตร์ โดยใช้คำสั่ง SAR(Shift Arithmetic Right) คำสั่งเลื่อนข้อมูลแบบนี้ บิตเครื่องหมายจะไม่มีการเปลี่ยนแปลง การทำงานของคำสั่งประเภทนี้แสดงได้ดังรูป และรูปของคำสั่งมีสองรูปแบบคือ

SAR destination,1
SAR destination,CL

รูปแสดงการทำงานของคำสั่ง SAR

การเลื่อนไปทางซ้ายแบบคิดเครื่องหมาย
คำสั่ง SAL(Shift Arithmetic Left) ไม่เก็บค่าของบิตที่มีเครื่องหมาย แต่จะใส่ค่า 1 ในแฟลก OF ถ้ามีการเปลี่ยนเครื่องหมาย ทุกครั้งที่ปฏิบัติการคำสั่ง SAL บิต 0 จะมีค่า 0
และรูปของคำสั่งมีสองรูปแบบคือ

SAL destination,1
SAL destination,CL

คำสั่งหมุนข้อมูล
คำสั่งหมุนข้อมูล(rotate) จะใช้หมุนบิตข้อมูลในรูปแบบไบต์หรือเวิร์ด โดยจะอ้างข้อมูลในรีจิสเตอร์หรือหน่วยความจำ โดยจะหมุนข้อมูลไปทางซ้ายและทางขวา

การหมุนทางซ้าย(rotate left)
จะเลื่อนบิตข้อมูลในรีจิสเตอร์ไปทางซ้าย หรือเลื่อนจากบิตต่ำไปบิตสูงเป็นวงกลม โดยข้อมูลจากบิตสูงสุดจะถูกเลื่อนไปยังบิตต่ำ และบิตแฟลก CF ดังแสดงในรูป
คำสั่งที่ใช้เลื่อนข้อมูลมีสองคำสั่งคือ

ROL destination,1
ROL destination,CL

คำสั่งแรกจะหมุนข้อมูลทุกบิตไปทางซ้ายหนึ่งบิต ส่วนคำสั่งที่สองจะกำหนดจำนวนครั้งที่จะหมุนข้อมูลในรีจิสเตอร์ CL



รูปการทำงานของคำสั่ง ROL

การหมุนทางขวา(rotate right)
จะเลื่อนบิตข้อมูลทุกบิตไปทางขวาเป็นวงกลม โดยค่าในบิตต่ำสุดจะถูกเลื่อนไปยังบิตสูงสุด และบิตแฟลก CF ดังแสดงในรูป คำสั่งที่ใช้มีอยู่สองคำสั่งคือ

ROR destination,1
ROR destination,CL

คำสั่งแรกจะหมุนข้อมูลทุกบิตไปทางขวาหนึ่งครั้ง ส่วนคำสั่งที่สองจะหมุนข้อมูลทุกบิตเป็นจำนวนครั้งตามข้อมูลที่อยู่ในรีจิสเตอร์ CL



รูปแสดงการทำงานของคำสั่ง ROR

ตัวอย่าง จงใช้คำสั่ง ROL นับจำนวนบิตข้อมูลที่มีค่าลอจิก 1 ในรีจิสเตอร์ BX โดยไม่มีการ
เปลี่ยนแปลงค่าใน BX คำตอบที่ได้เก็บในรีจิสเตอร์ AX
วิธีทำ
XOR AX,AX ;ใช้ AX เป็นตัวนับบิต โดยเคลียร์ให้มีค่าเป็น 0
MOV CX,16 ;ใส่จำนวนครั้งที่จะหมุนข้อมูล
TOP:
ROL BX,1 ;หมุนข้อมูล1 ครั้ง
JNC NEXT ;ถ้าค่าใน CF ไม่เป็น 1 จะกระโดดไปที่ NEXT
INC AX ;ถ้าเป็น 1 ให้เพิ่มค่า AX
NEXT:
LOOP TOP ;ทำซ้ำเพื่อตรวจสอบบิตต่อไป

คำสั่งหมุนข้อมูลแบบผ่านตัวทด
คำสั่งประเภทนี้จะนำค่าในตัวทดมาหมุนด้วย ซึ่งมีทั้งแบบการหมุนทางซ้ายแบบผ่านตัวทด(Rotate through Carry Left) โดยใช้คำสั่ง RCL และการหมุนทางขวาแบบผ่านตัวทด(Rotate through Carry Right) โดยใช้คำสั่ง RCR
การหมุนทางซ้ายแบบผ่านตัวทดจะเลื่อนข้อมูลทุกบิตไปทางซ้าย โดยบิตสูงสุดจะถูกเลื่อนไปในบิตแฟลก CF และค่าในบิต CF จะถูกเลื่อนไปบิตต่ำสุดดังรูป รูปแบบของคำสั่งเป็นดังนี้

RCL destination,1
RCL destination,

รูปการทำงานของคำสั่ง RCL

การหมุนทางขวาแบบผ่านตัวทดจะเลื่อนข้อมูลทุกบิตไปทางขวาโดยบิตต่ำสุดจะถูกเลื่อนเข้าไปในบิต CF และค่าในบิต CF จะถูกเลื่อนไปบิตสูงสุดแสดงดังรูป รูปแบบของคำสั่งเป็นดังนี้
RCR destination,1
RCR destination,CL


รูปการทำงานของคำสั่ง RCR

ตัวอย่าง ถ้าค่าในรีจิสเตอร์ DH มีค่าเป็น 8AH บิตแฟลก CF เป็น 1 และค่าใน CL เป็น 3
จงหาค่าในรีจิสเตอร์ DH และ CF หลังจากทำคำสั่ง RCR DH,CL
วิธีทำ การทำงานต่าง ๆ สรุปได้ดังตารางต่อไปนี้
การทำงาน
CF
DH
ค่าเริ่มต้น
หลังจากหมุนหนึ่งครั้ง
หลังจากหมุนสองครั้ง
หลังจากหมุนสามครั้ง

1
0
1
0
10001010
11000101
01100010
10110001
ดังนั้นหลังจากทำคำสั่ง ค่าในรีจิสเตอร์ DH เป็น B1H
แบบฝึกหัดท้ายบท

1) จงคำนวณเลขต่อไปนี้
1.1) 1001 1000 AND 1111 0000
1.2) 1110 0110 AND 1100 1100
1.3) 0110 1001 OR 1111 0000
1.4) 0101 0110 OR 0101 1100
1.5) 1001 1001 XOR 0000 1111
1.6) 1010 0110 XOR 0101 0110

2) จงคำนวณเลขต่อไปนี้
2.1) FBh AND ACh
2.2) CDh AND 75h
2.3) 8Eh OR 91h
2.4) 7Fh OR F4h
2.5) 2Ah XOR D6h
2.6) 9Bh XOR DBh

3) จงแสดงผลลัพธ์ต่อไปนี้
MOV AX,1234H
AND AX,2345H MOV AL,25H
AND AL,0FH
MOV BL,0AAH
AND BL,80H

4) จงแสดงผลลัพธ์ต่อไปนี้
MOV AX,1234H
OR AX,2345H
MOV AL,25H
OR AL,0FH
MOV BL,55H
OR BL,80H



5) จงแสดงผลลัพธ์ต่อไปนี้
MOV AX,1234H
XOR AX,2345H
MOV AL,25H
XOR AL,0FH
MOV BL,15H
XOR BL,35H


6) จงแสดงผลลัพธ์จากการทำคำสั่งต่อไปนี้
DATA1 DW 7777H
TIMES EQU 4
MOV CL,TIMES ;CL = 04
SHR DATA1,CL
หลังจากทำคำสั่งแล้ว DATA1 จะมีค่าเป็นเท่าไหร่

7) จงขียนโปรแกรมนับจำนวนบิตที่มีค่าเป็นหนึ่งใน AX โดยจะให้ผลลัพธ์ใน BL

8) การใช้งานคำสั่งหมุนบิตที่ผ่านแฟลกทด
8.1) จงขียนการเลื่อนบิตของข้อมูลขนาด 32 บิตที่อยู่ในรีจิสเตอร์ DX,AX ไปทางซ้าย 1บิต
8.2) จงเขียนการคูณข้อมูลขนาด 48 บิตที่เก็บในรีจิสเตอร์ BX,DX และ AX ต่อเนื่องกัน
ด้วย 4
8.3) ขงเขียนการหารข้อมูลใน DX,AX ด้วย 2

9) จงเขียนส่วนของโปรแกรมที่จะคูณค่าในรีจิสเตอร์ AX ด้วย 10 โดย ไม่ใช้คำสั่ง MUL แต่สามารถใช้คำสั่ง shift และ add ได้

10) จงเขียนโปรแกรมที่แสดงค่ารหัสแอสกีของปุ่มที่รับจากผู้ใช้เป็นเลขฐานสอง โปรแกรมย่อย ที่แสดงข้อมูลเป็นรหัสเลขฐานสองใช้การเลื่อนบิตในการประมวลผล






เฉลยแบบฝึกหัดท้ายบท

1)
1.1) 1001 0000
1.2) 1100 0100
1.3) 1111 1001
1.4) 0101 1110
1.5) 1001 0110
1.6) 1111 0000

2)
2.1) A8
2.2) 45
2.3) 9F
2.4) FF
2.5) FC
2.6) 40

3) วิธีทำ
MOV AX,1234H
AND AX,2345H ;AX = (0001 0010 0011 0100) and (0010 0011 0100 0101)
;AX = (0000 0010 0000 0100)=0204H MOV AL,25H
AND AL,0FH ;AL = 05H
MOV BL,0AAH
AND BL,80H ;BL = 80h

4) วิธีทำ
MOV AX,1234H
OR AX,2345H ;AX = (0001 0010 0011 0100) and
(0010 0011 0100 0101)
;AX = (0011 0011 0111 0101)=3375H
MOV AL,25H
OR AL,0FH ;AL = 2FH
MOV BL,55H
OR BL,80H ;BL = 0D5H
5) วิธีทำ
MOV AX,1234H
XOR AX,2345H ;AX = (0001 0010 0011 0100) and
(0010 0011 0100 0101)
;AX = (0011 0001 0111 0001)=3171H
MOV AL,25H
XOR AL,0FH ;AL = 2AH
MOV BL,15H
XOR BL,35H ;BL = 20H

6) DATA1 จะมีค่าเป็น 0777

7) MOV BL,0
MOV CX,16 ;16 bits
PROCBITS:
TEST AX,1 ;test for last bit
JZ DOPROCBIT ;if last bit = 0 jump
INC BL
DOPROCBIT:
SHR AX,1 ;next bit
LOOP PROCBITS

8)
8.1)
CLC
RCL AX,1
RCL DX,1
8.2)
CLC
RCL AX,1
RCL DX,1
RCL BX,1
CLC
RCL AX,1
RCL DX,1
RCL BX,1

8.3)
CLC
RCR DX,1
RCR AX,1

9)
MOV BX,AX ;save content of AX in BX
MOV CL,2
SHL AX,CL ;AX < ------- AX*4
ADD AX,BX ;AX <------- AX*5
SHL AX,1 ;AX <------- AX*10

10)
.MODEL SMALL
.DOSSEG
.CODE
; Display Binary (input:AL)
DISPBIN PROC NEAR
PUSH AX
PUSH CX
PUSH DX
MOV AX,8
PRINTLOOP:
TEST AL,80H ;test for 1
JZ PRINTZERO
MOV DL,’1’
JMP PRINTIT
PRINTZERO:
MOV DL,’0’
PRINTIT:
MOV AH,2
INT 21H

SHL AL,1
LOOP PRINTLOOP
POP DX
POP CX
POP AX
RET
DISPBIN ENDP
START:
MOV AH,1
INT 21H

CALL DISPBIN

MOV AX,4C00H
INT 21H
END START

ไม่มีความคิดเห็น:

แสดงความคิดเห็น