การทดลองที่ 2
คำสั่งทางคณิตศาสตร์และลอจิก
วัตถุประสงค์
1.เพื่อให้เข้าใจคำสั่งทางคณิตศาสตร์และลอจิก
2.เพื่อให้เข้าใจการทำงานของแฟลกที่มีผลต่อคำสั่งคณิตศาสตร์และลอจิก
3.เพื่อให้สามารถเขียนโปรแกรมโดยใช้คำสั่งคณิตสาสตร์และลอจิกได้
ทฤษฎีเบื้องต้น
คำสั่งทางคณิตสาสตร์และลอจิก เป็นคำสั่งที่ทำการนำข้อมูลที่เป็นตัวถูกกระทำ (OPERAND) สองตัวมากระทำกันทางคณิตศาสตร์ เช่น บวก ลบ หรือมากระทำทางลอจิก เช่น AND,OR โดยนำตัวถูกกระทำทำมาทำในหน่วยคำนวณและลอจิก แล้วเก็บผลลัพธ์ที่ไดไว้ใน ACCUMULATOR ข้อมูลหลักตัวหนึ่งที่จะนำมากระทำจะอยู่ใน ACCUMULATOR (รีจิสเตอร์A) ส่วนข้อมูลอีกตัวหนึ่งจะมาจากรีจิสเตอร์หรือหน่วยความจำก็ได้ดังรูป
การกระทำทางคณิตศาสตร์และลอจิกจะมีผลต่อแฟลกดังนี้
CARRY FLAG (C) จะเซทเมื่อมีการบวกเลขแล้วผลลัพธ์ที่ได้เกิน 8 บิท และในการลบเลขหากมีการยืม คือค่าของตัวตั้งน้อยกว่าค่าของตัวลบ จะทำให้ C ถูกเซทเช่นเดียวกัน
NEGATIVE FLAG (N) จะเซทเมื่อคำสั่งทางคณิตศาสตร์ เป็นการทำงานในลักษณะของการลบ
PARITY/OVER FLAG (P/V) ในกรณีของการทำงานทางลอจิกจะแสดงเป็น PARITY โดยแฟลกนี้จะเซทเมื่อผลลัพธ์ที่ได้มีจำนวนบิท “1” เป็นจำนวนคู่ ในกรณีของการทำงานทางคณิตสาสตร์ จะทำหน้าที่เป็น OVER FLOW โดยจะเซทเมื่อผลลัพธ์ของการกระทำทางคณิตศาสตร์มีค่าเกิน
HALF CARRY FLAG (H) เป็นแฟลกที่เป็นตัวทดลอง 4 บิทต่ำ โดนแฟลกนี้จะเซทเมื่อมีการทดหรือมีการยืมของค่า 4 บิทต่ำ แฟลกตัวนี้จะใช้ประโยชน์ในการปรับผลลัพธ์ที่เกิดจากการกระทำทางคณิตศาสตร์ของเลข BCD
ZERO FLAG จะเซทเมื่อผลลัพธ์ของการทำงานทางคณิตศาสตร์และลอจิกแล้วได้ผลลัพธ์มีค่าเป็น 0
SIGN FLAG ใช้ในการตรวจสอบบิทเครื่องหมายของผลลัพธ์คือบิทที่ 7 ของ แอคคิวมูเลเตอร์ ถ้าบิทที่ 7 มีค่าเป็น “0” แสดงว่าเป็นบวกและถ้าเป็น “1” แสดงว่าเป็นลบ แฟลกนี้จะเซทหลังจากคำสั่งทางคณิตสาสตร์
เราสามารถตรวจสอบผลของคำสั่งที่ทำให้แฟลกเปลี่ยนแปลงได้จากตารางคำสั่งของชุดของกลุ่มต่างๆ ผลของแฟลกต่างๆ เราสามารถนำไปใช้เป็นเงื่อนไขของคำสั่งการกระโดดต่อไป
คำสั่งต่างๆ ทางคณิตศ่าสตร์และลอจิก 8 บิท
ADD A,n เป็นคำสั่งที่ทำการบากข้อมูลในA กับข้อมูล n (n=ข้อมูลขนาด 8 บิท)แล้วนำข้อมูลที่ได้ไปเก็บในรีจิสเตอร์ A เช่น ADD A,5
ADD A,r เป็นการบวกข้อมูลใน A กับข้อมูลในรีจิสเตอร์ r (A,B,C,D,E,H,L)แล้วผลลัพธ์ที่ได้จากการบวกเก็บไว้ที่ A
ADD A,(HL) นำข้อมูลใน A บวกกับข้อมูลในหน่วยความจำตำแหน่งที่ชี้ด้วยข้อมูลของ HL แล้วนำผลลัพธ์ที่ได้เก็บใน A
ACD A,n นำข้อมูลใน A บวกกับข้อมูล n บวกกับข้อมูลใน CARRY แล้วนำผลลัพธ์ไปเก็บใน A (A-A+n+CY)
ADCA,(IY+0) นำข้อมูลลใน A บวกกับข้อมูลในหน่วยความจำตำแหน่งที่ชี้ด้วย (IY+0) บวกกับข้อมูลใน CARRY FLAG แล้วบันทึกผลลัพธ์ไปเก็บใน A (A<--A+(IY+0)+CY
SUB A,r นำข้อมูลใน A ลบด้วยข้อมูลในรีจิสเตอร์ r(A,B,C,D,E,H,L) แล้วนำผลลัพธ์เก็บใน A(A.A.R)
SBC A,(LH) นำข้อมูลในA ลบด้วยข้อมูลในหน่วยความจำตำแหน่งที่ชี้ด้วย (HL) ลบด้วยข้อมูลใน CARRY FLUAG แล้วนำผลลัพธ์ที่ได้เก็บใน A (A-A-(HL)—CY)
AND n นำข้อมูลใน A AND กับข้อมูล n (8บิท) แล้วนำผลลัพธ์ที่ได้เก็บใน A การ AND จะนำข้อมูลแต่ละบิทที่ตรงกันมา AND กับบิทต่อบิท (การ AND จะทำให้ CARRY FLAG=0)
OR r นำข้อมูลใน A OR กับข้อมูลในรีจิสเตอร์ r (A,B,C,D,E,H,L)แล้วนำผลลัพธ์เก็บใน A การ OR จะนำข้อมูลแต่ละบิทที่ต่างกันมา OR กัน บิทต่อบิท (การ OR จะทำให้
CARRY FLAG =0)
INC r เป็นการเพิ่มค่าของรีจิสเตอร์ r (A,B,C,D,E,H,L) ขึ้นไป 1 เช่น INC B จะทำให้ B = B+1
DEC (HL) เป็นการลดค่าของข้อมูลในหน่วยความจำที่มีตำแหน่งที่ชี้ด้วยค่า HL ลงไป 1
CP n เป็นการเปรียบเทียบค่าของ A กับค่า n (8 บิท) โดนค่าของA ยังคงเดิม แต่ผลของการเปรียบเทียบ จะมีผลต่อแฟลกต่างๆ เหมือนกับการนำ A ลบด้วยค่า n
การทดลอง
- แปลง OPCODE ของโปรแกรมต่อไปนี้
|
STEP |
ADDRESS |
OPCODE |
MNEMONIC |
ผลลัพธ์ |
|
1 |
8000 |
AF |
XOR A |
CY=0 |
|
|
8001 |
3E |
LD A,B7H |
A=B7 CY=0 Z=1 |
|
2 |
8002 |
B7 |
||
|
|
8003 |
C6 |
ADD A,60H |
A=06 CY= 96 Z=0 |
|
3 |
8004 |
60 |
||
|
4 |
8005 |
DF |
RST 08H |
|
- ป้อนโปรแกรมในข้อ1 ลงในชุดทดลองแล้วทำการทดลองแบบ SINGLE STEP แล้วตรวจสอบผลลัพธ์ของแต่ละ STEP ลงในช่องผลลัพธ์ทางขวามือ
- จาก STEP ที่ 2 ไป STEP ที่ 3 ค่าของ A เปลี่ยนจาก………..เป็น………….เนื่องจาก……...
CARRY เปลี่ยนแปลงหรือไม่เพราะอะไร
- แปลง OPCODE ของโปรแกรมต่อไปนี้แล้วป้อนโปรแกรมลงในชุดทดลอง
|
STEP |
ADDRESS |
OPCODE |
MNEMONIC |
ผลลัพธ์ |
|
1 |
8000 |
AF |
XOR A |
CY = 0 |
|
|
8001 |
3E |
LD A,66H |
A= 3E CY=60 Z=0 |
|
2 |
8002 |
66 |
||
|
|
8003 |
06 |
ADD A,96H |
A=06 CY= 96 Z=0 |
|
3 |
8004 |
96 |
||
|
|
8005 |
DF |
RST 08H |
|
- RUN โปรแกรมในข้อ 4 แบบ SINGLE STEP แล้วบันทึกผลลัพธ์ในแต่ละ STEP ลงในช่องขวามือ
- จากผลของการ RUN โปรแกรมในข้อ 5 จาก STEP ที่ 2 ไป STEP ที่ 3 ค่าของ A และแฟลก CY และ ZERO มีการเปลี่ยนแปลงอย่างไร เพราะอะไร
- แปลง OPCODE โปรแกรมต่อไปนี้แล้วป้อนลงในชุดทดลอง
|
STEP |
ADDRESS |
OPCODE |
MNEMONIC |
ผลลัพธ์ |
|
|
8000 |
3E |
LD A,27H |
A= 3E CY= 27 Z=1 |
|
1 |
8001 |
27 |
||
|
2 |
8002 |
DD |
AND A,A |
A= 0 CY=0 Z=0 |
|
3 |
8003 |
DD |
SUB A,A |
A= 0 CY= 0 Z=0 |
|
|
8004 |
06 |
SUB A,01 |
A= 06 CY= 01 Z=1 |
|
4 |
8005 |
01 |
||
|
|
8006 |
DF |
RST 09H |
|
- ทดลองโปรแกรมในข้อ 7 แบบ SINGLE STEP แล้วบันทึกผลของโปรแกรมแต่ละ STEP ลงในช่องว่างขวามือ แล้วสังเกตุผลของแฟลก สรุปผลของแฟลกที่เปลี่ยนแปลงว่ามาจากสาเหตุใด
2เขียน OPCODE ของโปรแกรมต่อไปนี้แล้วป้อนโปรแกรมลงในชุดทดลอง ซึ่งโปรแกรมนี้เป็นโปรแกรมการ บวกเลขขนาก 16 บิท 2 จำนวนที่อยู่ในหน่วยความจำตำแหน่ง 8100H,8101H กับ 8110H,8101H แล้วนำผลลัพธ์ไปเก็บในหน่วยความจำตำแหน่ง 8120H,8121H โดยหน่วยความจำตำแหน่งสูงเก็บข้อมูลหลักสูง (HIGH BYTE) โดยใช้คำสั่ง ATD ช่วยในการบวก
|
ADDRESS |
OPCODE |
MINEMONIC |
COMMENT |
|
8000 |
3E |
LD HL,8110H |
|
|
8001 |
10 |
||
|
8002 |
81 |
||
|
8003 |
06 |
LD A,(8100H) |
|
|
8004 |
00 |
||
|
8005 |
81 |
||
|
8006 |
DD |
ADD A,(HL) |
บวกAกับข้อมูลในตำแหน่ง 8110H |
|
8007 |
16 |
LD (8120H)A |
;ผลลัพธ์ในAลงในตำแหน่ง 8120H |
|
8008 |
20 |
||
|
8009 |
81 |
||
|
800A |
1E |
LD A,(8101H) |
; นำค่าในตำแหน่ง 8101 มาไว้ที่A |
|
800B |
01 |
||
|
800C |
81 |
||
|
800D |
FF |
INC HL |
|
|
800E |
DD |
ADD A,(HL) |
; บวก Aกับค่าในตำแหน่ง 8111H |
|
800F |
26 |
LD (8121H)A |
; เก็บผลลัพธ์ไว้ในตำแหน่ง 8121H |
|
8010 |
21 |
||
|
8011 |
81 |
||
|
8012 |
DF |
RST 08H |
|
- ทดลองโปรแกรมในข้อ 9 โดยกำหนดข้อมูลที่ต้องการบวกลงในตำแหน่ง 8100,8101 และ 8110,8111 ตามตารางและบันทึกผลลัพธ์ลงในตารางที่ 2-1
|
ครั้งที่ |
คำสั่ง |
ตัวบวก |
ผลลัพธ์ |
|||
|
(8101H) |
(8100H) |
(8111H) |
(8110H) |
(8121H) |
(8120H) |
|
|
1 |
37H |
11H |
32H |
45H |
26H |
16H |
|
2 |
01H |
F0H |
43H |
52H |
21H |
20H |
|
3 |
00H |
01H |
00H |
20H |
81H |
81H |
|
4 |
20H |
67H |
02H |
A8H |
43H |
20H |
|
5 |
11H |
FFH |
05H |
01H |
FFH |
FFH |
ตาราง 2-1
- ตรวจสอบผลลัพธ์ที่ได้จากโปรแกรมว่าถูกต้องหรือไม่
- เขียน OPCODE ของโปรแกรมต่อไปนี้
|
ADDRESS |
OPCODE |
MINEMONIC |
COMMENT |
|
8000 |
3E |
LD(8110H) |
;นำข้อมูล 2 หลักต่ำมาไว้ที่A |
|
8001 |
00 |
||
|
8002 |
81 |
||
|
8003 |
06 |
LD HL,8102H SUB A,(HL) |
;ลบข้อมูลหลักต่ำ |
|
8004 |
02 |
||
|
8005 |
81 |
||
|
8006 |
DD |
||
|
8007 |
16 |
LD (8100H)A |
;เก็บผลลัพธ์หลักต่ำ |
|
8008 |
00 |
||
|
8009 |
81 |
||
|
800A |
1E |
LD A,(8101H) |
; เก็บข้อมูลหลักสูง |
|
800B |
01 |
||
|
800C |
81 |
||
|
800D |
DD |
INC HL |
|
|
800E |
DF |
ADD A,(HL) |
; ลบข้อมูล 2 หลักสูง |
|
800F |
26 |
LD (8120H)A |
; เก็บผลลัพธ์ 2 หลักสูง |
|
8010 |
20 |
||
|
8011 |
81 |
||
|
8012 |
DF |
RST 08H |
|
- ทดลองดปรแกรมในข้อ 12 โดยกำหนดข้อมูลลงในตำแหน่ง 8100,8101 เป็นตัวตั้งและตัวลบอยู่ในตำแหน่ง 8102,8103 ตามตาราง แล้วตรวจสอบผลลัพธ์ของการลบที่ได้ในตำแหน่ง 8104 และ 8105 ลงในตารางที่ 2-2
|
ครั้งที่ |
คำสั่ง |
ตัวบวก |
ผลลัพธ์ |
|||
|
(8101H) |
(8100H) |
(8111H) |
(8110H) |
(8121H) |
(8120H) |
|
|
1 |
39H |
74H |
32H |
40H |
26H |
06H |
|
2 |
48H |
A2H |
01H |
F0H |
21H |
02H |
|
3 |
10H |
27H |
10H |
10H |
81H |
81H |
|
4 |
01H |
E0H |
00H |
FFH |
DFH |
DDF |
- ตรวจสอบผลลัพธ์ที่ได้ในตาราง 2-2 ว่าถูกต้องหรือไม่
- แปลง OPCODE ของโปรแกรมต่อไปนี้แล้วป้อนโปรแกรมเข้าในชุดทดลอง แล้ว RUN โปรแกรมแบบ SINGLE STEP และบันทึกผลของแต่ละ STEP ลงในช่องผลลัพธ์ทางขวามือ
|
STEP |
ADDRESS |
OPCODE |
MNEMONIC |
COMMENT |
|
1 |
8000 |
3E |
|
A=3E |
|
|
8001 |
73 |
LD A,01110011B |
P/V=73 |
|
2 |
8002 |
E6 |
|
A=E6 |
|
|
8003 |
55 |
AND 0101010101B |
P/V=55 |
|
3 |
8004 |
E6 |
|
A=E6 |
|
|
8005 |
F0 |
AND 11110000B |
P/V=F0 |
|
4 |
8006 |
E6 |
|
A=E6 |
|
|
8007 |
00 |
AND 008 |
P/V=00 |
|
5 |
8008 |
DF |
RST 08H |
|
- จากผลลัพธ์ในข้อ 15 สรุปการเปลี่ยนแปลงจากแฟลก PARITY ว่า P/V มีค่าเป็น “1” เมื่องใดเป็น “0” เมื่อใด
- เขียน OPCODE ของโปรแกรมต่อไปนี้แล้วทำการทดลองแบบ SINGLE STEP แล้วตรวจสอบผลลัพธ์ที่ได้แต่ละ STEP บันทึกลงในช่องว่าง
|
STEP |
ADDRESS |
OPCODE |
MNEMONIC |
COMMENT |
|
1 |
8000 |
3E |
LD A,02 |
A= 02 ZERO=0 |
|
8001 |