Introduction to Computer organization & Assembly Language

Download Report

Transcript Introduction to Computer organization & Assembly Language

แฟล็กและคำสั่งคณิตศำสตร์
ธนาวินท์ รักธรรมานนท์
[email protected]
หัวข้อการเรี ยน
แฟล็ก
 คาสัง่ คณิ ตศาสตร์

• คาสัง่ เกี่ยวกับการบวกและลบ
• คาสัง่ เกี่ยวกับการคูณและหาร
ผลของคาสัง่ คณิ ตศาสตร์ต่อการเปลี่ยนแปลงของแฟล็ก
 การคานวณสมการคณิ ตศาสตร์ อย่างง่าย

2
แฟล็กรี จิสเตอร์



แฟล็ก คือรี จิสเตอร์ที่ใช้เก็บสถานะของระบบ
แฟล็กของ 8086 มีขนาด 16 บิต โดยแต่ละบิตจะแทนสถานะต่างๆ ของระบบ
แฟล็กจะเปลี่ยนแปลงตามผลลัพธ์ของคาสัง่ ทางคณิ ตศาสตร์ การคัดลอกข้อมูลจะ
ไม่ทาให้แฟล็กเปลี่ยนแปลงค่า
15 14 13 12 11 10
-
-
-
9
8
7
6
5
- O D I T S Z -
4
3
2
1
0
- A P - C
Carry
Parity
Auxiliary
Zero
Sign
Trap
Interrupt
Direction
Overflow
3
แฟล็กรี จิสเตอร์









แฟล็กทด (Carry flag) จะมีค่า 1 หากมีการทดบิตหรื อขอยืมค่า
แฟล็กพาริ ตี้ (Parity flag) จะมีค่า 1 ถ้าผลลัพธ์ที่ได้จากคาสัง่ คานวณมีจานวนบิตที่เท่ากับ 1 เป็ นเลขคู่
แฟล็กช่ วย (Auxiliary flag) จะมีค่า 1 หาก 4 บิตขวามือของผลลัพธ์มีการทดหรื อขอยืมค่า
แฟล็กศูนย์ (Zero flag) จะมีค่า 1 หากผลลัพธ์การคานวณมีค่าเท่ากับศูนย์
แฟล็กเครื่ องหมาย (Sign flag) จะมีค่า 1 หากผลลัพธ์การคานวณเป็ นเลขลบ
แฟล็กกับดัก (Trap flag) หากมีค่าเป็ น 1 จะบังคับให้ไมโครโปรเซสเซอร์ปฏิบตั ิงานใน ภาวะ
คาสั่ งขัน้ เดียว (single step) ซึ่ งใช้ในการดีบกั โปรแกรม
แฟล็กอินเตอร์ รัพต์ (Interrupt Enable flag) หากมีค่าเป็ น 1 จะทาให้ซีพียรู ับการอินเตอร์ รัพต์แบบ
มาส์ก
แฟล็กทิ ศทาง (Direction flag) หากมีค่าเป็ น 1 จะบังคับให้คาสั่งถ่ายโอนข้อมูลเป็ นกลุ่มทางานจาก
แอดเดรสค่าน้อยไปหาค่ามาก หากมีค่าเป็ น 0 จะบังคับมีการถ่ายโอนจากแอดเดรสค่ามากไปหาค่าน้อย
แฟล็กค่ าล้ นหลัก (Overflow flag) ใช้สาหรับเลขแบบคิดเครื่ องหมาย หากมีค่าเป็ น 1 หมายถึงผลลัพธ์
ของการคานวณเป็ นเลขที่มีค่ามากหรื อน้อยกว่าขอบเขตที่กาหนด
4
แฟล็กศูนย์ (Zero-flag)


จะมีค่าเป็ น 1 เมื่อผลลัพธ์มีค่าเท่ากับศูนย์
นอกจากกรณี น้ ีจะมีค่าเป็ น 0
MOV
ADD
ADD
SUB
SUB
AL,10h
AL,E0h
AL,20h
AL,10h
AL,10h
Z=?
Z=1
Z=0
Z=0
Z=1
AL=0
AL=20h
AL=10h
AL=0
5
พาริตแี้ ฟล็ก (Parity-flag)

จะมีค่าเป็ น 1 เมื่อผลลัพธ์มีจานวนบิตที่มีค่าเป็ นหนึ่งเป็ นเลขคู่
MOV
ADD
ADD
SUB
SUB
AL,14h
AL,20h
AL,10h
AL,8h
AL,10h
P=?
P=0
P=1
P=1
P=0
AL=34h
AL=44h
AL=3Ch
AL=2Ch
6
แฟล็กทด (Carry-flag)


จะมีค่าเป็ น 1 เมื่อมีการทดหรือการยืมในการคานวณ
พิจารณาตัวเลขแบบไม่ คดิ เครื่องหมาย
MOV
ADD
ADD
SUB
ADD
AL,77h
AL,50h
AL,50h
AL,A0h
AL,27h
C=?
C=0
C=1
C=1
C=0
AL=C7h
AL=17h
AL=77h
AL=9Eh
7
แฟล็กเครื่องหมาย (Sign-flag)


จะมีค่าเป็ น 1 เมื่อผลลัพธ์ มีค่าลบ
พิจารณาตัวเลขแบบคิดเครื่ องหมาย
MOV
ADD
ADD
SUB
ADD
AL,77h
AL,50h
AL,50h
AL,A0h
AL,27h
S=?
S=1
S=0
S=0
S=1
AL=C7h
AL=17h
AL=77h
AL=9Eh
8
โอเวอร์ โฟล์ แฟล็ก (Overflow-flag)



จะมีค่าเป็ น 1 เมื่อผลลัพธ์มีความผิดพลาดเนื่องจากเลขล้ นหลัก
พิจารณาตัวเลขแบบคิดเครื่ องหมาย
การล้นหลักจะเกิดขึ้นเฉพาะจานวนบวกรวมกันหรื อจานวนลบ
รวมกันเท่านั้น จะไม่เกิดการล้นหลักสาหรับจานวนบวกรวมกับ
จานวนลบ
MOV
ADD
ADD
SUB
ADD
AL,77h
AL,50h
AL,50h
AL,A0h
AL,27h
O=?
O=1
O=0
O=0
O=1
AL=C7h
AL=17h
AL=77h
AL=9Eh
9
แฟล็กอื่น ๆ




แฟล็กเสริม (Auxiliary-flag)
•
จะมีค่าเป็ น 1 เมื่อผลลัพธ์ตอ้ งมีการปรับค่าของการเก็บตัวเลขแบบ BCD
แฟล็กทิศทาง (Direction-flag)
•
ใช้สาหรับกาหนดทิศทางของการปรับค่าในคาสั่งเกี่ยวกับสายข้อมูล.
แทรปแฟล็ก (Trap-flag)
•
ใช้สาหรับการตรวจสอบการทางานของโปรแกรม โดยจะทาให้เกิดการขัดจังหวะทุกครั้งหลัง
การทางานของคาสั่งต่างๆ
อินเตอร์ รัพท์ แฟล็ก (Interrupt-flag)
•
ใช้สาหรับกาหนดว่าหน่วยประมวลผลจะตอบสนองการขัดจังหวะจากฮาร์ดแวร์บางประเภท
หรื อไม่
10
คาสัง่ สาหรับกาหนดค่าของแฟล็ก



แฟล็กบางแฟล็กสามารถกาหนดค่าได้ เนื่องจากมีหน้าที่ในการระบุ
สถานะบางประการ
เราจะเรี ยกแฟล็กที่มีค่าเป็ น 1 ว่าแฟล็กนั้นเซ็ต (flag set) และเรี ยก
แฟล็กที่มีค่าเป็ น 0 ว่า แฟล็กนั้นเคลียร์ (flag cleared)
แฟล็กที่สามารถกาหนดค่าได้ และคาสัง่ ในการกาหนดค่า
Flag
Clear
Set
Carry-flag
Direction-flag
Interrupt-flag
CLC
CLD
CLI
STC
STD
STI
11
คาสัง่ คณิ ตศาสตร์








คาสัง่ เพิ่มและลดค่า :
คาสัง่ บวก :
คาสัง่ ลบ :
คาสัง่ เปรี ยบเทียบ :
คาสัง่ กลับเครื่ องหมาย :
คาสัง่ คูณ :
คาสัง่ หาร :
คาสัง่ ปรับขนาดข้อมูล :
INC และ DEC
ADD และ ADC
SUB และ SBB
CMP
NEG
MUL และ IMUL
DIV และ IDIV
CBW และ CWD
12
คาสัง่ เพิม่ ค่า INC และคาสัง่ ลดค่า DEC
INC
INC


register
memory
DEC
DEC
register
memory
การเพิ่มและลดค่าในหน่วยความจาจะต้องระบุขนาดของข้อมูลด้วย
มีผลกระทบกับแฟล็กทางคณิ ตศาสตร์ท้ งั หมด ยกเว้ น แฟล็กทด
MOV
DEC
DEC
MOV
MOV
INC
AL,1
AL
AL
BX,200h
[BX],AL
BYTE PTR [BX]
ไม่เปลี่ยน C-flag
AL=0h
AL=FFh
[200h]=FFh
[200h]=00h
13
คาสัง่ การบวก ADD และ ADC (add with carry)
ADD
ADD
ADD
ADD
ADD



regs,regs
regs,mem
mem,regs
regs,imm
mem,imm
ADC
ADC
ADC
ADC
ADC
regs,regs
regs,mem
mem,regs
regs,imm
mem,imm
ผลลัพธ์ของการบวกจะเก็บไว้ในโอเปอร์ แลนด์ตวั หน้าเสมอ
คาสัง่ ADD และ ADC มีผลกระทบถึงแฟล็กทางคณิ ตศาสตร์ทุกตัว
เรานิยมใช้คาสัง่ ADC ในการบวกเลขที่ตอ้ งการรวมตัวทดจากการคานวณที่ผา่ น
มา ยกตัวอย่างเช่น การบวกเลขที่อยูใ่ นรี จิสเตอร์ หลายตัวต่อเนื่องกัน
14
คาสัง่ การลบ SUB และ SBB (sub with borrow)
SUB
SUB
SUB
SUB
SUB



regs,regs
regs,mem
mem,regs
regs,imm
mem,imm
SBB
SBB
SBB
SBB
SBB
regs,regs
regs,mem
mem,regs
regs,imm
mem,imm
คาสัง่ SUB จะลบค่าในโอเปอร์แรนด์ตวั หลังออกจากตัวหน้า และ
นาไปเก็บในโอเปอร์แรนด์ตวั หน้า
คาสัง่ SBB ก็จะทาเช่นเดียวกัน แต่จะมีการรวมตัวยืมซึ่ งเก็บอยูใ่ น
Carry-flag ด้วย (คล้าย ADC)
คาสัง่ SUB และ SBB มีผลกระทบถึงแฟล็กทางคณิ ตศาสตร์ทุกตัว
15
ตัวอย่างการใช้คาสัง่ บวกและลบ
การบวกเลข 32 บิต 34DA 1115h เข้ากับตัวเลข 32 บิตที่เก็บใน
คู่รีจิสเตอร์ CX,BX
MOV
MOV
ADD
ADC
AX,1115h
DX,34DAh
AX,BX
DX,CX
นา 34DA 115h เก็บใน DX,AX
บวก 16 บิตล่าง
บวก 16 บิตบนพร้อมตัวทด
การลบเลข 16 บิต ในรี จิสเตอร์ AX ด้วยเลข 8 บิตในรี จิสเตอร์ BL
SUB
SBB
AL,BL
AH,0
ลบ 8 บิตล่าง
ลบ 8 บิตบนพร้อมตัวยืม
16
คาสัง่ เปรี ยบเทียบ CMP



คาสัง่ CMP จะทางานเหมือนคาสัง่ SUB แต่จะไม่มีการเปลี่ยนแปลง
ค่าในโอเปอร์แรนด์ท้ งั สอง แต่จะมีการเปลี่ยนแปลงค่าใน Flag
การเปลี่ยนแปลง flag ของคาสัง่ CMP จะเหมือนกับคาสัง่ SUB
โดยปกติเราจะใช้คาสัง่ CMP ในการเปรี ยบเทียบ และตัดสิ นใจ
MOV
CMP
AX,10h
AX,100h
MOV
CMP
BL,10h
AL,BL
Z-flag = 0, C-flag = 1,
O-flag = 0, S-flag = 1.
Z-flag = 1, C-flag = 0,
O-flag = 0, S-flag = 0.
17
คาสัง่ กลับเครื่ องหมาย NEG
NEG



regs
NEG mem
คาสัง่ NEG จะกลับค่าของโอเปอร์แรนด์ให้เป็ นค่าลบ
การแปลงเป็ นค่าลบใช้วธิ ี แบบ 2’s complement
คาสัง่ NEG จะมีผลกระทบกับแฟล็กทางคณิ ตศาสตร์ ท้ งั หมด แต่
สาหรับ แฟล็กทดจะมีค่าเป็ นหนึ่งเสมอหลังการทางานของคาสัง่ นี้
18
ตัวอย่างการเปลี่ยนค่าแฟล็ก
Instruction
MOV AL,70h
ADD AL,20h
ADD AL,70h
DEC AL
ADD AL,5
ADD AL,30h
SUB AL,40h
SUB AL,7F
NEG AL
ADC AL,20h
Z-Flag C-Flag P-Flag S-Flag O-Flag
Result
AL=70h
?
?
?
?
?
AL=90h
0
0
1
1
1
AL=00h
1
1
1
0
0
AL=FFh
1
0
1*
1
0
AL=04h
0
1
0
0
0
AL=34h
0
0
0
0
0
1
AL=F4h
0
1
0
0
0
AL=75h
0
0
0
1
AL=8Bh
0
1**
1
1
0
AL=ABh
0
0
0
1
0
19
คาสัง่ คูณ MUL และ IMUL
MUL
MUL






regs
mem
IMUL regs
IMUL mem
ในการใช้คาสัง่ คูณ เราจะระบุเฉพาะตัวคูณเท่านั้น สาหรับตัวตั้งและผลลัพธ์จะ
อยูใ่ นรี จิสเตอร์ที่กาหนดไว้แล้ว โดยจะขึ้นกับขนาดของการคูณ
การคูณ 8 บิต
ตัวตั้ง : AL ผลลัพธ์ : AX
การคูณ 16 บิต
ตัวตั้ง : AX ผลลัพธ์ : DX,AX
คาสัง่ MUL จะคูณแบบไม่คิดเครื่ องหมาย
คาสัง่ IMUL จะคูณแบบคิดเครื่องหมาย
คาสัง่ ทั้งสองจะมีผลกระทบกับ แฟล็กทดและโอเวอร์โฟล์แฟล็กเท่านั้น
20
ตัวอย่างการใช้คาสัง่ คูณ

การคูณค่า 12h ด้วย ค่าใน BL
MOV
MUL

AL,12h
BL
ตั้งค่าให้กบั ตัวตั้ง
คูณด้วย BL ผลลัพธ์อยูใ่ น AX
การคูณค่าในหน่วยความจาขนาด 16 บิตที่offset 200h ด้วย ค่าใน AX
จากนั้นนาผลลัพธ์ที่ได้มาบวกด้วยค่าใน BX
MUL
ADD
ADC
WORD PTR[200h]
AX,BX
DX,0
คูณ AX กับค่าใน [200h]
จากนั้นนา BX มารวมกับผลลัพธ์
21
คาสัง่ คูณ DIV และ IDIV
DIV
DIV






regs
mem
IDIV regs
IDIV mem
เช่นเดียวกับการใช้คาสัง่ คูณ เราจะระบุเฉพาะตัวหารเท่านั้น ตัวตั้งและผลลัพธ์
จะอยูใ่ นรี จิสเตอร์ที่กาหนดไว้แล้ว โดยจะขึ้นกับขนาดของการหาร
การหาร 8 บิต
ตัวตั้ง : AX ผลลัพธ์ : AL เศษ : AH
การหาร 16 บิต
ตัวตั้ง : DX, AX ผลลัพธ์ : AX เศษ : DX
คาสัง่ DIV จะหารแบบไม่คิดเครื่ องหมาย
คาสัง่ IDIV จะหารแบบคิดเครื่องหมาย
คาสัง่ ทั้งสองจะไม่ มผี ลกระทบกับแฟล็กทางคณิตศาสตร์ .
22
คาสัง่ ปรับขนาดข้อมูล




ข้อมูลแบบไม่คิดเครื่ องหมาย เราสามารถที่จะกาหนดค่า 0 ให้กบั ข้อมูล
นัยสาคัญสู งที่ขยายเพิ่มขึ้นมาได้ เพื่อให้ขนาดใหญ่ข้ ึนและมีค่าคงเดิม
แต่ถา้ ข้อมูลเป็ นตัวเลขคิดเครื่ องหมายเราจะต้องใช้การปรับค่าแบบอื่น มิ
เช่นนั้นค่าอาจผิดเพี้ยนไปได้
คาสั่ง CBW จะขยายขนาดข้อมูลแบบคิดเครื่ องหมายใน AL ให้มีขนาด 16
บิตใน AX
คาสั่ง CWD จะขยายขนาดข้อมูลแบบคิดเครื่ องหมายใน AX ให้มีขนาด 32
บิตใน DX,AX
ตัวอย่ำง
ขยาย AL -> AX.
CBW
IDIV BL หารด้วย BL ผลลัพธ์อยูใ่ น AL
การหารค่าใน AL ด้วย BL
23
ตัวอย่างการแก้สมการทางคณิ ตศาสตร์
1. คานวณค่า AL2 + BL2 คิดตัวเลขแบบไม่คิดเครื่ องหมายโดยให้
ผลลัพธ์เป็ นเลข 16 บิต เก็บที่ รี จิสเตอร์ AX
MUL
MOV
MOV
MUL
ADD
AL
CX, AX
AL, BL
BL
AX, CX
หาค่า AL*AL
นาไปเก็บไว้ที่ CX เนื่องจาก AL ต้องใช้ในการคานวณ
คูณ BL กับ BL แล้วเก็บผลลัพธ์ไว้ที่ AX
ได้ผลลัพธ์แล้วนาค่า AL*AL ที่เก็บใน CX มาบวก
2. คานวณค่า (CL*BL+DX)/SI โดยคิดเป็ นเลขคิดเครื่ องหมาย
24
ตัวอย่างการแก้สมการทางคณิ ตศาสตร์
2. คานวณค่า (CL*BL+DX)/SI โดยคิดเป็ นเลขคิดเครื่ องหมาย
MOV
MUL
ADD
CWD
IDIV
AL,CL
BL
AX,DX
SI
หาค่า CL*BL
บวกกับ DX.
ขยายขนาดเป็ น 32 บิต
หารด้วย SI ผลอยูท่ ี่ AX เศษที่ DX
25
Question ?
26