เขียนโปรแกรมได้

                                       การทดลองที่ 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

การทดลอง  

  1. แปลง 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. ป้อนโปรแกรมในข้อ1 ลงในชุดทดลองแล้วทำการทดลองแบบ SINGLE STEP แล้วตรวจสอบผลลัพธ์ของแต่ละ STEP ลงในช่องผลลัพธ์ทางขวามือ
  2. จาก STEP ที่ 2 ไป STEP ที่ 3 ค่าของ A เปลี่ยนจาก………..เป็น………….เนื่องจาก……...

CARRY เปลี่ยนแปลงหรือไม่เพราะอะไร

 

  1. แปลง 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

 

  1. RUN โปรแกรมในข้อ 4 แบบ SINGLE STEP แล้วบันทึกผลลัพธ์ในแต่ละ STEP ลงในช่องขวามือ
  2. จากผลของการ RUN โปรแกรมในข้อ 5 จาก STEP ที่ 2 ไป STEP ที่ 3  ค่าของ A และแฟลก CY  และ ZERO มีการเปลี่ยนแปลงอย่างไร เพราะอะไร
  3. แปลง 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

 

 

  1. ทดลองโปรแกรมในข้อ 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

 

 

 

  1. ทดลองโปรแกรมในข้อ 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

  1. ตรวจสอบผลลัพธ์ที่ได้จากโปรแกรมว่าถูกต้องหรือไม่

 

 

  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

 

 

  1. ทดลองดปรแกรมในข้อ 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

     

 

 

 

 

 

 

  1. ตรวจสอบผลลัพธ์ที่ได้ในตาราง 2-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

 

 

 

 

 

 

 

 

  1. จากผลลัพธ์ในข้อ 15 สรุปการเปลี่ยนแปลงจากแฟลก PARITY ว่า P/V มีค่าเป็น “1” เมื่องใดเป็น “0” เมื่อใด
  2. เขียน OPCODE ของโปรแกรมต่อไปนี้แล้วทำการทดลองแบบ SINGLE STEP แล้วตรวจสอบผลลัพธ์ที่ได้แต่ละ STEP บันทึกลงในช่องว่าง

STEP

ADDRESS

OPCODE

MNEMONIC

COMMENT

1

8000

3E

 

LD  A,02

 

A= 02 ZERO=0

8001