Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
1
1. บทนํา การศึกษาเกี่ยวกับระบบคอมพิวเตอรอาจแบงออกเปนระดับช้ันไดตามรูปที่ 1.0
ระดับ เกี่ยวของกับ มุมมอง 1 Packages, jobs, caned routines A back box that
solves problems
2 Programs, statements,loops, A collection of
conditions problem-solving
primitives in a high-
level language
3 Memory, processors, I/O devices, A collection of major
registers hareware subsystems
Computer science
4 Gates, circuits, chips, boards A collection of discrete
Electrical engineering electrical components
5 Electrons, atoms, magnetism A physical system
Physics composed of
elemental particles
รูปที่ 1.0 ระดับช้ันของการศึกษาเกี่ยวกับระบบคอมพิวเตอร
(ที่มา: G. Michael Scheider, “The Principles of Computer Organization”)
วิชานี้เราจะศึกษาในระดับที่ 3 และ 2 เพื่อเขียนโปรแกรมภาษาแอสเซมบลีซึ่งเปน low-level language
Operating
systems
level
Programming
language
level
Functional
operation
level
Hardware
design
level
The laws
of physics
level
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
2
1.1 องคประกอบพื้นฐานของคอมพิวเตอร องคประกอบพื้นฐานของคอมพิวเตอรตามรูปแบบของ Von Neumann ประกอบดวย 3 สวนหลัก
คือ หนวยรับเขา/สงออก (input/output unit), หนวยประมวลผลกลาง (Central Processor Unit) หรือ ซีพียู (CPU)
และหนวยความจํา (memory unit) ดังแสดงในรูปที่ 1.1
รูปที่ 1.1 องคประกอบพื้นฐานของคอมพิวเตอร
หนวยประมวลผลกลาง ประกอบดวย หนวยคํานวณและตรรกะ (arithmetic and logic unit) ทําหนาที่
คํานวณทางคณิตศาสตรและทดสอบทางตรรกะ กับหนวยควบคุม (control unit) ทําหนาที่ควบคุณสวนอื่น ๆ หนวย
ประมวลผลกลางมีสวนประกอบที่สําคัญซึ่งใชประมวลผล คือ เรจิสเตอร (registers) ใชเพื่อเก็บขอมูลตาง ๆ แบง
ออกเปน 2 ประเภท คือ
- เรจิสเตอรอเนกประสงค (general purpose registers) ผูเขียนโปรแกรมสามารถอางถึงเรจิสเตอร
อเนกประสงค เพื่ออานหรือเขียนขอมูลได - เรจิสเตอรเฉพาะกิจ (special purpose registers) เปนเรจิสเตอรที่นํามาใชทํางานเฉพาะกิจ เชน PC
(Program Counter) ทําหนาที่เก็บตําแหนงของคําสั่งถัดไปที่จะนํามาประมวลผล, IR (Instruction
Register) บรรจุคําสั่งปจจุบันที่จะประมวลผล, MAR (Memory Address Register) เก็บตําแหนงของ
หนวยความจําที่จะไปอานหรือเขียนขอมูลในหนวยความจํา, MBR (Memory Buffer Register) เก็บ
ขอมูลที่อานไดจากหนวยความจํา หรือเก็บขอมูลที่จะเขียนไปยังหนวยความจํา, PSW (Program
Status Word Register) เก็บสถานะตาง ๆ ในขณะที่ประมวลผล เปนตน
Control Unit
Arithmetic/logic Unit
CPU
Memory Input device
Output device
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
3
หนวยรับเขา/สงออก เปนอุปกรณที่รับขอมูลเขา เชน แปนพิมพ, ไมโครโฟน, เมาส เปนตน หรือเปนอุปกรณ
ที่นําขอมูลออก เชน เครื่องพิมพ, จอภาพ, ลําโพง เปนตน อุปกรณบางอยางสามารถรับขอมูลเขาและนําขอมูลออกได
เชน เทปแมเหล็ก, จานแมเหล็กทั้งแบบออน (floppy disk) และแบบแข็ง (hard disk) เปนตน
หนวยความจํา ทําหนาที่เก็บคําสั่งและขอมูลที่ซีพียูจะนําไปประมวล เรียกวา หนวยความจําหลัก (main
memory หรือ primary memory) ซึ่งอาจจะเปน RAM (Random Access Memory) ที่สามารถอานหรือเขียนขอมูล
ได หรือมีบางสวนเปน ROM (Read Only Memory) ที่สามารถอานไดอยางเดียว
• บัส ในการทํางานของระบบคอมพิวเตอร จําเปนตองมีการสงสัญญาณไฟฟาที่เปนขอมูลระหวางหนวยตาง ๆ ผานทางเสนสัญญาณ ที่เรียกวา บัส (bus) ซึ่งมี 3 ประเภท คือ
- address bus ทําหนาที่รับสงตําแหนงสําหรับอางอิงขอมูลในหนวยความจําหรืออุปกรณ I/O
- data bus ทําหนาที่รับสงขอมูล
- control bus ทําหนาที่รับสงสัญญาณควบคุม
รูปที่ 1.2 ระบบบัส
• ขั้นตอนการประมวลผลดวยซีพีย ู การประมวลผลดวยซีพียู มีขั้นตอน ดังนี้
repeat {
fetch คําสั่งมาจากหนวยความจําหลัก; (fetch phase)
execute ตามคําสั่งนั้น; (execution phase) } until halt or fatal error;
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
4
(ที่มา: G. Michael Scheider, “The Principles of Computer Organization”)
ภาพขางบน สมมุติวา คําส่ังเปน one address instruction และ แตละคําส่ังยาว 1 (บวก PC ดวย 1) จริง ๆ
แลวคําส่ังมีหลายรูปแบบ และความยาวอาจไมเทากัน (ตองบวก PC ดวยความยาวของคําส่ัง)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
5
Fetch Phase
ทําดังนี้ 1. MAR <- PC { Move the PC to the MAR. }
2. READ { Fetch the instruction.}
3. IR <- MBR { Move into the IR.}
4. PC <- PC + length of instruction { Increment PC with length of instruction.}
Execution Phase
ทําตามคําสั่งใน IR เชน
ก. คําสั่ง mov R0,10 ทําดังนี้ R0 <- 10 { Move 10 to R0. }
ข. คําสั่ง mov R0,X ทําดังนี้ 1. MAR <- IRaddress of X { Move address of X in IR to MAR. }
2. READ { Fetch data at address X. }
3. R0 <- MBR { Move data to R0.}
ค. คําสั่ง add R0,X ทําดังนี้ 1. MAR <- IRaddress of X { Move address of X in IR to MAR. }
2. READ { Fetch data at address X. }
3. adder <- MBR { Move first operand to adder. }
4. adder <- R0 { Move second operand to adder. }
5. ADD { Add two operands. }
6. R0 <- adder { Move result to R0. }
ง. คําสั่ง jmp L0 ทําดังนี้ PC <- IRaddress of L0
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
6
1.2 ระบบเลขจํานวน
คอมพิวเตอรแทนขอมูลในรูประบบตัวเลขฐานสอง (binary number system) ซึ่งประกอบดวย 0 กับ 1
ตัวเลขหนึ่งตัวเรียกวา หน่ึงบิต (bit ยอมาจาก Binary digiT) ระบบอื่น ๆ ไดแก ระบบตัวเลขฐานสิบ (decimal
number system) ซึ่งประกอบดวย 0 ถึง 9 ระบบตัวเลขฐานแปด (octal number system) ซึ่งประกอบดวย 0 ถึง 7
ระบบตัวเลขฐานสิบหก (hexadecimal number system) ซึ่งประกอบดวย 0 ถึง 9 และ A ถึง F
การเปลี่ยนตัวเลขจากระบบหนึ่งไปยังอีกระบบหนึ่ง หรือเรียกวา การเปลี่ยนฐาน ทําได ดังนี้
• การเปลี่ยนจากเลขฐานสองใหเปนเลขฐานสิบ ใชสูตร
(bnb n-1 … b2b1b0.b-1b-2 …b-m)2=(bn2n+b n-1 2
n-1 + … + b222 + b12
1+b0 + b-12-1 +b-2 2
-2 + … + b-m2-m)10
เชน (101101.1011)2 = (25 + 0 + 1*23 +22 + 0 + 1 + 2-1 + 0 + 2-3 + 2-4)10 = (45.6875)10
หมายเหตุ การเปลี่ยนจากเลขฐานแปดหรือสิบหกใหเปนเลขฐานสิบ ใชสูตรเหมือนกัน แตเปลี่ยนจาก 2 เปน 8 และ
16 ตามลําดับ โดยแทน A, B, C, D, E, F ดวย 10, 11, 12, 13, 14, 15 ตามลําดับ
• การเปลี่ยนตัวเลขหนาจุด จากเลขฐานสิบใหเปนเลขฐานสอง ใหใช 2 หาร ไปเรื่อย จนไดผลลัพธเปน 0 ขณะที่หาร
ใหจดจําเศษที่ได นําเศษที่ไดจากการหารมาเรียงตามลําดับ เริ่มจากเศษที่ไดครั้งสุดทายเรียงไปยังเศษที่ไดจากการหารครั้งแรก
เชน 2 ) 123
61 เศษ 1
30 เศษ 1
15 เศษ 0
7 เศษ 1
3 เศษ 1
1 เศษ 1
0 เศษ 1
(123)10 = (1111011)2
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
7
หมายเหตุ การเปลี่ยนตัวเลขหนาจุด จากเลขฐานสิบใหเปนเลขฐานแปดหรือสิบหก ใชสูตรเหมือนกัน แตเปลี่ยนจากการหารดวย 2 เปนการหารดวย 8 และ 16 ตามลําดับ โดยแทนเศษ 10, 11, 12, 13, 14, 15 ดวย A, B, C, D, E, F
ตามลําดับ
• การเปลี่ยนตัวเลขหลังจุด จากเลขฐานสิบใหเปนเลขฐานสอง ใหคูณตัวเลขที่อยูหลังจุดทั้งหมดดวย 2 ไปเรื่อย ๆ
จนกวาจะไดผลลัพธเปนศูนย หรือไดจํานวนตัวเลขหลังจุดทศนิยมตามที่ตองการ แลวนําเลขหนาจุดที่ไดจากการคูณแตละครั้ง มาเรียงกัน
เชน (0.6875)10 = (0. 1 0 1 1)2
.6875
* 2
1.3750
.3750
* 2
0.7500
.7500
* 2
1.5000
.5000
* 2
1.0000
.0000
หมายเหตุ การเปลี่ยนตัวเลขหลังจุด จากเลขฐานสิบใหเปนเลขฐานแปดหรือสิบหก ใชสูตรเหมือนกัน แตเปลี่ยนจากการคูณดวย 2 เปนการคูณดวย 8 และ 16 ตามลําดับ โดยแทนตัวเลขที่อยูหนาจุดซึ่งเปน 10, 11, 12, 13, 14, 15 ดวย
A, B, C, D, E, F ตามลําดับ
• เลขฐานสิบหก เพื่อใหมนุษยเขาใจไดงาย และใชจํานวนตัวเลขที่แทนขอมูลนอยลง จึงใชตัวเลขฐานสิบหกแทน โดยที่ตัวเลขฐานสอง 4 ตัว สามารถเขียนแทนดวยตัวเลขฐานสิบหกหนึ่งตัว ดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
8
ฐานสอง ฐานสิบหก 0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F
เชน 0000 0011 1100 0011 ฐานสอง
เทากับ 0 3 C 3 ฐานสิบหก
เคล็ดลับ (TIPS)
เลขฐาน สอง, แปด, และ สิบหก สามารถแปลงไปมาได โดยพิจารณา เลขฐานสอง 3 ตัวแทนเลขฐานแปด หนึ่งตัว
และเลขฐานสอง 4 ตัวแทนเลขฐานสิบหกหนึ่งตัว เชน
(5AF.1E)16 = ( 0101 1010 1111 . 0001 1110 )2 = 010 110 101 111 . 000 111 100 = (2657.074 )8 เปนตน
1.3 การแทนขอมูลแบบตาง ๆ ในเครื่องคอมพิวเตอร 1.3.1 อักขระ
ใชรหัสแทนอักขระ
- แบบ ASCII ใช 7 บิต แทนรหัส และ parity 1 บิตใชตรวจสอบ
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
9
ASCII Code 7 0 0 0 0 1 1 1 1
Bit 6 0 0 1 1 0 0 1 1
positions 5 0 1 0 1 0 1 0 1
4 3 2 1
0 0 0 0 NUL DLE SP 0 @ P \ p
0 0 0 1 SOH DC1 ! 1 A Q a q
0 0 1 0 STX DC2 “ 2 B R b R
0 0 1 1 ETX DC3 # 3 C S c s
0 1 0 0 EOT DC4 $ 4 D T d t
0 1 0 1 ENQ NAK % 5 E U e u
0 1 1 0 ACK SYN & 6 F V f v
0 1 1 1 BEL ETB ‘ 7 G W g w
1 0 0 0 BS CAN ( 8 H X h x
1 0 0 1 HT EM ) 9 I Y i y
1 0 1 0 LF SUB * : J Z j z
1 0 1 1 VT ESC + ; K [ k {
1 1 0 0 FF FS , < L \ l |
1 1 0 1 CR GS - = M ] m }
1 1 1 0 SO RS . > N ^ n ~
1 1 1 1 SI US / ? O _ o DEL
ตารางขางบนแทนอักขระรหัสต้ังแต 00000000 ถึง 01111111 ถาตองการใชทั้ง 8 บิต รหัสต้ังแต
10000000 ถึง 11111111 จะแทนอักขระพิเศษ เชน ใชแทนอักขระภาษาไทย เปนตน
อักขระที่เปน printable character ไดแกอักขระ ต้ังแต SP (00100000) ถึง ~ (0111110) นอกนั้นจะเปน
อักขระที่ใชควบคุม เชน CR ใชแทนการสิ้นสุดบรรทัด ของระบบปฏิบัติการ Unix หรือ CR กับ LF แทนการสิ้นสุด
บรรทัด ของระบบปฏิบัติการ DOS เปนตน
- แบบ EBCDIC ใชทั้ง 8 บิต แทนรหัส ดูที่ 0http://www.dynamoo.com/technical/ebcdic.htm
- แบบ UNICODE ใช 16 บิตแทนรหัส เพื่อใหสามารถแทนภาษาทั้งหมดในโลกได ดูที่
1 Hhttp://www.unicode.org
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
10
1.3.2 จํานวนเต็ม
แทนเลขจํานวนเต็มทั้งแบบที่มีเครื่องหมาย และแบบที่ไมมีเครื่องหมาย
- กรณีไมมีเครื่องหมาย ถาใชจํานวนบิต n บิต จะแทนเลขจํานวนเต็มไมมีเครื่องหมายได ต้ังแต 0 ถึง 2n-1
เชน n = 16 จะแทนเลขจํานวนเต็มไดต้ังแต 0 ถึง 65535 เปนตน
- กรณีมีเครื่องหมาย สามารถแทนไดในสามรูปแบบ คือ
• sign magnitude ใชบิตซายสุด (most significant bit) แทนเครื่องหมาย 0 แทน บวก และ 1 แทน
ลบ บิตที่เหลือใชแทนขนาดของตัวเลข most significant bit least significant bit
n-1 n-2 … 2 1 0
sign magnitude
เชน สมมุติวาใช จํานวนบิต 8 บิต แทนเลขจํานวน +5 และ –5 ไดเปน 00000101 และ 10000101 เปนตน
ถาใชจํานวน n บิต จะแทนเลขจํานวนเต็มแบบมีเครื่องหมาย ไดต้ังแต – (2n-1 – 1) ถึง +(2n-1- 1)
เชน n = 16 จะแทนเลขจํานวนเต็มมีเครื่องหมายไดต้ังแต –32767 ถึง +32767 เปนตน โดยที่ 0 แทนได
ทั้ง +0 และ –0
กรณีที่ตองการขยายจํานวนบิตเพิ่มขึ้นแตตองการใหมีคาเทาเดิม ทําไดโดยการกําหนดใหบิตเครื่องหมายใหมมีคาเทาเดิม จากนั้นเปลี่ยนบิตเครื่องหมายเดิมและบิตใหมที่เหลือ ใหมีคาเปน 0 เชน
คาเดิม 5 เก็บแบบ 8 บิต คือ 00000101 ขยายเปน 16 บิต ไดเปน 0000000000000101
คาเดิม -5 เก็บแบบ 8 บิต คือ 10000101 ขยายเปน 16 บิต ไดเปน 1000000000000101
การเปลี่ยนเลขจํานวนเต็มบวกฐานสองที่เก็บแบบ sign magnitude เปนเลขฐานสิบ ทําไดตามปรกติ เชน
00000101 เทากับ 5 ฐานสิบ
การเปลี่ยนเลขจํานวนเต็มลบฐานสองที่เก็บแบบ sign magnitude เปนเลขฐานสิบ ทําดังนี้
ก. นําเฉพะ magnitude มาเปลี่ยนเปนเลขฐานสิบ
ค. ใสเครื่องหมายเปนลบ
เชน 10000101 (ดู บิต ซายสุด เปน 1 แสดงวาเปนเลขลบ)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
11
ก. นํา magnitude คือ 0000101 มาเปลี่ยนเปนฐานสิบจะได 5
ค. ใสเครื่องหมายเปนลบ จะได -5
• one complement ใชบิตซายสุด (most significant bit) แทนเครื่องหมาย 0 แทน บวก และ 1 แทน
ลบ เชนกัน การแทนเลขบวก จะเหมือนกับแบบ sign magnitude แตการแทนตัวเลขลบ จะตางกัน แบบ one
complement จะแทนตัวเลขลบโดยการ ทํา complement (เปลี่ยนจากเลข 0 เปน 1 และ เปลี่ยนจากเลข 1 เปน 0) กับ
magnitude เชน สมมุติวาใช จํานวนบิต 8 บิต แทนเลขจํานวน +5 และ –5 ไดเปน 00000101 และ 11111010 เปน
ตน
ถาใชจํานวน n บิต จะแทนเลขจํานวนเต็มแบบมีเครื่องหมาย ไดต้ังแต – (2n-1 – 1) ถึง +(2n-1- 1)
เชน n = 16 จะแทนเลขจํานวนเต็มมีเครื่องหมายไดต้ังแต –32767 ถึง +32767 เปนตน โดยที่ 0 แทนไดทั้ง +0
และ –0
กรณีที่ตองการขยายจํานวนบิตเพิ่มขึ้นแตตองการใหมีคาเทาเดิม ทําไดโดยการสําเนาบิตเครื่องหมายใหกับบิตใหม เชน
คาเดิม 5 เก็บแบบ 8 บิต คือ 00000101 ขยายเปน 16 บิต ไดเปน 0000000000000101
คาเดิม -5 เก็บแบบ 8 บิต คือ 11111010 ขยายเปน 16 บิต ไดเปน 1111111111111010
การเปลี่ยนเลขจํานวนเต็มบวกฐานสองที่เก็บแบบ one complement เปนเลขฐานสิบ ทําไดตามปรกติ เชน
00000110 เทากับ 5 ฐานสิบ
การเปลี่ยนเลขจํานวนเต็มลบฐานสองที่เก็บแบบ one complement เปนเลขฐานสิบ ทําดังนี้
ก. ทํา one complement
ข. เปลี่ยนเปนเลขฐานสิบ
ค. ใสเครื่องหมายเปนลบ
เชน 1111010 (ดู บิต ซายสุด เปน 1 แสดงวาเปนเลขลบ)
ก. ทํา one complement ของ 1111010 จะได 0000101
ข. เปลี่ยน 0000101 เปนฐานสิบจะได 5
ค. เครื่องหมายเปนลบ จะได -5
• two complement ใชบิตซายสุด (most significant bit) แทนเครื่องหมาย 0 แทน บวก และ 1 แทน
ลบ เชนกัน การแทนเลขบวก จะเหมือนกับแบบ sign magnitude แตการแทนตัวเลขลบ จะตางกัน แบบ two
complement จะแทนตัวเลขลบโดยการ ทํา complement (เปลี่ยนจากเลข 0 เปน 1 และ เปลี่ยนจากเลข 1 เปน 0) กับ
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
12
magnitude แลวบวกดวยหนึ่ง เชน สมมุติวาใช จํานวนบิต 8 บิต แทนเลขจํานวน +5 และ –5 ไดเปน 00000101
และ 11111011 เปนตน
ถาใชจํานวน n บิต จะแทนเลขจํานวนเต็มแบบมีเครื่องหมาย ไดต้ังแต – (2n-1) ถึง +(2n-1- 1)
เชน n = 16 จะแทนเลขจํานวนเต็มมีเครื่องหมายไดต้ังแต –32768 ถึง +32767 เปนตน โดยที่ 0 แทนดวย +0
เทานั้น
กรณีที่ตองการขยายจํานวนบิตเพิ่มขึ้นแตตองการใหมีคาเทาเดิม ทําไดโดยการสําเนาบิตเครื่องหมายใหกับบิตใหม เชน
คาเดิม 5 เก็บแบบ 8 บิต คือ 00000101 ขยายเปน 16 บิต ไดเปน 0000000000000101
คาเดิม -5 เก็บแบบ 8 บิต คือ 11111011 ขยายเปน 16 บิต ไดเปน 1111111111111011
การเปลี่ยนเลขจํานวนเต็มบวกฐานสองที่เก็บแบบ two complement เปนเลขฐานสิบ ทําไดตามปรกติ เชน
00000101 เทากับ 5 ฐานสิบ
การเปลี่ยนเลขจํานวนเต็มลบฐานสองที่เก็บแบบ two complement เปนเลขฐานสิบ ทําดังนี้
ก. ลบดวย 1
ข. ทํา one complement
ค. เปลี่ยนเปนเลขฐานสิบ
ง. ใสเครื่องหมายเปนลบ
เชน 1111011 (ดู บิต ซายสุด เปน 1 แสดงวาเปนเลขลบ)
ก. 1111011 – 1 = 1111010
ข. ทํา one complement ของ 1111010 จะได 0000101
ค. เปลี่ยน 0000101 เปนฐานสิบจะได 5
ง. เครื่องหมายเปนลบ จะได -5
1.3.2.1 การบวกลบเลขจํานวนเต็มไมมีเครือ่งหมาย
การบวก 0 + 0 =0
0 + 1 =1
1 + 0 =1
1 + 1 = 0 ทด 1
เนื่องจากจํานวนบิตที่ใชเก็บมีจํานวนจํากัด การบวกเลขจํานวนเต็มไมมีเครื่องหมาย แลวเก็บผลลัพธโดยใชจํานวนบิตเทาเดิม จึงอาจทําใหเกิดการลน (overflow) โดยดูไดจากบิตที่มีการทดซึ่งเรียกวา carry bit ถาผลลัพธมีการ
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
13
ทดดวย 1 เกินออกไปจากจํานวนบิตที่สามารถเก็บได แสดงวามีการลน ในกรณีนี้ carry bit จะเปน 1 และคําตอบที่
เก็บเทากับจํานวนบิตเดิมจะไมถูกตอง แตถาไมมีการลน carry bit จะเปน 0 คําตอบจะถูกตอง เชน
ก. ฐานสิบ ฐานสอง (8 บิต)
250 11111010
+ +
50 00110010
คําตอบที่ถูก คือ 300 carry bit =1 00101100 คําตอบ 8 บิต คือ 00101100 = (64)10 ซึ่งไมถูกตอง
หมายเหตุ จํานวนบิต 8 บิต สามารถเก็บเลขจํานวนเต็มไมมีเครื่องหมายได 0 ถึง 255 ไมสามารถเก็บเลข 300 ได
ข. ฐานสิบ ฐานสอง (8 บิต)
200 11001000
+ +
50 00110010
คําตอบที่ถูก คือ 250 carry bit =0 11111010 คําตอบ 8 บิต คือ 11111010 = (250)10 ซึง่ถูกตอง
การลบ
0 - 0 = 0
0 - 1 = 1 ยืมมาจากหลักหนา 1
1 - 0 = 1
1 – 1 = 0
ในทํานองเดียวกัน การลบเลขจํานวนเต็มไมมีเครื่องหมาย แลวเก็บผลลัพธโดยใชจํานวนบิตเทาเดิม จึงอาจทําใหเกิดการลน (overflow) โดยดูไดจากบิตที่มีการยืมซึ่งเรียกวา carry bit เชนกัน ถาตัวต้ังมีคานอยกวาตัวลบ จะมี
การยืมดวย 1 แสดงวามีการลน ในกรณีนี้ carry bit จะเปน 1 และคําตอบที่เก็บเทากับจํานวนบิตเดิมจะไมถูกตอง แต
ถาไมมีการลน carry bit จะเปน 0 คําตอบจะถูกตอง เชน
ก. ฐานสิบ ฐานสอง (8 บิต)
50 00110010
- -
250 11111010
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
14
คําตอบที่ถูก คือ -200 carry bit =1 00111000 คําตอบ 8 บิต คือ 00111000 = (56)10 ซึ่งไมถูกตอง
หมายเหตุ จํานวนบิต 8 บิต สามารถเก็บเลขจํานวนเต็มไมมีเครื่องหมายได 0 ถึง 255 ไมสามารถเก็บเลขลบได
ข. ฐานสิบ ฐานสอง (8 บิต)
200 11001000
- -
50 00110010
คําตอบที่ถูก คือ 150 carry bit =0 10010010 คําตอบ 8 บิต คือ 10010010 = (150)10 ซึง่ถูกตอง 1.3.2.2 การบวกลบเลขจํานวนเต็มมีเครื่องหมายแบบ two complement
การบวก
เหมือนการบวกเลขจํานวนเต็มไมมีเครื่องหมาย แต carry bit ไมมีความหมายใด ๆ และไมสามารถนํามา
พิจารณาวาคําตอบถูกหรือผิด แสดงได ดังตัวอยางตอไปน้ี
ก. ฐานสิบ ฐานสอง (8 บิต)
-4 11111100
+ +
5 00000101
คําตอบที่ถูก คือ +1 carry bit =1 00000001 คําตอบ 8 บิต คือ 00000001 = (+1)10 ซึ่งถูกตอง
หมายเหตุ แม carry bit จะเทากับ 1 แตคําตอบถูกตอง
ข.
ฐานสิบ ฐานสอง (8 บิต)
121 01111001
+ +
11 00001011
คําตอบที่ถูก คือ 132 carry bit =0 10000100 คําตอบ 8 บิต คือ 10000100 = (-124)10 ซึ่งไมถูกตอง
หมายเหตุ แม carry bit จะเทากับ 0 แตคําตอบไมถูกตอง จํานวนบิต 8 บิต สามารถเก็บเลขจํานวนเต็มมีเครื่องหมาย
แบบ two complement ได -128 ถึง +127 ไมสามารถเก็บเลข 132 ได
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
15
การตรวจสอบคําตอบของการบวกเลขจํานวนเต็มมีเครื่องหมายแบบ two complement จํานวน n บิต แทน
ดวย bn-1bn-2…b1b0 ตองดูที่ overflow bit ซึ่งมีคาเทากับ cin XOR cout เมื่อ มีการบวกเลขจากหลักที่ 0 และมีการทด
(carry bit) ไปยังหลักที่ 1 จนกระทั้งถึง cin เปน carry bit ของการบวกเลขหลักที่ n-2 ซึ่งจะทดไปหลักที่ n-1 และ
cout เปน carry bit ของการบวกเลขหลักที่ n-1 ซึ่งจะทดไปยังหลักถัดไป เชน
ก. ฐานสิบ ฐานสอง (8 บิต)
-4 11111100
+ +
5 00000101
คําตอบที่ถูก คือ +1 00000001 คําตอบ 8 บิต คือ 00000001 = (+1)10 ซึ่งถูกตอง cin = 1
cout = 1
overflow bit = 1 XOR 1 = 0
หมายเหตุ 0 XOR 0 = 0 , 0 XOR 1 = 1, 1 XOR 0 = 1 , 1 XOR 1 =0
ข. ฐานสิบ ฐานสอง (8 บิต)
121 01111001
+ +
11 00001011
คําตอบที่ถูก คือ 132 10000100 คําตอบ 8 บิต คือ 10000100 = (-124)10 ซึง่ไมถูกตอง cin = 1 cout = 0
overflow bit = 1 XOR 0 = 1
สรุปวา การบวกเลขจํานวนเต็มมีเครื่องหมายแบบ two complement จะไดคําตอบที่ผิดถา overflow bit = 1
มิฉะนั้น จะไดคําตอบที่ถูกตอง (overflow bit = 0)
การลบ
เนื่องจาก A-B = A+(-B) ดังนั้นการลบทําไดดังนี้ ตัวต้ัง + one complement ของตัวลบ +1 และการ
ตรวจสอบวาผลลัพธถูกตองหรือไม ดูที่ overflow bit เหมือนการบวก เชน
ตัวทดของการบวกเลขหลักที่ 0 ซึ่งเกิดจาก 1+1 คือ 1 เพราะ
1+1 = 0 ทด 1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
16
ก. (121-11)10 = (121 + one complement ของ 11 +1)10
ฐานสิบ ฐานสอง (8 บิต)
121 01111001
+ +
one complement ของ 11 11110100
+ +
1 00000001
คําตอบที่ถูก คือ 110 01101110 คําตอบ 8 บิต คือ 10000100 = (110)10 ซึ่งถูกตอง cin = 1 cout = 1
overflow bit = 1 XOR 1 = 0
ข. (-1-128)10 = (-1 + one complement ของ 128 +1)10
ฐานสิบ ฐานสอง (8 บิต)
-1 11111111
+ +
one complement ของ 128 10000000
+ +
1 00000001
คําตอบที่ถูก คือ -129 10000000 คําตอบ 8 บติ คือ 10000000 = (-128)10 ซึง่ไมถูกตอง cin = 1 cout = 0
overflow bit = 1 XOR 0 = 1
1.3.3 จํานวนจริง เลขจํานวนจริงสามารถแทนตัวเลขที่มีขนาดใหญ เชน 1.234x1085 หรือขนาดเล็กเชน 1.234x10 –85 ได เลข
จํานวนจริงประกอบดวย สวน mantissa หรือ fractional part กับ สวน exponent ในกรณีนี้ ฐานยกกําลัง (base
exponent) คือ 10 เชน 1.234X1035 มี 1.234 เปนสวน mantissa และ 35 เปนสวน exponent มีฐานยกกําลัง 10
ในการแทนเลขจํานวนจริงสามารถเก็บเฉพาะ mantissa และ exponent โดยไมจําเปนตองเก็บเลขฐานยกกําลัง
เนื่องจากสามารถกําหนดตายตัวไดวาเลขฐานยกกําลังเปนอะไร สําหรับคอมพิวเตอรซึ่งเก็บขอมูลในรูปเลขฐานสอง ปรกติแลว จะใชฐานยกกําลัง เปน 2, 4, 8, หรือ 16 จะไมใชฐานยกกําลังเปน 10 และเพื่อใหมีความแมยําสูงสุด
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
17
คอมพิวเตอรสวนใหญจะเก็บ mantissa แบบ normalized คือ ใหจุดไปอยูหนา เลขนัยสําคัญตัวแรกของ mantissa
(ในกรณีเลข 0 จะแทนในรูปแบบพิเศษ เชน mantissa และ exponent เปน 0 ทั้งคู) นั่นคือ
1/เลขฐานยกกําลัง <= | mantissa | < 1
เชน (0.00173)10 สามารถแทนไดเปน 0.000173x101 , 0.001730x100, 0.017300x10-1, หรือ 0.173000x10-2
แบบหลังสุดจะเปนแบบ normalized
(103.5)10 เก็บแบบ normalized คือ 0.1035x103
(0.000011101)2 เก็บแบบ normalized คือ 0.11101x2-4
• Institute of Electrical and Electronic Engineers (IEEE) standard
เลขจํานวนจริงเก็บตามมาตรฐาน IEEE ดังนี้
short real S biased exponent mantissa
31 23 1. กรณี normalized 0
0. กรณี denormalized
long real S biased exponent mantissa
63 52 1. กรณี nomalized 0
0. กรณี denomalized
S เปนเครื่องหมายของ mantissa โดยที่ 1 แทน – และ 0 แทน +
biased exponent เก็บทั้งคาและเครื่องหมายของ exponent ดังนี้
กรณี short real
exponent biased exponent (8 บิต)
-127 0
-126 1
. . .
-1 126
0 127
1 128
. . .
126 253
127 254
หมายเหตุ เก็บเลขนัยสําคัญฐานสิบได 7 หลัก และยกกําลังฐานสิบไดประมาณ 10-38 ถึง 1038
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
18
กรณี long real
exponent biased exponent (11 บิต)
-1023 0
-1023 1
. . .
-1 1022
0 1023
1 1024
. . .
1022 2045
1023 2046
หมายเหตุ เก็บเลขนัยสําคัญฐานสิบได 15 หลัก และยกกําลังฐานสิบไดประมาณ 10-308 ถึง 10308
mantissa ทํา normalized แลวคูณดวย 2 เพื่อให 1 อยูหนาจุด และลบสวน biased exponent ดวยหน่ึง
เพื่อใหคาเทาเดิม ตัวเลขหลังจุดเก็บเปนสวน mantissa (เลข 1 หนาจุดไมจําเปนตองเก็บ)
กรณีพิเศษ biased exponent mantissa special meaning
all 0 all 0 floating point zero
all 0 nonzero denormalized
all 1 all 0 infinity
all 1 nonzero NaN (Not a Number)
สูตรที่ใชคํานวณเลขจํานวนจริงที่เก็บตามมาตรฐาน IEEE
สมมุติวา คาที่เก็บคือ SEM เมื่อ S แทนบิตซายสุด (0 แทน บวก และ 1 แทนลบ) E แทนเลขฐานสองในสวน
bias exponent และ M แทนเลขฐานสองในสวน mantissa
ก. กรณี normalized
สําหรับ short real จะมีคาฐานสิบ เปน (-1)**S * 1.M*2**(E-127)
สําหรับ long real จะมีคาฐานสิบ เปน (-1)**S * 1.M*2**(E-1023)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
19
ข. กรณี denomalized จะทําใหเลขนัยสําคัญลดลง แตคาเขาใกล 0 มากขึ้น
สําหรับ short real จะมีคาฐานสิบ เปน (-1)**S * 0.M*2**-126
สําหรับ long real จะมีคาฐานสิบ เปน (-1)**S * 0.M*2**-1022
ตัวอยาง short floating point (41200000)16 หรือ
(0100 0001 0010 0000 0000 0000 0000 0000)2
⇒ s = 0 หรือ +
biased exponent = (10000010)2 หรือ (130)10 ดังนั้น exponent จริง = 130 – 127 = 3 หรือ (11)2
และ mantissa = (01000000000000000000000)2 ดังนั้น mantissa ที่ถูกตอง = (1.01)2
ดังนั้นคาที่แทนคือ (1.01)2 x (10)2(11)2 หรือ (1010)2 (หมายเหตุ เลื่อนจุดไปทางขวา 3 ตําแหนง) ซึ่งมีคา
เทากับ 10 เลขฐานสิบนั่นเอง 1.3.4 Binary Coded Decimal (BCD) โปรแกรมประยุกตบางโปรแกรมเปนแบบ io bound คือ มีการคํานวณนอย แตสวนใหญเปนการนําขอมูลเขาหรือแสดงผลลัพธ การแทนขอมูลแบบที่กลาวมาจึงอาจไมเหมาะสม เพราะจะตองเสียเวลาแปลงขอมูล
จากขอมูลเขาเปนเลขฐานสองและแปลงขอมูลจากเลขฐานสองเปนขอมูลออก จึงมีการแทนขอมูลอีกแบบหนึ่งที่
เรียกวา BCD เพื่อใหการนําขอมูลเขาและแสดงผลลัพธทําไดเร็วขึ้น เราสามารถใชเลขฐานสอง 4 ตัว แทนเลขฐานสิบหนึ่งตัว ดังนี้
เลขฐานสิบ BCD 0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
20
เราสามารถเก็บเลข BCD แบบ unpacked หรือ packed
• Unpacked BCD
ประกอบดวยสี่บิตซายซึ่งเปน 0000 และสี่บิตขวาซึ่งเปน BCD หนึ่งตัว เชน (1234)10 แทนแบบ Unpacked
BCD ดังนี้ 0000 0001 0000 0010 0000 0011 0000 0100
• Packed BCD
ประกอบดวยสี่บิตซายซึ่งเปน BCD หนึ่งตัว และสี่บิตขวาซึ่งเปน BCD อีกหนึ่งตัว เชน (1234)10 แทนแบบ
Packed BCD ดังนี้ 0001 0010 0011 0100 กรณีที่ไมครบไบต จะเติมศูนยขางหนา เชน (123)10 แทนแบบ
Packed BCD ดังนี้ 0000 0010 0011 0100
1.4 Big Endian v.s. Little Endian ในกรณีที่มีการอางอิงตําแหนงของขอมูลไดเปนไบต (byte addressable) ขอมูลที่ใชเนื้อที่มากกวาหนึ่งไบต คือ เปนคํา (word) เชน จํานวนจริงหรือจํานวนเต็ม เปนตน มีการเก็บขอมูลไดสองลักษณะ คือ แบบ big
endian กับ แบบ little endian
• แบบ big endian ขอมูลไบตที่มีนัยสําคัญต่ําเก็บที่ไบตเลขที่สูง ดังภาพ most significant least significant
byte byte
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
เลขที่ x 0000 0001
x+1 1111 0010
ตัวอยาง เชน MIPS
0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
21
• little endian ขอมูลไบตที่มีนัยสําคัญต่ําเก็บที่ไบตเลขที่ตํ่า ดังภาพ
most significant least significant
byte byte
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
เลขที่ x 1111 0010
x+1 0000 0001
ตัวอยาง เชน Intel 80x86
2.1 รูปแบบคาํสั่งภาษาเครื่อง ซีพียูสามารถประมวลผลไดเฉพาะคําสั่งภาษาเครื่อง (machine language) เทานั้น คําสั่งภาษาเครื่องมีรหัส
เปนเลขฐานสอง ประกอบดวยสวนที่สําคัญสองสวน คือ รหัสดําเนินการ (operation code) ซึ่งตองมี และ ตัวถูก
ดําเนินการ (operands) ซึ่งอาจจะไมมี หรือมีหนึ่งถึงสามตัว
รหัสดําเนินการ เชน บวก, ลบ, คูณ, หรือ หาร เปนตน บอกใหรูวา จะทําอะไร สวนตัวถูกดําเนินการ เปน
ขอมูลที่จะนํามาดําเนินการ ซึ่งอาจจะเปนขอมูลที่อยูในคําสั่ง เรียกวา immediate operand เชน คาคงที่ตาง ๆ หรือ
อาจเปนขอมูลในเรจิสเตอร เรียกวา register operand หรือ อาจเปนการอางถึงตําแหนงของหนวยความจําหลักที่เก็บ
ขอมูล หรืออางถึงตําแหนงของ I/O
จะเห็นไดวา การเขียนโปรแกรมเพื่อดําเนินการกับขอมูล แบบ immediate หรือ แบบ register จะทําไดเร็ว
กวา การดําเนินการกับขอมูลในหนวยความจําหรืออุปกรณ I/O
ซีพียู fetch คําสั่งภาษาเครื่องมาจากหนวยความจําหลัก ทีละคําสั่ง แลว execute ทีละคําสั่ง ซีพียูสามารถ
คํานวณทางคณิตศาสตร ทดสอบทางตรรกะ และทํางานขั้นพื้นฐานอื่น ๆ ดังนั้น การคํานวณมาก ๆ เชน คําสั่งของภาษาระดับสูง X := ((A*B)+(C/D))-10; จําเปนตองแปลเปนคําสั่งพื้นฐาน หลายคําสั่ง คือ T1:=A*B
T2:=C/D
T3:=T1+T2
X:=T3-10
0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
22
แตละคําสั่ง จะทํางานขั้นพื้นฐาน คือ บวก, ลบ, คูณ และหาร เปนตน ในตัวอยางนี้ แตละคําสั่งมีตัวถูกดําเนินการ สาม
ตัว
คําสั่งภาษาเครื่องอาจแบงกลุมออกได ตามชนิดของการดําเนินการ เชน การคํานวณทางคณิตศาสตร, การ
ทดสอบทางตรรกะ, การเคลื่อนยายขอมูล เปนตน หรือ อาจแบงตามจํานวนตัวถูกดําเนินการ (อาจเปน immediate,
register, หรือ memory address) ดังนี้
• Three-address instructions เปนคําสั่งที่มีตัวถูกดําเนินการ 3 ตัว มีตัวถูกดําเนินการตัวหนึ่งไวสําหรับเก็บผลลัพธ เชน
คําส่ัง ความหมาย ADD X,Y,T T:=X+Y SUB X,Y,T T:=X-Y MUL X,Y,T T:=X*Y DIV X,Y,T T:=X/Y
ต.ย. X := ((A*B)+(C/D))-10;
ความหมาย: กรณีใช 3 ตัวแปร (T1,T2,T3) หรือ กรณีใช 2 ตัวแปร (T1,T2)
T1:=A*B T1:=A*B หมายถึง T1 <- A*B
T2:=C/D T2:=C/D หมายถึง T2 <- C/D
T3:=T1+T2 T1:=T1+T2 หมายถึง T1 <- T1+T2 = (A*B)+(C/D)
X:=T3-10 X:=T1-10 หมายถึง X <- T1-10 = ((A*B)+(C/D))-10
หมายเหตุ ตัวแปร <- นิพจน และ ตัวแปร := นิพจน หมายถึง คํานวณนิพจนและนําคาที่ไดมาใสในตัวแปรทางซาย
เขียนดวย three-address instructions ได ดังนี้
หมายเหตุ หรือ หมายเหตุ MUL A,B,T1 ; T1 <- A*B MUL A,B,T1 ; T1 <- A*B
DIV C,D,T2 ; T2 <- C/D DIV C,D,T2 ; T2 <- C/D
ADD T1,T2,T3 ; T1 <- T2+T3 = (A*B)+(C/D) ADD T1,T2,T1 ; T1 <- T1+T2 = (A*B)+(C/D)
SUB T3,10,X ; X <- T3-10 = ((A*B)+(C/D))-10 SUB T1,10,X ; X <- T1-10 = ((A*B)+(C/D))-10
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
23
• Two-address instructions เปนคําสั่งที่มีตัวถูกดําเนินการ 2 ตัว หลังจากดําเนินการแลว ตัวถูกดําเนินการตัวหนึ่งไวเก็บผลลัพธ เชน คําส่ัง ความหมาย ADD X,Y X:=X+Y SUB X,Y X:=X-Y MUL X,Y X:=X*Y DIV X,Y X:=X/Y MOV X,Y X:=Y (หมายเหตุ Y ยังคงมคีาเทาเดิม) CMP X,Y เปรียบเทียบ X กับ Y และกาํหนดให FLAG เปน EQ, GT, หรอื LT JE X กระโดดไปทีต่ําแหนง X ถา FLAG เปน EQ มิฉะน้ัน ทาํคําส่ังถดัไป JNE X กระโดดไปทีต่ําแหนง X ถา FLAG เปน GT หรอื LT มิฉะน้ัน ทาํคาํส่ังถัดไป JL X กระโดดไปทีตํ่าแหนง X ถา FLAG เปน LT มิฉะน้ัน ทาํคําส่ังถดัไป JLE X กระโดดไปทีต่ําแหนง X ถา FLAG เปน LT หรอื EQ มิฉะน้ัน ทาํคาํส่ังถัดไป JG X กระโดดไปทีต่ําแหนง X ถา FLAG เปน GT มิฉะน้ัน ทาํคําส่ังถดัไป JGE X กระโดดไปทีต่ําแหนง X ถา FLAG เปน GT หรอื EQ มิฉะน้ัน ทาํคาํส่ังถัดไป JMP X กระโดดไปทีต่ําแหนง X โดยไมมีเงื่อนไข หมายเหตุ คําสั่ง CMP มีตัวถกูดําเนินการสองตัว และจําเปนตองมีคําสั่ง เพ่ือกระโดดไปที่ตําแหนงที่ตองการ ตามเงื่อนไข หรือโดยไมมีเง่ือนไข ซึ่งเปนคําสั่งทีม่ีตัวถูกดําเนินการเพียงตัวเดียว
ต.ย. X := ((A*B)+(C/D))-10;
ความหมาย: T1:=A*B
T2:=C/D
T1:=T1+T2
X:=T1-10
เขียนดวย two-address instructions ได หลายแบบ ดังนี้
หมายเหตุ หรือ หมายเหตุ MOV T1,A ; T1 <- A MOV T1,A ; T1 <- A
MUL T1,B ; T1 <- T1*B = A*B MUL T1,B ; T1 <- T1*B = A*B
MOV T2,C ; T2 <- C MOV T2,C ; T2 <- C
DIV T2,D ; T2 <- T2/D = C/D DIV T2,D ; T2 <- T2/D = C/D
ADD T1,T2 ; T1 <- T1+T2 = (A*B)+(C/D) ADD T1,T2 ; T1 <- T1+T2 = (A*B)+(C/D)
SUB T1,10 ; T1 <- T1-10 = (A*B)+(C/D)-10 MOV X,T1 ; X <- T1 = (A*B)+(C/D)
MOV X,T1 ; X <- T1 = (A*B)+(C/D)-10 SUB X,10 ; X <- X-10 = ((A*B)+(C/D))-10
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
24
• One-address instructions เปนคําสั่งที่มีตัวถูกดําเนินการ 1 ตัว และซีพียูจะตองมีเรจิสเตอรที่เรียกวา accumulator (AC) เพื่อใชในการ
ดําเนินการ เชน คําส่ัง ความหมาย LOAD X AC:=X STORE X X:=AC (หมายเหตุ AC ยังคงมีคาเทาเดมิ) ADD X AC:=AC+X SUB X AC:=AC-X MUL X AC:=AC*X DIV X AC:=AC/X
ต.ย. X := ((A*B)+(C/D))-10;
ความหมาย: T1:=A*B
T2:=C/D
T1:=T1+T2
X:=T1-10
เขียนดวย one-address instructions ได ดังนี้
หมายเหตุ LOAD A ; AC <- A
MUL B ; AC <- AC*B = A*B T1:=A*B
STORE T1 ; T1 <- AC = A*B และ AC = A*B
LOAD C ; AC <- C
DIV D ; AC <- AC/D = C/D T2:=C/D
STORE T2 ; T2 <- AC = C/D และ AC = C/D
LOAD T1 ; AC <- T1 = A*B
ADD T2 ; AC <- AC+T2 = (A*B)+(C/D) T1:=T1+T2
STORE T1 ; T1 <- AC = (A*B)+(C/D)
LOAD T1 ; AC <- T1 = (A*B)+(C/D) หมายเหตุ เสียเวลาไมตองมีก็ได SUB 10 ; AC <- AC-10 = ((A*B)+(C/D))-10
STORE X ; X <- AC = ((A*B)+(C/D))-10
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
25
หรือ หมายเหตุ LOAD A ; AC <- A
MUL B ; AC <- AC*B = A*B
STORE T1 ; T1 <- A*B และ AC = A*B
LOAD C ; AC <- C
DIV D ; AC <- AC/D = C/D
ADD T1 ; AC <- AC+T1 = (C/D)+(A*B) = (A*B)+(C/D)
SUB 10 ; AC <- AC-10 = ((A*B)+(C/D))-10
STORE X ; X <- ((A*B)+(C/D))-10
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
26
• Zero-address (stack) instructions เปนคําสั่งที่ไมมีตัวถูกดําเนินการ แตมี stack เพื่อใชในการดําเนินการ อยางไรก็ตามจําเปนตองมีคําสั่ง เพื่อ
บรรจุขอมูลของตัวถูกดําเนินการ ลง stack และนําขอมูลออกจาก stack ใสในตัวถูกดําเนินการ เชน คําส่ัง ความหมาย PUSH X ใสคา X ลงบน stack POP X นําคาบนสุดออกจาก stack ใสใน X ADD ใชคาบนสุดของ stack เปนตัวบวก ใชคาที่อยูขางลางคาบนสุด
เปนตัวตัง้ นําคาทั้งสองบวกกัน เอาคาบนสุดและคาทีอ่ยูขางลางคาบนสุดออกจาก stack แลวใสผลบวกลงบน stack
SUB เหมือน ADD แตเปนการลบ MUL เหมือน ADD แตเปนการคณู DIV เหมือน ADD แตเปนการหาร
การทํางานแบบ stack แสดงได ดังนี้
stack empty
push 5 top
push 10 top
add
top
pop X
X <- 15 stack empty
5
10
5
15
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
27
ต.ย. X := ((A*B)+(C/D))-10;
ความหมาย: T1:=A*B
T2:=C/D
T1:=T1+T2
X:=T1-10
เขียนดวย zero-address instructions ได ดังนี้
วิธีท่ี 1 PUSH A top
PUSH B top
; T1:=A*B
MUL top
POP T1 ; T1 <- A*B stack empty
PUSH C
PUSH D
DIV ; T2:=C/D
POP T2
PUSH T1
PUSH T2
ADD ; T1:=T1+T2
POP T1
PUSH T1
PUSH 10
SUB ; X:=T1-10
POP X
A
B
A
A*B
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
28
วิธีท่ี 2 แปลง ((A*B)+(C/D))-10 ซึ่งเขียนในรูป infix form เปน postfix form ไดเปน AB*CD/+10-
หมายเหตุ infix form (A binary operator B) ตรงกับ postfix form (A B binary operator) เชน
infix form (A+B) ตรงกับ postfix form (AB+)
กรณีที่เปน operand ให push operand กรณีที่เปน operator ใหดําเนินการตาม operator นั้น
เขียนดวย zero-address instructions ได ดังนี้
PUSH A top
PUSH B top
MUL
top
PUSH C top
PUSH D top
DIV
top
A
B
A
A*B
C
A*B
D
C
A*B
C/D
A*B
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
29
ADD top
PUSH 10 top
SUB top
POP X X <- ((A*B)+(C/D))-10 stack empty
(A*B)+(C/D)
10
(A*B)+(C/D)
((A*B)+(C/D))-10
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
30
ขอแนะนําในการเขียนโปรแกรม
คิดกอน
เขียนขั้นตอนวิธี (algorithm)
เขียนโปรแกม
ยากกวา
งายกวา
งายกวา
งายกวา
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
31
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
32
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
33
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
34
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
35
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
36
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
37
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
38
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
39
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
40
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
41
Condition
Condition เปนนิพจนตรรกะ (logical expression) ที่ใหคา จริง หรือ เท็จ อยางใดอยางหนึ่ง เกิดจากการนํา
นิพจนคณิตศาสตร (arithmetic expression) มาดําเนินการดวย ตัวดําเนินการสัมพันธ (relational operator) หรือนํา
นิพจนตรรกะมาดําเนินการดวย ตัวดําเนิการตรรกะ (logical operator)
ตัวดําเนิการคณิตศาสตร ไดแก + บวก
- ลบ
* คูณ
/ หาร
เชน x, 10, (x+y)-5
ตัวดําเนินการสัมพันธ ไดแก = เทากับ
≠ ไมเทากับ < นอยกวา
≤ นอยกวาหรือเทากับ
> มากกวา
≥ มากกวาหรือเทากับ เชน X = Y, X < Y*5
ตัวดําเนิการตรรกะ ไดแก not, and, or
มีตารางความจริง ดังนี้ not T F and T F or T F
F T T T F T T T
F F F F T F
เชน X < Y and Y < Z
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
42
ดูภาคผนวก ข. ประกอบ
ต.ย. ก. รหัสเทียม (pseudo code)
IF (A=B)
THEN A:=A+1;
ELSE B:=B-1;
END_IF;
ผังงาน (flowchart): true false ความหมาย: ถา A เทากับ B จริง ทํา A:=A+1 มิฉะนั้น ทํา B:=B-1
เขียนดวย two-address instructions ได หลายแบบ ดังนี้
หรือ CMP A,B CMP A,B
JE $THEN JNE $ELSE
SUB B,1 ADD A,1
JMP $ENDIF JMP $ENDIF
$THEN: ADD A,1 $ELSE: SUB B,1
$ENDIF: $ENDIF:
หมายเหตุ ในที่นี้ จะตั้งช่ือตําแหนงโดยเขียนขึ้นตนดวย $ และลงทายดวย : และไมจําเปนตองมีช่ือเปน $THEN,
$ELSE หรือ $ENDIF จะใชช่ือื่นก็ได
A=B
A:=A+1 B:=B-1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
43
ข. รหัสเทียม: SUM:=0;
I := 1;
WHILE I ≤ 100
SUM := SUM + I;
I := I + 1; loop body
END_WHILE; ผังงาน: true false ความหมาย: ตองการบวกเลข 1 ถึง 100 เก็บที่ตัวแปร SUM
ตรง WHILE I ≤ 100 …<loop body>…
END_WHILE;
หมายถึง ใหทําใน loop body ซ้าํ ถา I มีคามากกวาหรือเทากับ 100 แตถา I มากกวา 100 เลิกทํา
SUM:=0
I:=1
I≤100
SUM:=SUM+I
I:=I+1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
44
เขียนดวย two-address instructions ได หลายแบบ ดังนี้
หรือ MOV SUM,0 MOV SUM,0
MOV I,1 MOV I,1
$WHILE: CMP I,100 $WHILE: CMP I,100
JLE $LOOP JG $ENDWHILE
JMP $ENDWHILE
$LOOP: ADD SUM,I ADD SUM,I ADD I,1 ADD I,1
JMP $WHILE JMP $WHILE
$ENDWHILE: $ENDWHILE:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
45
รหัสเทียมอ่ืน ๆ เชน
ก. CASE I OF
1: …case1…
BREAK;
2: …case2…
BREAK;
3: …case3…
BREAK;
DEFAULT: …casedefault.. ;
END_CASE;
มีความหมายเหมือน
IF I = 1 THEN …case1…
ELSE IF I = 2 THEN …case2…
ELSE IF I=3 THEN …case3…
ELSE …casedefault…
END_IF;
ข. FOR I = initvalue TO finalvalue
…
END_FOR;
มีความหมายเหมือน
I:=initvalue;
WHILE I ≤ finalvalue
…
I := I+1;
END_WHILE;
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
46
แบบฝกหัด
1. จงแปลรหัสเทียมตอไปนี้ โดยใชคําสั่งแบบ two-address instructions
หมายเหตุ เขียนไดหลายวิธี ก. A := B+1;
คําตอบ หรือ หรือ MOV A,B ADD B,1 MOV T,B
ADD A,1 MOV A,B ADD T,1
MOV A,T
ข. C := (A/5)*(E-F);
คําตอบ หรือ หรือ DIV A,5 MOV C,A MOV T1,A
SUB E,F DIV C,5 DIV T1,5
MUL A,E MOV T,E MOV T2,E
MOV C,A SUB T,F SUB T2,F
MUL C,T MUL T1,T2
MOV C,T1
ค. IF A < 0
THEN E:=F*G;
ELSE E:=F/G
END_IF;
คําตอบ หรือ หรือ CMP A,0 CMP A,0 CMP A,0
JL $TRUE JL $TRUE JGE $FALSE
DIV F,G DIV F,G MUL F,G
MOV E,F JMP $L2 JMP $L2
JMP $ENDIF $TRUE: MUL F,G $FALSE: DIV F,G
$TRUE: MUL F,G $L2: MOV E,F $L2: MOV E,F
MOV E,F $ENDIF: $ENDIF:
$ENDIF:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
47
ง. A:=0;
SUM:=0;
WHILE A<10
A:=A+1;
SUM:=SUM+A;
END_WHILE;
คําตอบ หรือ MOV A,0 MOV A,0
MOV SUM,0 MOV SUM,0
$WHILE: CMP A,10 $WHILE: CMP A,10
JL $BODY JGE $ENDWHILE
JMP $ENDWHILE
$BODY: ADD A,1 ADD A,1
ADD SUM,A ADD SUM,A
JMP $WHILE JMP $WHILE
$ENDWHILE: $ENDWHILE:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
48
จ. IF (A>100) AND (B>50) AND (C>20)
THEN D:=0;
ELSE D := 1;
END_IF;
คําตอบ หรือ CMP A,100 CMP A,100
JG L1
JMP $ELSE JLE $ELSE
L1: CMP A,50 CMP A,50
JG L2
JMP $ELSE JLE $ELSE
L2: CMP C,20 CMP C,20
JG $THEN
JMP $ELSE JLE $ELSE
$THEN: MOV D,0 MOV D,0
JMP $ENDIF JMP $ENDIF
$ELSE: MOV D,1 $ELSE: MOV D,1
$ENDIF: $ENDIF:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
49
ฉ. CASE I OF
1: D:=A; BREAK;
2:D:=B;BREAK;
3:D:=C;BREAK;
DEFAULT:D:=0;
END_CASE;
คําตอบ CMP I,1
JE L1
CMP I,2
JE L2
CMP I,3
JE L3
MOV D,0
JMP L4
L1: MOV D,A
JMP L4
L2: MOV D,B
JMP L4
L3: MOV D,C
L4:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
50
ช. SUM:=0;
FOR I:=1 TO 200
SUM:=SUM+(I*I);
END_FOR;
คําตอบ MOV SUM,0
FORI: MOV I,1
LOOPI: CMP I,200
JG ENDLOOPI
MOV T,I ระวัง MUL I,I ไมได เพราะ I จะเปลี่ยนคา ทําให loop ผิด MUL T,T
ADD SUM,T
ADD I,1
JMP LOOPI
ENDLOOPI:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
51
2. กําหนดคําสั่งเพิ่มเติมจากขอ 1. ตอไปนี้
คําสั่ง ความหมาย
READ X อานคาจากอุปกรณนําขอมูลเขามาเก็บที่ X
WRITE X แสดงผลลัพธของ X ไปยังอุปกรณนําขอมูลออก
ก. เขียนโปรแกรม เพื่ออานเลขจํานวนเต็มบวก (N) และพิมพคา Factorial ของเลขดังกลาว (N!)
คําตอบ มีหลายวิธี ในที่นี้เปนเพียงคําตอบหนึ่งเทานั้น
ขั้นตอนที่ 1 ใหคิดกอน ดังนี้ เนื่องจาก N! = N*(N-1)*(N-2)* …*2*1 หรือ = 1* N*(N-1)*(N-2)* …*2
ดังนั้น
อานขอมูลมาเก็บที่ N
เริ่มตนให FAC <- 1 FAC <- FAC*N FAC <- 1*N
N <- N-1 N <- N-1
FAC <- FAC*N FAC <- 1*N*(N-1)
N <- N-1 N <- N-2 …
FAC <- FAC*N FAC <- 1*N*(N-1)*…*2
N <- N-1 N มีคานอยกวา 2
แสดงผลลัพธของ FAC
หมายเหตุ ทํา ซ้ําจนกวา N มีคานอยกวา 2
ขั้นตอนที่ 2 เขียนรหัสเทียมได ดังนี้ READ N;
FAC := 1;
WHILE N ≥ 2
FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
ใหทดลองใสขอมูลเมื่อ N เปน 0, 1, 2, 3 แลวทําตามขั้นตอนที่เขียน ตรวจสอบวาคําตอบถูกหรือไม
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
52
เม่ือ N = 0 READ N; N
FAC := 1; FAC
WHILE N ≥ 2 FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
READ N; N
FAC := 1; FAC
WHILE N ≥ 2 FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
READ N; N
FAC := 1; FAC
WHILE N ≥ 2 เท็จ FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
READ N; N
FAC := 1; FAC
WHILE N ≥ 2 FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC 0! = 1 ถูกตอง
0
?
1
0
1
0
1
0
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
53
เม่ือ N = 1 READ N; N
FAC := 1; FAC
WHILE N ≥ 2 FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
READ N; N
FAC := 1; FAC
WHILE N ≥ 2 FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
READ N; N
FAC := 1; FAC
WHILE N ≥ 2 เท็จ FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
READ N; N
FAC := 1; FAC
WHILE N ≥ 2 FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC 1! = 1 ถูกตอง
1
?
1
1
1
1
1
1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
54
เม่ือ N = 2 READ N; N
FAC := 1; FAC
WHILE N ≥ 2 FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
READ N; N
FAC := 1; FAC
WHILE N ≥ 2 FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
READ N; N
FAC := 1; FAC
WHILE N ≥ 2 จริง FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
READ N; N
FAC := 1; FAC
WHILE N ≥ 2 FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
2
?
1
2
1
2
1*2 = 2
2
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
55
READ N; N
FAC := 1; FAC
WHILE N ≥ 2 FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
READ N; N
FAC := 1; FAC
WHILE N ≥ 2 เท็จ FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC
READ N; N
FAC := 1; FAC
WHILE N ≥ 2 เท็จ FAC := FAC*N;
N := N-1;
END_WHILE;
WRITE FAC 2! = 2 ถูกตอง
กรณี N = 3 ทําในลักษณะเดียวกัน
2
1
2
2-1=1
2
1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
56
ขั้นตอนที่ 3 เขียนเปนคําสั่งได ดังนี้
READ N
MOV FAC,1
L1: CMP N,2
JL L2
MUL FAC,N
SUB N,1
JMP L1
L2: WRITE FAC
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
57
ข. เขียนโปรแกรม เพื่อพิมพเลข Fibonacci จํานวน 20 ตัวแรก เมื่อ เลข Fibonacci มีนิยาม ดังนี้ F1 := 1, F2:=1
Fi = Fi-1 + Fi-2 i = 3, 4, 5, . . .
คําตอบ มีหลายวิธี ในที่นี้เปนเพียงคําตอบหนึ่งเทานั้น
ขั้นตอนที่ 1 ใหคิดกอน ดังนี้ F1 <- 1
พิมพ F1
F2 <- 1
พิมพ F2
F3 <- F1+F2 = 1+1=2 F3 <- F1+F2 = 1+2=3 …
พิมพ F3 พิมพ F3
F1 <- F2 = 1 F1 <- F2 = 2
F2 <- F3 = 2 F2 <- F3 = 3 …
ทําซา 18 ครั้ง 1 1 2 3 …
ขั้นตอนที่ 2 เขียนรหัสเทียมได ดังนี้ F1:=1;
WRITE F1;
F2 := 1;
WRITE F2;
FOR I:=1 TO 18
F3 := F1+F2;
WRITE F3;
F1:=F2;
F2:=F3;
END_FOR;
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
58
ตรวจสอบวาคําตอบถูกหรือไม
F1:=1; F1
WRITE F1;
F2 := 1;
WRITE F2;
FOR I:=1 TO 18
F3 := F1+F2;
WRITE F3;
F1:=F2;
F2:=F3;
END_FOR;
F1:=1; F1
WRITE F1; ได Fibonacci ตัวแรก คือ 1
F2 := 1;
WRITE F2;
FOR I:=1 TO 18
F3 := F1+F2;
WRITE F3;
F1:=F2;
F2:=F3;
END_FOR;
1
1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
59
F1:=1; F1
WRITE F1;
F2 := 1; F2
WRITE F2;
FOR I:=1 TO 18
F3 := F1+F2;
WRITE F3;
F1:=F2;
F2:=F3;
END_FOR;
F1:=1; F1
WRITE F1;
F2 := 1; F2
WRITE F2; ได Fibonacci ตัวที่ 2 คือ 1
FOR I:=1 TO 18
F3 := F1+F2;
WRITE F3;
F1:=F2;
F2:=F3;
END_FOR;
1
1
1
1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
60
F1:=1; F1
WRITE F1;
F2 := 1; F2
WRITE F2;
FOR I:=1 TO 18 I
F3 := F1+F2;
WRITE F3;
F1:=F2;
F2:=F3;
END_FOR;
F1:=1; F1
WRITE F1;
F2 := 1; F2
WRITE F2;
FOR I:=1 TO 18 I
F3 := F1+F2;
WRITE F3; F3
F1:=F2;
F2:=F3;
END_FOR;
1
1
1
1
1
1
1+1 =2
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
61
F1:=1; F1
WRITE F1;
F2 := 1; F2
WRITE F2;
FOR I:=1 TO 18 I
F3 := F1+F2;
WRITE F3; ได Fibonacci ตัวที่ 3 คือ 2 F3
F1:=F2;
F2:=F3;
END_FOR; F1:=1; F1
WRITE F1;
F2 := 1; F2
WRITE F2;
FOR I:=1 TO 18 I
F3 := F1+F2;
WRITE F3; F3
F1:=F2;
F2:=F3;
END_FOR;
1
1
1
1+1 =2
1
1
2
1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
62
F1:=1; F1
WRITE F1;
F2 := 1; F2
WRITE F2;
FOR I:=1 TO 18 I
F3 := F1+F2;
WRITE F3; F3
F1:=F2;
F2:=F3;
END_FOR; F1:=1; F1
WRITE F1;
F2 := 1; F2
WRITE F2;
FOR I:=1 TO 18 I
F3 := F1+F2;
WRITE F3; F3
F1:=F2;
F2:=F3;
END_FOR;
2
1
2
1
2
2
2
1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
63
F1:=1; F1
WRITE F1;
F2 := 1; F2
WRITE F2;
FOR I:=1 TO 18 I
F3 := F1+F2;
WRITE F3; F3
F1:=F2;
F2:=F3;
END_FOR;
F1:=1; F1
WRITE F1;
F2 := 1; F2
WRITE F2;
FOR I:=1 TO 18 I
F3 := F1+F2;
WRITE F3; ได Fibonacci ตัวที่ 4 คือ 3 F3
F1:=F2;
F2:=F3;
END_FOR;
ทําเชนนี้จนครบ I > 18 จะได Fibonacci 20 ตัว
2
2
1+2 =3
1
1
2
2
1+2 =3
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
64
ขั้นตอนที่ 3 เขียนเปนคําสั่งได ดังนี้
MOV F1,1
WRITE F1
MOV F2,1
WRITE F2
FORI: MOV I,1
LOOPI: CMP I,18
JG ENDLOOPI
MOV F3,F1
ADD F3,F2
WRITE F3
MOV F1,F2
MOV F2,F3
ADD I,1
JMP LOOPI
ENDLOOPI:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
65
ค. เขียนโปรแกรม เพื่อหาคําตอบของสมการ
X + 3Y +9Z = 126 X≥0, Y≥0, Z≥0
คําตอบ มีหลายวิธี ในที่นี้เปนเพียงคําตอบหนึ่งเทานั้น
ขั้นตอนที่ 1 ใหคิดกอน ดังนี้ X Y Z X+3Y+9Z
0 0 0 0 ≠ 126
0 0 1 9 ≠ 126
0 0 2 18 ≠ 126
…
0 0 14 126 = 126 เปนคําตอบหนึ่ง
0 1 0 3 ≠ 126
0 1 1 12 ≠ 126
0 1 2 21 ≠ 126
…
0 1 14 129 ≠ 126
0 2 0 6 ≠ 126
0 2 1 15 ≠ 126
…
0 2 14 132 ≠ 126
…
0 42 0 126 = 126 เปนคําตอบหนึ่ง …
0 42 14 252 ≠ 126
…
126 0 0 126 = 126 เปนคําตอบหนึ่ง …
126 42 14 378 ≠ 126
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
66
ขั้นตอนที่ 2 เขียนรหัสเทียมได ดังนี้ FOR X:=0 TO 126
FOR Y:=0 TO 42
FOR Z:=0 TO 14
IF (X + 3Y +9Z = 126)
THEN WRITE (X,Y,Z);
END_IF;
END_FOR;
END_FOR;
END_FOR;
ขั้นตอนที่ 3 เขียนเปนคําสั่งได ดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
67
FORX: MOV X,0
LOOPX: CMP X,126
JG ENDLOOPX
FORY: MOV Y,0
LOOPY: CMP Y,42
JG ENDLOOPY
FORZ: MOV Z,0
$LOOPZ:CMP Z,14
JG ENDLOOPZ
MOV SUM,X
MOV T,Y
MUL T,3
ADD SUM,T
MOV T,Z
MUL T,9
ADD SUM,T ; IF (X+3Y+9Z = 126 )
CMP SUM,126
JNE $ENDIF
WRITE X ; THEN WRITE (X,Y,Z);
WRITE Y
WRITE Z
$ENDIF:
ADD Z,1
JMP $LOOPZ
ENDLOOPZ:
ADD Y,1
JMP LOOPY
ENDLOOPY:
ADD X,1
JMP LOOPX
ENDLOOPX:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
68
3. จากคําสั่งแบบ one-address instruction จงเขียน คําสั่ง เพื่อคํานวณ ((A*(B+C))-D)/E)
คําตอบ LOAD B ; AC:=B
ADD C ; AC:=B+C
MUL A ; AC:=A*(B+C)
SUB D ; AC:=(A*(B+C)-D)
DIV E ; AC:=((A*(B+C))-D)/E)
4. ใชคําส่ังแบบ zero-address instructions เพื่อหาคาของ assignment statement ตอไปนี้
A := (B*C)+((A/D)-C)
ไมอนุญาตใหใชคําส่ัง ADD,SUB,MUL และ DIV มากกวา 1 ครั้ง และจํานวนคําส่ังทั้งหมดตองไมเกิน 10 คําส่ัง
คําตอบ
PUSH B
PUSH C
MUL
PUSH A
PUSH D
DIV
PUSH C
SUB
ADD
POP A
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
69
2.2 เปรียบเทียบรูปแบบคําสั่งภาษาเครื่อง สําหรับสถาปตยกรรมแบบ RISC กับ CISC ซีพียูแตละตัวจะมีชุดคําส่ังและรูปแบบที่แตกตางกันออกไป ซีพียูที่มีสถาปตยกรรมแบบ RISC (Reduce
Instruction Set Computer) จะมีจํานวนเรจิสเตอรอเนกประสงคคอนขางมาก, มีขนาดของคําส่ังเทากัน, และการคํานวณจะกระทําระหวาง เรจิสเตอรเปนสวนใหญ เพราะจะเร็วกวาการคํานวณระหวางเรจิสเตอรกับหนวยความจํา การติดตอกับหนวยความจํา มีเพียงคําส่ังบรรจุ (load instruction) เพื่อนําขอมูลจากหนวยความจําเขามายังเรจิสเตอรในซีพียู และคําส่ังเก็บ (store instruction) เพื่อนําขอมูลในเรจิสเตอรไปเก็บในหนวยความจํา เทานั้น ไมมีคําส่ังที่คํานวณระหวางขอมูลในเรจิสเตอรกับในหนวยความจํา บางครั้งจึงเรียกสถาปตยกรรมแบบนี้วา ”บรรจุ-เก็บ” ตางกับสถาปตยกรรมแบบ CISC (Complex Instruction Set Computer) ซึ่งมีคําส่ังที่ใชคํานวณระหวางขอมูลในเรจิสเตอรกับในหนวยความจํา ทําใหมีวิธีการอางถึงตําแหนงในหนวยความจําไดหลายรูปแบบ
สถาปตยกรรมแบบ RISC มองวาคอมไพเลอรสวนใหญผลิตคําส่ังภาษาเครื่องไมกี่รูปแบบ และเชื่อถือความสามารถของคอมไพเลอร ในการทําคําส่ังภาษาเครื่องใหไดผลดีที่สุด (optimization) สวนสถาปตยกรรมแบบ CISC คิดถึงการประหยัดเนื้อที่ และความสามารถของคําส่ังแตละคําส่ัง หนึ่งคําส่ังของสถาปตยกรรมแบบ CISC อาจทํางานไดเทียบเทากับหลายๆ คําส่ังของสถาปตยกรรมแบบ RISC ขอโตเถียงจึงมีวา การทํางานโดยใชคําสั่งจํานวนมาก แตละคําส่ังทํางานนอยแตเร็ว กับใชคําส่ังจํานวนนอย แตละคําส่ังทํางานไดมากกวา แตใชเวลามากกวา อันไหนจะเร็วกวากัน ยังไมมีคําตอบที่ชัดเจน แตแนวโนมของสถาปตยกรรมแบบ RISC เริ่มมีมากขึ้น • ตัวอยาง สถาปตยกรรมแบบ CISC เชน Intel 80x86
สถาปตยกรรมแบบ RISC เชน SPARC, MIPS, PowerPC, PA_RISC
• รูปแบบ คําสั่งของสถาปตยกรรม Intel 80x86 (IA-32 instruction set encoding)
1 or 2 bytes 1 byte 1 byte Address Immediate
(if required) (if required) displacement data
of 1, 2, or 4 of 1, 2, or 4
bytes or none bytes or none
7 6 5 3 2 0 7 6 5 3 2 0
Opcode ModR/M SIB displacement immediate
Mod Reg/opcode R/M Scale Index Base
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
70
นอกจากนี้ในคําสั่งยังอาจมี field ยอย ๆ ซึ่งมีความหมาย ดังนี้
• reg เปนเรจิสเตอรอเนกประสงค ใชจํานวนบิต 3 บิต เพื่อกําหนดเรจิสเตอรดังนี้
สําหรับการดําเนินการแบบ 16-bit สําหรับการดําเนินการแบบ 32-bit
reg เมื่อ w = 0 เมื่อ w = 1 reg เมื่อ w = 0 เมื่อ w = 1
000 AL AX 000 AL EAX
001 CL CX 001 CL ECX
010 DL DX 010 DL EDX
011 BL BX 011 BL EBX
100 AH SP 100 AH ESP
101 CH BP 101 CH EBP
110 DH SI 110 DH ESI
111 BH DI 111 BH EDI
• w
w สําหรับการดําเนินการแบบ 16-bit สําหรับการดําเนินการแบบ 32-bit
0 8-bits 8-bits
1 16-bits 32-bits
• s (sign extend(s) bit)
s มีผลกับ 8-bit immediate data มีผลกับ 16-bit หรือ 32-bit immediate data
0 ไมมี ไมมี
1 sign-extend to fill 16-bit or 32-bit ไมมี
• sreg2 or sreg3 (segment register )
2-bit segment register 3-bit segment register
00 ES 000 ES
01 CS 001 CS
10 SS 010 SS
11 DS 011 DS
100 FS
101 GS
110 reserved
111 reserved
• eee (special-purpose register)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
71
eee control register debug register
000 CR0 DR0
001 reserved DR1
010 CR2 DR2
011 CR3 DR3
100 CR4 reserved
101 reserved reserved
110 reserved DR6
111 reserved DR7
• tttn (condition test field)
tttn mnemonic condition
0000 O Overflow
0001 NO No Overflow
0010 B, NAE Below, Not above or equal
0011 NB, AE Not below, Above or equal
0100 E, Z Equal, Zero
0101 NE, NZ Not equal, Not zero
0110 BE, NA Below or equal, Not above
0111 NBE, A Not below or equal, Above
1000 S Sign
1001 NS Not sign
1010 P, PE Parity, Parity Even
1011 NP, PO Not parity, Parity Odd
1100 L, NGE Less than, Not greater than or equal to
1101 NL, GE Not less than, Greater than or equal to
1110 LE, NG Less than or equal to, Not greater than
1111 NLE, G Not less than or equal to, Greater than
• d (direction bit)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
72
d source destination
0 reg field ModR/M or SIB Byte
1 ModR/M or SIB Byte reg field
คําสั่งของสถาปตยกรรม Intel 80x86 มีขนาดไมคงที่ โดยมีขนาดตั้งแต 1 ถึง 6 ไบต และอาจมีตัวถูก
ดําเนินการ ต้ังแต 0 ถึง 2 ตัว โดยที่ตัวดําเนินการสองตัวจะเปนตําแหนงของหนวยความจําทั้งคูไมได
• รูปแบบ คําสั่งของสถาปตยกรรม SPARC
load/store memory at [Rs1]+[Rs2]
(Op=11) 31 29 24 18 13 12 4 0
load/store memory at [Rs1]+const
(Op=11) 31 29 24 18 13 12 0
register-register
(Op=10) 31 29 24 18 13 12 4 0
register-immediate
(Op=10) 31 29 24 18 13 12 0
branch
(Op=00) 31 29 24 18 0
jump/call
(Op=01) 31 29 0
เมื่อ Op = the main opcode Opx = an opcode extension
Rd = the destination regidter Rs1 = source register 1 Rs2 = source register 2
const = a constant (used as and immediate or as an address)
Op Rd Opx Rs1 0 Opx Rs2
Op Rd Opx Rs1 1 const
Op Opx const
Op const
Op Rd Opx Rs1 0 Opx Rs2
Op Rd Opx Rs1 1 const
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
73
คําสั่งของสถาปตยกรรม SPARC มีขนาดคงที่ คือ 4 ไบต มีตัวถูกดําเนินการ 1 ถึง 3 ตัว ตัวถูกดําเนินการที่
เปนการอางถึงตําแหนงในหนวยความจํา มีในคําสั่ง load (ldub, ldsb, lduh, ldsh, ld, ldd) และ store (stb, sth, st,
std, swap) สวนคําสั่งอื่น ๆ จะเปนตัวถูกดําเนินการแบบ immediate หรือ register
3. SPARC ARCHITECTURE ในที่นี้จะกลาวถึง SPARC V8 และจะกลาวถึงเฉพาะบางสวนเทานั้น รายละเอียดอื่น ๆ ทั้งหมดใหดูในคูมือ
ของบริษัท SUN
3.1 SPARC Data Formats ขอมูลที่จะนํามาประมวลผลกับสถาปตยกรรม SPARC มีสามแบบ
- Signed Integer – 8, 16, 32 และ 64 บิต เก็บแบบ two’s complement
- Unsigned Integer – 8, 16, 32 และ 64 บิต
- Floating-Point – 32, 64 และ 128 บิต เก็บตามมาตรฐาน ANSI/IEEE Standard 754-1985
ขนาดของขอมูลเรียก ดังนี้ - Byte – 8 บิต
- Halfword – 16 บิต
- Word/Singlerord – 32 บิต
- Tagged Word – 32 บิต (30 บิต บวกกับ 2 tag บิต)
- Doubleword – 64 บิต
- Quadword – 128 บิต
รูปแบบขอมูลมี ดังนี้ 7 6 0
Signed Integer Byte S
15 14 0
Signed Integer Halfword S
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
74
31 30 0
Signed Integer Word S
Signed Integer Double
31 30 0
SD-0 S signed integer [62:32]
31 30 0
SD-1 S signed integer [31:0]
7 0
Unsigned Integer Byte
15 0
Unsigned Integer Halfword
31 0
Unsigned Integer Word
Unsigned Integer Double
31 0
UD-0 signed integer [63:32]
31 0
UD-1 signed integer [31:0]
31 30 23 22 0
Floating-point Single S exp[7:0] mantissa [22:0]
(single-precision)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
75
Floating-point Double
(double-precision) 31 30 20 19 0
FD-0 S exp[10:0] mantissa [51:32]
31 0
FD-1 mantissa [31:0]
Floating-point Quad (extended-precision)
31 30 16 15 0
FQ-0 S exp[14:0] mantissa [51:32]
31 0
FQ-1 mantissa [95:64]
31 0
FQ-2 mantissa [63:32]
31 0
FQ-3 mantissa [31:0]
3.2 SPARC Registers ซีพียู SPARC ประกอบดวย integer unit (IU), floating-point unit (FPU) และ coprocessor (CP) ซึ่งจะมี
หรือไมก็ได ซีพียู SPARC มีเรจิสเตอรสองประเภท คือ general-purpose หรือ “working” data registers และ control/status registers
• general-purpose registers ใน IU เรียก r register มี 32 ตัว แตละตัวมีขนาด 32 บิต (V9 มีขนาด 64
บิต) เรจิสเตอรเหลานี้อาจแบงออกเปนสี่กลุม คือ global, in, local และ out
- global registers ใชสําหรับ global data เพื่อเก็บขอมูลที่สามารถเรียกใชไดจากทุก ๆ ฟงกชัน
- in registers บรรจุอากิวเมนตของการเรียกใชฟงกชัน
- local registers ใชสําหรับเก็บตัวแปรทองถิ่นของฟงกชัน
- out registers ใชสําหรับเปนที่เก็บช่ัวคราว ผานอากิวเมนตไปยังฟงกชัน และเก็บคาสงกลับของฟงกชัน
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
76
ในภาษาแอสเซมบลี เราสามารถอางถึงเรจิสเตอรเหลานี้ ดังนี้ %g0-%g7, %l0-%l7, %o0-%o7 และ %i0-%i7 หรือ
%r0-%r31 เรจสิเตอรตาง ๆ ใชเพื่อจุดประสงคตาง ๆ ดังนี้ register synonyms usage %g0 %r0 always discards writes and returns zero
%g1 %r1 first of seven registers for data with global context
%g2 %r2
%g3 %r3
%g4 %r4
%g5 %r5
%g6 %r6
%g7 %r7
%o0 %r8 first of six registers for local data and arguments to called subroutines
%o1 %r9
%o2 %r10
%o3 %r11
%o4 %r12
%o5 %r13
%sp %r14 %o6 stack pointer
%o7 %r15 called subroutine return address
%l0 %r16 first of eight registers for local variables
%l1 %r17
%l2 %r18
%i3 %r19
%l4 %r20
%l5 %r21
%l6 %r22
%l7 %r23
%i0 %r24 first of six registers for incoming subroutine arguments
%i1 %r25
%i2 %r26
%i3 %r27
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
77
%i4 %r28
%i5 %r29
%fp %r30 %i6 frame pointer
%i7 %r31 subroutine return address
• general-purpose registers ใน FPU เรียก f register มี 32 ตัว แตละตัวมีขนาด 32 บิต มีช่ือเรียกใน
ภาษาแอสเซมบลีวา %f0-%f31
• IU control/status register ประกอบดวย - Processor State Register (PSR) มีขนาด 32 บิต ดังนี้
31 28 27 24 23 20 19 14 13 12 11 8 7 6 5 4 0
impl ver icc reserved EC EF PIL S PS ET CWP
ในที่นี้ จะกลาวถึง เฉพาะ icc ซึ่งมีขนาด 4 บิต ดังนี้ 23 22 21 20
n z v c
เมื่อ n เปน 1 ถาผลลัพธจากการคํานวณ เปน ลบ และเปน 0 ถาผลลัพธเปนบวก
z เปน 1 ถาผลลัพธจากการคํานวณ เปน ศูนย และเปน 0 ถาผลลัพธไมเปนศูนย
v เปน 1 ถาผลลัพธoverflow และเปน 0 ถาผลลัพธไม overflor
c เปน 1 ถาการคํานวณมีการยืมหรือทด มิฉะนั้นเปน 0
- Window Invalid Mask (WIM) มีขนาด 32 บิต ใชเพื่อกําหนด register window วา overflow หรือไม
- Trap Base Register (TBR) ใชเพื่อกําหนดตําแหนงที่จะกระโดดไป เมื่อเกิด trap
- Multiply/Divide Register (Y) ใชเก็บ most significant word of double-precision ของผลลัพธ
สําหรับคําสั่งคูณ และ ใชเก็บ most significant word of double-precision ของตัวต้ัง สําหรับคําสั่ง
หาร เรจิสเตอร Y สามารถอานและเขียนไดดวยคําสั่ง RDY และ WRY ตามลําดับ (หมายเหตุ V9 ไมได
ใช Y อีกแลว)
- Program Counters (PC and nPC) PC เก็บตําแหนงของคําสั่งที่กําลัง execute และ nPC เก็บ
ตําแหนงของคําสั่งถัดไปที่จะ execute ถาไมเกิด trap
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
78
- Implementation-dependent Ancillary State Register (ASRs)
- Implementation-dependent IU Deferred-Trap Queue
• FPU control/status register ประกอบดวย - Floating-Point Status Register (FSR) มีขนาด 32 บิต ดังนี้ 31 30 27 23 16 14 11 10 4 0
RD TEM ftt fcc cexc
เมื่อ RD Round Toward
0 Nearest number (even, if equally close)
1 0
2 +∞
3 -∞
fcc Relation
0 fs1 = fs2
1 fs1 < fs2
2 fs1 > fs2
3 fs1 ? fs2, unordered
cexe Condition
0x10 Invalid operation such as ∞ - ∞ or 0 / 0
0x08 Floating overflow
0x04 Floating underflow, number not zero and too small to represent as a normalized
0x02 Division by zero
0x01 Result inexact
- Implementation-dependent Floating-Point Deferred-Trap Queue (FQ)
• Coprocessor (CP) control/status register ถามี ประกอบดวย - Implementation-dependent Coprocessor State Register (CSR)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
79
- Implementation-dependent Coprocessor Deferred-Trap Queue (CQ)
3.3 คําสั่ง
3.3.1 Load/Store Instructions Mnemonic Operation ldsb Load signed byte, propagate sign left in register
ldub Load unsigned byte, clear high 24 bits of register
ldsh Load signed halfword, propagate sign left in register
lduh Load unsigned halfword, clear high 16 bits of register
ld Load word
ldd Load double, register number even, first four bytes into register n, next four
into register n+1
stb Store low byte of register, bits 0-7 into memory
sth Store low two bytes of register, bits 0-15 into memory
st Store register
std Store double, register number even, first four bytes from register n, next four
from register n+1
3.3.2 Arithmetic instructions Mnemonic Operation add perform integer addition
addcc perform integer addition, set condition codes
addx perform extended precision integer addition
addxcc perform extended precision integer addition, set condition codes
taddcc perform tagged integer addition, set condition codes
taddcctv perform tagged integer addition, trap if either source operands’ low-order
two bits are not zero
sub perform integer two’s complement subtraction
subcc perform integer subtraction and set condition codes
subx perform extended precision integer subtraction
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
80
subxcc perform extended precision integer subtraction, set condition codes
tsubcc perform tagged integer subtraction, set condition codes
tsubcctv perform tagged integer subtraction, trap if either source operands’ low-order
two bits are not zero
mulscc perform one step of a multiply algorithm
3.3.3 Logical and shift Instructions Mnemonic Operation and perform bit-wise and operation
andcc perform bit-wise and operation, set conditions
andn perform bit-wise and operation with complement pf op2
andncc perform bit-wise and operation with complement of op2, set condition codes
or perform bit-wise or operation
orcc perform bit-wise or operation, set conditions
orn perform bit-wise or operation with complement pf op2
orncc perform bit-wise or operation with complement of op2, set condition codes
xor perform bit-wise xor operation
xorcc perform bit-wise xor operation, set conditions
xnor perform bit-wise xor operation with complement pf op2
xnorcc perform bit-wise xor operation with complement of op2, set condition codes
sll perform logical left-shift
srl perform logical right shift
sra perform logical right arithmetic
3.3.4 Control instructions Mnemonic Operation ba branch always
bn nranch never
be branch on equal
bne brance on not equal
bl branch on less
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
81
ble branch on less or equal
bge branch on greayher or equal
bg branch on greater than
blu branch on less, unsigned
bleu branch on less than or equal, unsigned
bgeu branch on greater than or equal, unsigned
bgu branch on greater than, unsigned
bpos branch on positive
bneq branch on negative
bcs branch on C set
bcc branch on C clear
bvs branch on signed overflow
bvc branch on no signed overflow
call function call
jmpl unconditional, register-indirect control transfer
rett return from trap and a register-indirect control transfer
3.3.5 Floating-point instructions Mnemonic Operation ldf load floating-point register with word from memory
lddf load two floating-point registers with a doubleword from memory
stf store floating-point register into memory
stdf store two floating-point registers into memory
fitos convert from integer to single precision floating-point
fitod convert from integer to double-precision floating-point
fitoq convert from integer to extended-precision floating-point
fstoi convert from single-precision floating-point to integer and round
fdtoi convert from double-precision floating-point to integer and round
fqtoi convert from extended-precision floating-point to integer and round
fstod convert from single-precision floating-point to double-precision floating-point
fstoq convert from single-precision floating-point to extended-precision floating-point
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
82
fdtoq convert from double-precision floating-point to extended-precision floating-point
fdtos convert from double-precision floating-point to single-precision floating-point and round
fqtod convert from extended-precision floating-point to double-precision floating-point and
round
fqtos convert from extended-precision floating-point to single-precision floating-point and
round
fmovs move a word from f[rs2] to f[rd]
fnegs negate a word from f[rs2] to f[rd]
fabss copy absolute value from f[rs2] to f[rd]
fadds single-precision floating-point add
faddd double-precision floating-point add
faddq extended-precision floating-point add
fsubs single-precision floating-point subtraction
fsubd double-precision floating-point subtract
fsubq extended-precision floating-point subtract
fmuls single-precision floating-point multiply
fmuld double-precision floating-point multiply
fmulq extended-precision floating-point multiply
fsmuld single-precision to double-precision floating-point multiply
fdivs single-precision floating-point division
fdivd double-precision floating-point division
fdivq extended-precision floating-point division
fsqrts single-precision square root
fsqrtd double-precision square root
fsqrtq extended-precision square root
fcmps single-precision compare, set floating condition codes
fcmpd double-precision compare, set floating condition codes
fcmpq extended-precision compare, set floating condition codes
fcmpes single-precision compare, set floating condition codes, exception if unordered
fcmped double-precision compare, set floating condition codes, exception if unordered
fcmpeq extended-precision compare, set floating condition codes, exception if unordered
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
83
fba floating branch always
fbn floating branch never
fbu branch on unordered
fbo floating branch on ordered
fbe floating branch on equal
fbue floating branch on unordered or equal
fbne floating branch on not equal
fblg floating branch on less or equal
fbl floating branch on less
fbul branch on unordered or less
fble floating branch on less or equal
fbule floating branch on unordered, less or equal
fbge branch on greater than or equal
fbuge floating branch on unordered, greater or equal
fbg floating branch on greater
fbug floating branch on unordered or greater
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
84
4. Intel Architecture (IA) ในที่นี้จะกลาวถึงเฉพาะบางสวนเทานั้น รายละเอียดอื่น ๆ ทั้งหมด ใหดูในคูมือของบริษัท Intel
ตารางแสดงขนาดของ bus และ หนวยความจํา
Year micro processor data bus width address bus width memory size
1978 8086 16 20 1M
1979 8088 8 20 1M
1982 80286 16 24 16M
1985 80386SX 16 24 16M
80386DX 32 32 4G
1989 80486 32 32 4G
1993 Pentium 64 32 4G
1995 P6 Family (micro-architecture)
Pentium Pro 64 36 64G
(+MMX) -> Pentium II, Pentium II Xeon, Celeron,
(+MMX+Streaming SIMD Extension (SSE)) -> Pentium III, Pentium III Xeon
2000 Pentium 4 (NetBurst micro-architecture, Extend MMX , SSE2, [+Hyper-Threading])
Xeon
Pentium M
หมายเหตุ 8086 ถึง 80386SX ไมมี math coprocessor ตองซื้อ 8087, 80287 หรือ 80387 สวน 80386DX, 80486,
/Pentium, Pentium Pro มี math coprocessor หรือ floating point unit ดวย
protected mode เริ่มมีต้ังแต 80286 แตซีพียูที่มี data bus และ address bus ขนาด 32 บิต ซึ่งสามารถ
อาง memory address ไดถึง 4G ไดแก 80386DX (นิยมเรียกวา Intel386 หรือ 80386) เปนตนไป เปน processor ที่
อยูในตระกูลของ IA-32 (Intel Architecture 32) Processor
Modes of Operation
IA-32 processor จะมี 3 mode คือ protected mode, real-address mode และ system management
mode สวน virtual-8086 mode เปน mode พิเศษของ protected mode
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
85
Memory Management
ก. Real-address Mode เมื่อเริ่มตนเปดเครื่อง จะอยูใน mode นี้ เพื่อใหมองเหมือนกับ 8086/8088 เดิม ซึ่งใช address bus 20 บิต
ดังนั้นจึงสามารถอางถึง memory address ไดตั้งแต (00000)16 ถึง (FFFFF)16 ซึ่งมีขนาด 1M ตําแหนงของ
หนวยความจําใช segment ขนาด 16 บิต และ offset ขนาด 16 บิต และมีวิธีการคํานวณเพื่อใหได 20 บิต ดังนี้
memory address (20 บิต) = segment *16 + offset
หมายเหตุ การคูณดวย 16 เทากับ เปนการเติม 0 ดานขวามือจํานวน 4 บิต หรือเทากับเลข 0 ฐานสิบหกหนึ่งตัว
เชน segment = (901F)16 และ offset = (0100)16 จะได memory address = (901F0)16 + (0100)16 = (902F0)16
ข. Protected Mode ใน mode นี้ ใช address bus ขนาด 32 บิต สามารถอางไดถึง 4GB ตั้งแต address (00000000)16 ถึง
(FFFFFFFF)16 ใน mode นี้ อาจมอง memory แบบ flat segmentation model หรือ มองแบบ multi-segment
model
หมายเหตุ สําหรับ protected mode สามารถกําหนดให บิตที่ 17 ของ EFLAGS ซึ่งเรียกวา VM (Virtual Mode) ให
มีคาเปน 1 เพื่อใหเปน virtual-8086 mode ทําใหเสมือนหนึ่งมีหนวยความจํา 1M ไดหลาย ๆ สวน จึงสามารถวิ่ง
DOS มากกวาหนึ่งตัวบน Window ไดพรอม ๆ กัน
The boot process
เมื่อเริ่มเปดเครื่อง จะอยูใน real-address mode และเกิดขบวนการ "cold boot" ดังนี้ ซีพียูเขาสูสถานะ
reset จากนั้นเริ่มลางหนวยความจําใหมีคาเปน 0 ตรวจสอบความถูกตองของหนวยความจํา (parity check) แลว
กําหนดให เรจิสเตอร CS มีคาเทากับ (FFFF)16 และเรจิสเตอร IP มีคาเทากับ 0 ซึ่งเปนตําแหนงของคําส่ังแรกที่จะ
กระทําการ ตําแหนงนี้จะอยูใน ROM BIOS จากนั้น BIOS จะตรวจสอบอุปกรณตาง ๆ และ initialize อุปกรณที่ติดตั้ง
เหลานั้น จากนั้นจะสราง ตาราง BIOS interrupt service ที่บริเวณ interrupt vector และ BIOS data เริ่มตั้งแต
ตําแหนง 400H จากนั้นไปตรวจสอบวาจานแมเหล็กมีระบบปฏิบัติการ (Operating System) หรือไม ถามีจะอาน
ขอมูลใน boot sector เขามายังหนวยความจํา ขอมูลดังกลาว คือ bootstrap loader ซึ่งทําหนาที่บรรจุ
ระบบปฏิบัติการ สําหรับ DOS ประกอบดวยแฟมขอมูล 3 แฟม คือ IBMBIO.COM (หรือ IO.SYS), IBMDOS.COM
(หรือ MSDOS.SYS), และ COMMAND.COM จะถูกบรรจุลงหนวยความจํา จากนั้นระบบปฏิบัติการ DOS จะอาน
config.sys เพื่อติดตั้ง driver เพิ่ม และอานแฟม autoexec.bat และปฏิบัติตามคําส่ังในนั้น จากนั้นขึ้น prompt เพื่อ
รอรับคําส่ัง สําหรับระบบปฏิบัติการอื่น ๆ ก็ทําในลักษณะคลาย ๆ กัน สําหรับ WINDOWS จะเปลี่ยนจาก real-
address mode เปน protected mode
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
86
4.1 Data Formats ขอมูลที่จะนํามาประมวลผล มีสามแบบ
- Signed Integer – 8, 16, 32 และ 64 บิต เก็บแบบ two’s complement
- Unsigned Integer – 8, 16, 32 และ 64 บิต
- Floating-Point – 32, 64 และ 80 บิต เก็บตามมาตรฐาน ANSI/IEEE Standard 754-1985
ขนาดของขอมูลเรียก ดังนี้ - Byte – 8 บิต
- Word – 16 บิต
- Double Word – 32 บิต
- Quadword – 64 บิต
รูปแบบขอมูลมี ดังนี้ 7 6 0
Signed Integer Byte S
15 14 0
Signed Integer Word S
31 30 0
Signed Integer Doubleword S
63 62 0
Signed Integer Quadword S
7 0
Unsigned Integer Byte
15 0
Unsigned Integer Word
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
87
31 0
Unsigned Integer Doubleword
63 0
Unsigned Integer Quadword
packed decimal S d17 d16 d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0
79 72 71 0
short real S biased exponent significand (mantissa)
31 23 1. 0
long real S biased exponent significand (mantissa)
63 52 1. 0
temporary real S biased exponent significand (mantissa)
79 64 63 0
หมายเหตุ การเก็บขอมูลเปนแบบ little endian เชน
1234H เก็บแบบ word 12345678H เก็บแบบ doubleword
memory address value memory address value
0000 0001 12 0000 0011 12 (MSB)
0000 0000 34 0000 0010 34
0000 0001 56
0000 0000 78 (LSB)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
88
4.2 REGISTERS 8086/8088 16-bit names 8-bit names
15 8 7 0 15 0
AX AH AL Accumulator CS Code Segment
BX BH BL Base DS Data Segment
CX CH CL Count SS Stack Segment
DX DH DL Data ES Extra Segment
15 0
BP Base Pointer
SP Stack Pointer
SI Source Index
DI Destination Index
15 0
IP Instruction pointer
FLAGS Flags
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
89
IA-32 registers 32-bit names 16-bit names 8-bit names
31 15 8 7 0 15 0
EAX AX AH AL Accumulator CS Code Segment
EBX BX BH BL Base DS Data Segment
ECX CX CH CL Count SS Stack Segment
EDX DX DH DL Data ES Extra Segment
31 15 0 FS
EBP BP Base Pointer GS
ESP SP Stack Pointer
ESI SI Source Index
EDI DI Destination Index
31 15 0
EIP IP Instruction pointer
EFLAGS FLAGS Flags
เมื่อ EFLAGS คือ
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
ID VIP VIF AC VM RF
- CF (Carry Flag)
- PF (Parity Flag)
- AF (Auxiliary carry Flag)
- ZF (Zero Flag)
- SF (Sign Flag)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
90
- TF (Trap Flag)
- IF (Interrupt Flag)
- DF (Direction Flag)
- OF (Overflow Flag)
- IOPL (I/O Privilege Level)
- NT (Nested Task Flag)
- RF (Resume Flag)
- VM (Virtual-8086 Mode)
- AC (Alignment Check)
- VIF (Virtual Interrupt Flag)
- VIP (Virtual Interrupt Pending)
- ID (Identification Flag)
เรจิสเตอรอื่น ๆ Control Registers CR(0-3) Paging, caching, and protection (386+)
Debug Registers DR(0-7) Data and instruction breakpoints (386+)
Test Registers TR(3-7) Testing the TLB and cache (386+)
Global Descriptor GDTR Address and limit of GDT (286+)
Local Descriptor LDTR Address, limit, and selector of
LDT (286+)
Interrupt Descriptor IDTR Address and limit of IDT (286+)
Task Register TR Address, limit, selector, and attributes of current task
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
91
Floating-Point Register Stack DATA FIELD TAG FIELD
79 78 64 63 0 1 0
sign exponent significant (mantissa)
ST(0)
ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
15 0
control register
status register
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
92
Control Register
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
IC RC PC IEM PMUM OM ZM DM IM
invalid operation
denormalized operand
zero divide
overflow
underflow
precision
reserved
interrupt enable mask (1)
precision control (2)
rounding control (3)
infinity control (4)
reserved
(1) Interrupt-Enable Mask
0 = Interrupts Enabled
1 = Interrupt Disabled (masked)
(2) Precision Control
00 = 24 bits
01 = (reserved)
10 = 53 bits
11 = 64 bits
(3) Rounding Control
00 = Round to Nearest or Even
01 = Round Down (toward -∞)
10 = Round Up (toward +∞)
11 = Chop (Truncate Toward Zero)
(4) Infinity Control
0 = Projective (∞) 1 = Affine (+∞,-∞)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
93
Status Register
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
B C3 ST C2 C1C0 IR PE UE OE ZE DE IE
invalid operation
denormalized operand
zero divide
overflow
underflow
precision
reserved
interrupt request
condition code (1)
stack top pointer (2)
busy
(1) See descriptions of compare, test, examine and remainder instruction
(2) ST values:
000 = register 0 is stack top
001 = register 1 is stack top
…
111 = register 7 is stack top
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
94
4.3 เทคนิคการอางอิงขอมูล สถาปตยกรรม Intel 80x86 มี memory addressing mode เพื่ออางถึงเลขที่อยูของหนวยความจําไดหลาย
รูปแบบ ในที่นี้จะพูดถึงเฉพาะ การอางอิงขอมูลในหนวยความจําแบบ 32-bit memory addressing modes
4.3.1 displacement-only or direct addressing modes มีรูปแบบ ดังนี้ VarName+/-constant หรือ VarName[+/-constant] หรือ [VarName+/-constant]
ตําแหนงของหนวยความจํา (effective address) คือ คา (32 บิต) จะอยูที่ตําแหนงซึ่งกําหนดดวยตัวแปร
(VarName) บวกหรือลบกับคาคงที่ (constant) (ถามี) เชน .data
mydata DD 15 mydata eax
DD 20 mydata+4 ebx
.code
mov eax,mydata หรือ move ax,[mydata]
mov ebx,mydata+4 ; หรือ เหมือนกับ mov ebx,mydata[4] หรือ mov ebx,[mydata+4]
4.3.2 register indirect addressing modes มีรูปแบบ ดังนี้ [eax+/-constant]
[ebx+/-constant]
[ecx+/-constant]
[edx+/-constant]
[edi+/-constant]
[esi+/-constant]
[ebp+/-constant]
[esp+/-constant]
ตําแหนงของหนวยความจํา (effective address) คือ คา (32 บิต) จะอยูที่ตําแหนงซึ่งกําหนดดวยคาในเรจิ
สเตอรที่กําหนดบวกหรือลบกับคาคงที่ (ถามี) เชน
15
20
15
20
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
95
lea ebx,mydata
mov eax,[ebx] ebx
eax
mydata 4.3.3 indexed addressing modes มีรูปแบบ ดังนี้ VarName+/-constant[eax+/-constant]
VarName+/-constant[ebx+/-constant]
VarName+/-constant[ecx+/-constant]
VarName+/-constant[edx+/-constant]
VarName+/-constant[edi+/-constant]
VarName+/-constant[esi+/-constant]
VarName+/-constant[ebp+/-constant]
VarName+/-constant[esp+/-constant]
ตําแหนงของหนวยความจํา (effective address) คือ คา (32 บิต) จะอยูที่ตําแหนงซึ่งกําหนดดวย VarName
บวกหรือลบกับคาคงที่ (ถามี) บวกกับคาในเรจิสเตอรที่กําหนด บวกหรือลบกับคาคงที่ (ถามี) เชน
mov ebx,8 ebx eax
mov eax,mydata[ebx]
mydata+8
mydata
8
+
15
15
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
96
4.3.4 scaled indexed addressing modes มีรูปแบบ ดังนี้ VarName+/-constant[IndexReg32*scale]
VarName+/-constant[IndexReg32*scale +/- constant ]
[ BaseReg32 + IndexReg32*scale ]
[ BaseReg32 + IndexReg32*scale +/- constant ]
VarName+/-constant[ BaseReg32 + IndexReg32*scale ]
VarName+/-constant[ BaseReg32 + IndexReg32*scale +/- constant ]
เมื่อ BaseReg32 อาจเปน EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP
IndexReg32 อาจเปน EAX, EBX, ECX, EDX, ESI, EDI, EBP (ยกเวน ESP)
scale อาจเปน 1, 2, 4 หรือ 8
ตําแหนงของหนวยความจํา (effective address) คือ คา (32 บิต) จะอยูที่ตําแหนงซึ่งกําหนดดวย
VarName+/-constant (ถามี) บวกคาใน BaseReg32 (ถามี) บวกกับคาใน IndexReg32 (ถามี) คูณกับ scale (ถามี)
และบวกหรือลบกับคาคงที่ (ถามี) เชน
eax
mov eax,mydata[ebx+esi*4+4]
4
esi +
* 4+
ebx
+
mydata
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
97
4.4 Data Transfer Instructions
mnemonic assembler format flags
VM RF NT PLI OF DF IF TF SF ZF AF PF CF General Purpose
mov mov destination,source - - - - - - - - - - - - -
movzx mov destination,source - - - - - - - - - - - - -
movsx mov destination,source - - - - - - - - - - - - -
xchg xchg destination,source - - - - - - - - - - - - -
push push source - - - - - - - - - - - - -
pop pop destination - - - - - - - - - - - - -
pushfd pushfd - - - - - - - - - - - - -
popfd popfd * * * * * * * * * * * * * Address Transfer lea lea reg,mem - - - - - - - - - - - - - Flag Transfer lahf lahf - - - - - - - - - - - - -
sahf sahf - - - - - - - - * * * * *
Note! * means changed and – means unchanged
4.4.1 General Purpose MOV : Move Data
mov reg,imm
mov reg,reg
mov reg,mem
mov mem,imm
mov mem,reg
หมายเหตุ - destination จะเปน immediate operand ไมได เชน mov 5,ax ผิด
- operand ทั้งคูเปนหนวยความจําไมได เชน mov X,Y ผิด แต mov X,eax ถูก (เมื่อ X เก็บขอมูลขนาด 32 บิต)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
98
มีขอกําหนด ดังนี้ ก. ขนาดของขอมูลตองเทากัน เชน mov eax,bl ผิด แต mov eax,ebx ถูก
ข. ไมสามารถก็อปปขอมูลคาคงที่ (immediate operand ไปยัง segment register) เชน mov ds,100 ผิด ให
ใช mov ax,100 และ mov ds,ax แทน
ค. destination เปน CS, EIP และ IP ไมได เชน mov cs,ax ผิด
ตัวอยาง mov ax,bx
mov bl,cl
mov esi,eax
mov eax,mydata
mov ax,mydata+4
mov cl,[ebx]
mov al,5
mov ax,5
mov eax,5
mov mydata[ebx],5
mov mydata[ebx+esi*4+4,5
MOVZX : Move with zero-extend movzx r32,r/m8
movzx r32,r/m16
movzx r16,r/m8
ต.ย. mov al,5 ; al = 00000101
movzx eax,al ; eax = 00000000 00000000 00000000 00000101
MOVSX : Move with sign-extend movsx r32,r/m8
movsx r32,r/m16
movsx r16,r/m8
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
99
ต.ย. mov al,-5 ; al = 11111011
movzx eax,al ; eax = 11111111 11111111 11111111 11111011
XCHG : Exchange xchg reg,reg
xchg reg,mem
xchg mem,reg
ตัวอยาง xchg ax,bx
xchg al,bh
xchg tempw,dx
xchg dl,tempb
xchg eax,ebx
PUSH : Push onto Stack push r/m16
push r/m32
push imm32
ถา push คา 16 (หรือ 32) บิต จะลบ ESP ดวย 2 (หรือ 4) แลว mov คาแบบ little endian ไปยัง stack
ตัวอยาง push esi
push counter
push table[eax+4]
push 5
POP : Pop from the Stack pop r/m16
pop r/m32
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
100
ถา pop คา 16 (หรือ 32) บิต จะ mov คาแบบ little endian จาก stack ไปยัง r/m แลวบวก ESP ดวย 2
(หรือ 4)
ตัวอยาง pop table[ebp+8]
pop counter
pop eax
PUSHFD : Push EFLAGS register on the stack pushfd
หมายเหตุ read-address mode ใช pushf สําหรับ push FLAGS register
POPFD : Pop the stack into EFLAGS register popfd
หมายเหตุ read-address mode ใช popf สําหรับ pop FLAGS register
ตัวอยาง การดําเนินการกับขอมูลใน stack กอน push
ESP = 1008
1007
1006
1005
1004
1003
push eax ; eax = 11111111000000001010101011110000
1008
1007 11111111
1006 00000000
1005 10101010
ESP = 1004 11110000
1003
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
101
pop ebx ; ebx = 11111111000000001010101011110000
ESP = 1008
1007 11111111
1006 00000000 แมจะมีคาคางอยูแตไมถือวาเปนขอมูลใน stack
1005 10101010
1004 11110000
1003 4.4.2 Address Transfer LEA : Load effective address lea reg,mem
การทํางาน จะนํา memory address ที่กําหนดตรง mem ใสใน reg
ตัวอยาง lea eax,mydata
ความแตกตางระหวาง mov กับ lea มีดังนี้
สมมุติวา ตัวแปร X อยูที่ memory address 1000 และเก็บคา 15 คําสั่ง mov eax,X จะไดวา eax มีคาเทากับ 15
แต lea eax,X จะไดวา X มีคาเทากับ 1000
4.4.3 Flag Transfer LAHF : Load Flags into AH Register lahf SAHF : Store AH into Flags sahf
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
102
4.5 Arithmetic instructions 4.5.1 Processing unsigned and signed data
ตัวอยาง a) no carry or overflow unsigned signed binary decimal decimal OF CF 11111001 249 -7
+ 00000010 2 +2
11111011 251 -5 0 0
b) arithmetic carry unsigned signed binary decimal decimal OF CF 11111100 252 -4
+ 00000101 5 +5
(1)00000001 1 +1 0 1
(invalid) (valid)
c) overflow unsigned signed binary decimal decimal OF CF 01111001 121 +121
+ 00001011 11 +11
10000100 132 -124 1 0
(valid) (invalid)
d) carry and overflow unsigned signed binary decimal decimal OF CF 11110110 246 -10
+ 10001001 137 -119
(1)01111111 127 +127 1 1
(invalid) (invalid)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
103
4.5.2 Data in decimal format
มีสองรูปแบบ
• Unpacked BCD หรือ ASCII
• Packed BCD
เชน 1,527 Format Contents Length
ASCII 31h 35h 32h 37 h 4 bytes
Unpacked BCD 01h 05h 02h 07h 4 bytes
Packed BCD 15h 27h 2 bytes
หมายเหตุ - สําหรับ ASCII และ unpacked BCD ดูคําสั่ง AAA สําหรับการบวก และ AAS สําหรับการลบ
- สําหรับ unpacked BCD ดูคําสั่ง AAM สําหรับการคูณ และ AAD สําหรับการหาร
- สําหรับ packed BCD ดูคําสั่ง DAA สําหรับการบวก และ DAS สําหรับการลบ
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
104
Arithmetic Instructions
mnemonic assembler format flags
VM RF NT PLI OF DF IF TF SF ZF AF PF CF Addition
add add destination,source - - - - * - - - * * * * *
adc adc destination,source - - - - * - - - * * * * *
aaa aaa - - - - ? - - - ? ? * ? *
daa daa - - - - ? - - - * * * * *
inc inc destination - - - - * - - - * * * * -
Subtraction sub sub destination,source - - - - * - - - * * * * *
sbb sbb destination,source - - - - * - - - * * * * *
aas aas - - - - ? - - - ? ? * ? *
das das - - - - ? - - - * * * * *
dec dec destination - - - - * - - - * * * * -
neg neg destination - - - - * - - - * * * * *
cmp cmp destination,source - - - - * - - - * * * * *
Multiplication mul mul source - - - - * - - - ? ? ? ? *
imul imul source - - - - * - - - ? ? ? ? *
aam aam - - - - ? - - - * * ? * ?
Division div div source - - - - ? - - - ? ? ? ? ?
idiv idiv source - - - - ? - - - ? ? ? ? ?
aad aad - - - - ? - - - * * ? * ?
Sign-Extension cbw cbw - - - - - - - - - - - - -
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
105
cwd cwd - - - - - - - - - - - - -
cdq cdq - - - - - - - - - - - - -
Note! * means changed, – means unchanged, and ? means undefined
4.5.3 Addition ADD : Add Binary Numbers
add destination,source หมายเหตุ มีขอกําหนดตาง ๆ เหมือนคําสั่ง mov
มีผลกับคา flags ดังนี้
- CF มีคา 0 ถาผลลัพธไมมีการทดคา มีคา 1 ถาผลลัพธมีการทดคา
- PF มีคา 0 ถาผลลัพธมีจํานวนบิตที่มีคา 1 เปนคี่ มีคา 1 ถาผลลัพธมีจํานวนบิตที่มีคา 1 เปนคู
- AF มีคา 0 ถาผลการบวกเลขฐานสิบไมตองปรับคา (พิจารณาเฉพาะการทดคาจากบิต 3 ไป 4 ของ AL)
มีคา 1 ถาผลการบวกเลขฐานสิบตองปรับคา (พิจารณาเฉพาะการทดคาจากบิต 3 ไป 4 ของ AL)
- ZF มีคา 0 ถาผลลัพธไมใช 0 มีคา 1 ถาผลลัพธเปน 0
- SF มีคา 0 ถาผลลัพธมีคาบวก มีคา 1 ถาผลลัพธมีคาลบ
- OF มีคา 1 ถาเปนการบวกเลขที่ sign bit เหมือนกัน แตใหผลลัพธที่มี sign bit เปลี่ยนไป มิฉะนั้นจะมีคาเปน 0
ตัวอยาง พิจารณาการบวกเลขฐาน 2 ตอไปน้ี
; AL = 01110011 = 115 decimal BL = 00010010 = 18 decimal
add al,bl ; al เก็บผลลัพธ = 10000101 , bl unchanged
;CF = 0, AF = 0, ZF = 0, SF = 1, OF = 1, PF = 0
sign bit ; unsigned addition valid signed addition invalid
bit 7654 3210
AL 0111 0011 operands have the same sign (i.e. 0)
BL 0001 0010 sign bit changed (from 0 to 1) OF = 1
AL 1000 0101 # of 1 is odd PF = 0, bit 7 is 1 so SF =1, result ≠ 0 so ZF = 0
0 0
CF AF
คําสั่ง ADD จะบวกเลขฐาน 2 ดังกลาวขางตนเสมอ ทานผูซึ่งเปนคนเขียนโปรแกรมตองตีความเองวา ทาน
กําลังบวกเลขที่มีเครื่องหมายหรือไมมีเครื่องหมาย ถาทานบวกเลขที่มีเครื่องหมาย ทานจะตรวจสอบวาผลลัพธ overflow ไดโดยตรวจสอบจาก OF = 1 ได เชน ตัวอยางขางตน (+115) + (+18) = +133 ซึ่งมีคาเกิน +127 ซึ่งถาดู
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
106
จากผลลัพธแลว 1000 0101 มีคาเทากับ –123 ซึง่ไมถูกตอง แตถาทานบวกเลขที่ไมมีเครื่องหมาย ทานจะตรวจสอบวา
ผลลัพธ overflow ไดโดยตรวจสอบจาก OF = 1 ไมได เพราะถาดูจากตัวอยางขางตน 115 + 18 = 133 ซึ่งมีคาไมเกิน
255 ซึ่งถาดูจากผลลัพธแลว 1000 0101 มีคาเทากับ 133 ซึ่งถูกตอง การตรวจสอบวาการบวกเลขที่ไมมีเครื่องหมาย
เกิด overflow หรือไมใหดูที่ CF = 1 หรือไม เชน
; AL = 11111111 , unsigned = 255 decimal, signed = -1
; BL = 00000001 , unsigned = 1 decimal , signed = +1 decimal
add al,bl ; al เก็บผลลัพธ = 00000000 , bl unchanged
;CF = 1, AF = 1, ZF = 1, SF = 0, OF = 0, PF = 1
; unsigned addition invalid signed addition valid
sign bit
bit 7654 3210
AL 1111 1111 operands have the different sign OF = 0
BL 0000 0001
AL 0000 0000 # of 1 is even PF = 1, bit 7 is 0 so SF =0, result = 0 so ZF = 1
1 1
CF AF
ADC : Add with Carry adc destination,source
หมายเหตุ เหมือน ADD แตบวก carry flag(CF) ดวย คือ destination = destination + carry + source
ตัวอยาง add eax,ecx
adc ebx,edx
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
107
ADC EBX,EDX ADD EAX,ECX
CF
EBX EAX
EDX ECX
EBX EAX AAA : ASCII Adjust for Addition
สมมุติวาเราตองการบวกตัวเลข ASCII 8 (38H) และ 4 (34H)
0011 1000 (ASCII 38H)
+ (ใชคําสั่ง ADD)
0011 0100 (ASCII 34H)
0110 1100 (6CH)
จะเห็นไดวาผลลัพธที่ไดไมเปนไปตามที่เราคาดหวัง เราคาดหวังวาจะได ASCII 1 (31H) ASCII 2 (32H)
หรือ 12 (3132H) คําสั่ง AAA และ OR (จะกลาวในบทถัดไป) จะชวยเราในเรื่องนี้
คําสั่ง AAA ไมมี operand ใชเพื่อปรับคาในเรจิสเตอร AX หรือ EAX เทานั้น โดยการพิจารณาคา 4 บิตลาง
ของ AL ถามีคาระหวาง 0-9 ก็จะทําให 4 บิตบนของ AL มีคาเปน 0 และกําหนดให AF กับ CF มีคาเปน 0 แตถา 4 บิต
ลางของ AL มีคามากกวา 9 หรือ AF มีคา 1 จะมีวิธีการปรับคา ดังนี้
- บวก 6 กับเรจิสเตอร AL เลข 6 มาจาก 16 (hexadecimal) – 10 (decimal)
- บวก 1 กับเรจิสเตอร AH
- กําหนดให AF = 1 และ CF = 1
- 4 บิตบนของเรจิสเตอร AL มีคา 0
หมายเหตุ ถาตองการเก็บตัวทดใน AH กอนใชคําสั่ง AAA ทํา AH ใหเปน 0 แลวใชคําสั่งบวกที่มี AL เปน destination
กอน
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
108
ตัวอยาง ก.
; AH = 0 AL = 34H (ASCII 4)
; BL = 38H (ASCII 8)
MOV AX,0034H ; AH = 0, AL = 34H
MOV BL,38H
ADD AL,BL ; add 34H with 38H, AX equals 006CH
AAA ; เนื่องจาก 4 บิตลางของ AL มีคามากกวา 9 บวก 6 กับ AL บวก 1 กับ AH
; กําหนดให CF = 1 และ AF = 1 แลวทําให 4 บิตบนของ AL มีคาเทากับ 0
; ผลสุดทาย AX = 0102H
ข. ; AL = 39H (ASCII 9)
MOV AX,0039H ; AH = 0, AL = 39H
ADD AL,AL ; add 39H with 39H, AX equals 0072H, AF = 1
AAA ; เนื่อง AF = 1 แมคาจาก 4 บิตลางของ AL มีคานอยกวา 9 บวก 6 กับ AL
; บวก 1 กับ AH
; กําหนดให CF = 1 และ AF = 1 แลวทําให 4 บิตบนของ AL มีคาเทากับ 0
; ผลสุดทาย AX = 0108H
จะเห็นไดวาทั้งสองตัวอยางขางตน ยังไมไดคา 3132H หรือ 3138H ตามที่เราตองการ จะตองใชคําสั่ง
OR AX,3030H จึงจะไดคาตามที่ตองการ ดังนั้นช่ือของ AAA (ASCII Adjust for Addition) ที่ใช อาจจะทําให
เขาใจผิดไดงาย จริง ๆ แลวคําสั่ง AAA เปนแคการปรับคาของการบวก Unpacked BCD เทานั้น นาจะมีช่ือเปน Unpacked BCD Adjust for Addition
สรุปแลว AAA ใชไดทั้งการปรับคาของการบวก ASCII และ Unpacked BCD แตถาเปนการบวกของ
ASCII และตองการใหผลลัพธเก็บอยูในรูป ASCII ตองใชคําสั่ง OR AX,3030H เพิ่มอีกคําสั่งหนึ่ง
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
109
DAA : Decimal Adjust for Addition
ใชสําหรับปรับคาของการบวก packed BCD วิธีการปรับคาของคําสั่ง DAA ทําดังนี้
- ถา 4 บิตลางของเรจิสเตอร AL มีคามากกวา 9 หรือ AF = 1 จะบวกคา 6 กับเรจิสเตอร AL และ
กําหนดให AF = 1
- ถา 4 บิตบนของเรจิสเตอร AL มีคามากกวา 9 หรือ CF = 1 จะบวกคา 60h กับเรจิสเตอร AL
และกําหนดให CF = 1
ตัวอยาง
ก. ผลลัพธเก็บใน AL พอ
; AL = 0101 1001 = 59 BCD
; BL = 0011 0101 = 35 BCD
ADD AL,BL ; AL =1000 1110 = 8EH incorrect
DAA ; AL = 1001 0100 = 94 BCD
AL 0101 1001 59H
BL 0011 0101 35H
ADD AL,BL
AL 1000 1110 8EH
CF = 0 AF = 0
DAA
AL 1000 1110
0000 0110 6H because AH > 9 add 6 to AL and set AF = 1
AL 1001 0100 94H
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
110
ข. ผลลัพธเก็บใน AL ไมพอ (หลังจากทําคําสั่ง DAA ดู CF =1)
; AL = 1000 1000 = 88 BCD
; BL = 0100 1001 = 49 BCD
MOV AX,88H
MOV BL,49H
ADD AL,BL ; AL =1101 0001 , AF = 1
DAA ; add 0110 because AF = 1
; AL = 1101 0111 = D7H
; 1101 > 9 add 0110 0000
; CF = 1 and AL = 0011 0111 = 37
ADC AH,0 ; AX = 0000 0001 0011 0111 = 0137 BCD INC : Increment by 1 inc destination
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
111
4.5.4 Subtraction SUB : Subtract Binary Numbers sub destination,source
มีผลกับคา flags ดังนี้
- CF มีคา 0 ถาผลลัพธไมมีการขอยืมคา
มีคา 1 ถาผลลัพธมีการขอยืมคา
- PF มีคา 0 ถาผลลัพธมีจํานวนบิตที่มีคา 1 เปนคี่
มีคา 1 ถาผลลัพธมีจํานวนบิตที่มีคา 1 เปนคู
- AF มีคา 0 ถาผลการบวกเลขฐานสิบไมตองปรับคา (พิจารณาเฉพาะการยืมคาจากบิต 4 ของ AL)
มีคา 1 ถาผลการบวกเลขฐานสิบตองปรับคา (พิจารณาเฉพาะการยืมคาจากบิต 4 ของ AL)
- ZF มีคา 0 ถาผลลัพธไมใช 0
มีคา 1 ถาผลลัพธเปน 0
- SF มีคา 0 ถาผลลัพธมีคาบวก
มีคา 1 ถาผลลัพธมีคาลบ
- OF มีคา 1 ถาการลบเลขที่มีเครื่องหมายตางกันใหผลลัพธที่ใหญหรือเล็กกวาที่จะเก็บได เชน ลบเลขขนาด 8 บิต
ไดผลลัพธนอยกวา –128 หรือมากกวา 127 เปนตน
ตัวอยาง ; AL = 01110011 = signed +115 decimal = unsigned 115 decimal
; BL = 11101110 = signed -18 decimal = unsigned 238 decimal
sub al,bl ; al เก็บผลลัพธ = 10000101 , bl unchanged
;CF = 1, AF = 1, ZF = 0, SF = 1, OF = 1, PF = 0
sign bit ; unsigned subtraction invalid signed subtraction invalid
bit 7654 3210
AL 0111 0011 operands have the different sign
BL 1110 1110 for signed result can not fit so OF = 1
AL 1000 0101 # of 1 is odd PF = 0, bit 7 is 1 so SF =1, result ≠ 0 so ZF = 0
1 1
CF AF
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
112
คําสั่ง SUB ก็เหมือนกับคําสั่ง ADD จะลบเลขฐาน 2 ดังกลาวขางตนเสมอ ทานผูซึ่งเปนคนเขียนโปรแกรมตอง
ตีความเองวา ทานกําลังลบเลขที่มีเครื่องหมายหรือไมมีเครื่องหมาย ถาทานลบเลขที่มีเครื่องหมาย ทานจะตรวจสอบวาผลลัพธ overflow ไดโดยตรวจสอบจาก OF = 1 ได เชน ตัวอยางขางตน (+115) - (-18) = +133 ซึ่งมีคาเกิน +127
ซึ่งถาดูจากผลลัพธแลว 1000 0101 มีคาเทากับ –123 ซึ่งไมถูกตอง แตถาทานลบเลขที่ไมมีเครื่องหมาย ทานจะ
ตรวจสอบวาผลลัพธ overflow ไดโดยตรวจสอบจาก OF = 1 ไมได เพราะถาดูจากตัวอยางขางตน 115 - 238 = -123
ซึ่งไมถูกตอง (เพราะผลลัพธ 1000 0101 = 133) การตรวจสอบวาการลบเลขที่ไมมีเครื่องหมายใหผลลัพธที่ถูกตอง
หรือไมใหดูที่ CF = 1 หรือไม SBB : Subtract with Borrow sbb destination,source
หมายเหตุ เหมือน SUB แตรวม carry flag(CF) ดวย คือ destination = destination – carry - source
ตัวอยาง sub eax,ecx
sbb ebx,edx
SBB EBX,EDX SUB EAX,ECX
EBX
CF EAX
ECX
EDX
EBX EAX
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
113
AAS : ASCII Adjust for Subtraction
ใชสําหรับการปรับคาการลบเลข ASCII หรือ Unpacked BCD เหมือนกับที่มีการปรับคาของคําสั่ง AAA
คําสั่ง AAS จะปรับคา โดยการพิจารณาคา 4 บิตลางของ AL ถามีคาระหวาง 0-9 ก็จะทําให 4 บิตบนของ AL
มีคาเปน 0 และกําหนดให AF กับ CF มีคาเปน 0 แตถา 4 บิตลางของ AL มีคามากกวา 9 หรือ AF มีคา 1 จะมีวิธีการ
ปรับคา ดังนี้ - ลบ 6 จากเรจิสเตอร AL
- ลบ 1 จากเรจิสเตอร AH
- AF = 1 และ CF = 1
- 4 บิตบนของเรจิสเตอร AL มีคา 0
ตัวอยาง ก.
; AL = 0011 0111 = 37H ASCII 7
; BL = 0011 0100 = 34H ASCII 4
MOV AL,37H
MOV BL,34H
SUB AL,BL ; (7-4)
AAS ; CL = 0000 0011 = unpacked BCD 03
ข.
; AL = 0011 0100 = 34H ASCII 4
; CL = 0011 0111 = 37H ASCII 7
MOV AL,34H
MOV CL,37H
SUB AL,CL ; (4-7) = borrow 1 and result 14 – 7 = 7
; AL = 1111 1101, AF = 1, CF = 1
AAS ; AL = 0000 0111 = unpacked BCD 07
; CF = 1 borrow needed
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
114
DAS : Decimal Adjust for Subtraction
ใชสําหรับการปรับคาการลบเลข packed BCD เหมือนกับที่มีการปรับคาของคําสั่ง DAA
คําสั่ง DAS มีวิธีการปรับคา ดังนี้
- ถา 4 บิตลางของเรจิสเตอร AL มีคามากกวา 9 หรือ AF = 1 จะลบคา 6 จากเรจิสเตอร AL และ
กําหนดให AF = 1
- ถา 4 บิตบนของเรจิสเตอร AL มีคามากกวา 9 หรือ CF = 1 จะลบคา 60h จากเรจิสเตอร AL
และกําหนดให CF = 1
ตัวอยาง ก.
; AL = 1000 0110 = 86 packed BCD
; BH = 0101 0111 = 57 packed BCD
SUB AL,BH ; AL =0010 1111 = 2FH
DAS ; subtract 0000 0110
; because 1111 in low nibbles > 9
; AL = 0010 1001 = 29 packed BCD
ข.
; AL = 0100 0101 = 45 packed BCD
; BH = 0110 0011 = 63 packed BCD
SUB AL,BH ; AL = 1110 0010, CF = 1
DAS ; subtract 0110 0000
; because 1010 in upper nibbles > 9
; AL = 1000 0010 = 82 packed BCD, CF = 1
; CF = 1 means borrow was needed
DEC : Decrement by 1 dec destination
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
115
NEG : Negate neg destination
มีผลกับคา flags ดังนี้
- CF มีคา 0 ถาผลลัพธเปนบวก
มีคา 1 ถาผลลัพธเปนลบ
- PF มีคา 0 ถาผลลัพธมีจํานวนบิตที่มีคา 1 เปนคี่
มีคา 1 ถาผลลัพธมีจํานวนบิตที่มีคา 1 เปนคู
- AF มีคา 0 ถาผลการบวกเลขฐานสิบไมตองปรับคา
มีคา 1 ถาผลการบวกเลขฐานสิบตองปรับคา
- ZF มีคา 0 ถาผลลัพธไมใช 0
มีคา 1 ถาผลลัพธเปน 0
- SF มีคา 0 ถาผลลัพธมีคาบวก
มีคา 1 ถาผลลัพธมีคาลบ
- OF มีคา 1 ถาผลลัพธใหญหรือเล็กกวาที่จะเก็บได และมีคาเปน 0 ในกรณีอื่น CMP : Compare cmp destination,source
คําสั่ง CMP มีการทํางานคลายคําสั่ง SUB คือ CMP จะลบ source จาก destination แตไมไดเก็บคาผลลัพธ
ดังนั้นคาใน source และ destination จึงไมมีการเปลี่ยนแปลงจากการลบ ทําใหไดผลลับ flags ดังนี้ condition OF SF ZF CF Unsigned Operands source < destination x x 0 0
source = destination x x 1 0
source > destination x x 0 1 Signed Operands source < destination 0/1 0 0 x
source = destination 0 0 1 x
source > destination 0/1 1 0 x Note! x means don’t care 0 is clear 1 is set
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
116
4.5.5 Multiplication MUL : Unsigned Multiplication mul source
Multiplicand Multiplier
(operand1) (operand 2) Product Example
8-bit AL 8-bit register/memory AX MUL BL
16-bit AX 16-bit register/memory DX:AX MUL BX
32-bit EAX 32-bit register/memory EDX:EAX MUL EBX
หมายเหตุ ถาไม overflow แลว CF และ OF จะมีคาเปน 0 มิฉะนั้นจะมีคาเปน 1
การคูณขอมูลขนาด doubleword
EAX
EBX
ECX
EDX
EAX EDX EAX
*
ESI
EDI
EBP
ESP
doubleword memory
ตัวอยาง Z = X*Y เขียนไดเปน MOV EAX,X
MUL Y
MOV Z,EAX
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
117
การคูณขอมูลขนาด word
AX
BX
CX
DX
AX DX AX
*
SI
DI
BP
SP
word memory
ตัวอยาง Z = X*10 เขียนไดเปน MOV AX,X
MOV BX,10
MUL BX
MOV Z,AX
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
118
การคูณขอมูลขนาดไบต AH
AL
BH
BL
CH
CL
DH
DL
AL AH AL
*
byte memory
ตัวอยาง MOV AL,5
MOV BL,10
MUL BL ; 5 * 10 , AX = 50 IMUL : Signed (Integer) Multiplication
imul source หรือ imul destination,source หรือ imul product,op1,op2
เหมือน MUL แตเปนการคูณเลขจํานวนเต็มมีเครื่องหมาย ยกเวน กรณีที่มี operand 3 ตัว เชน
imul dx,wdata,0ffaah
imul edx,dwdata,12345678h
จะหมายถึง operand ตัวที่สองคูณกับ operand ตัวที่ 3 ผลลัพธเก็บที่ operand ตัวแรก และกรณีที่มี operand 2 ตัว
เชน imul cx,0cd12h
imul ecx,011112222h
จะหมายถึง operand ตัวแรก คูณกับ operand ตัวที่สอง ผลลัพธเก็บที่ operand ตัวแรก
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
119
AAM : ASCII Adjust for Multiplication
คําสั่ง AAM จะเปลี่ยนคาของผลลัพธของการคูณเลขขนาดไบต เปนคา unpacked BCD 2 คา เก็บใน AH
และ AL โดยที่ตัวต้ังและตัวคูณตองเปน unpacked BCD ดวย
ในการปรับคาผลลัพธ คําสั่ง AAM จะหารเรจิสเตอร AL ดวย 10 และเก็บคาสวนใน AH คาเศษใน AL เชน
สมมุติวา AL มีคา 9 (00001001B) และ BL มีคา 7 (0000111B) เมื่อใชคําสั่ง MUL BL ผลลัพธของการคูณ AL กับ
BL ไดผลลัพธ 00000000B เก็บใน AH และ 00111111B เก็บใน AL เมื่อใชคําสั่ง AAM เรจิสเตอร AL จะถูกหารดวย
10 แลวเก็บสวน คือ 00000110B ไวใน AH และเก็บเศษ คือ 00000011B ไวใน AL
ตัวอยาง ; AL = 00000101 = unpacked BCD 5
; BH = 00001001 = unpacked BCD 9
mul bh ;al * bh result in ax
;ax = 00000000 00101101 = 002dh
aam ;ax = 00000100 00000101
; = unpacked BCD 45 4.5.6 Division DIV : Unsigned Division div source
Dividend Divisor
(operand1) (operand 2) Quotient Remainder Example
16-bit AX 8-bit register/memory AL AH DIV BH
32-bit DX:AX 16-bit register/memory AX DX DIV CX
64-bit EDX:EAX 32-bit register/memory EAX EDX DIV ECX
กรณีที่ผลหาร (quotient) ไมสามารถเก็บไดพอใน AL, AX หรือ EAX จะเกิด divide by zero interrupt
การหารจะคลายกับการคูณ แตทํากลับกัน ดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
120
การหารขอมูลขนาด doubleword
EAX
EBX
ECX
EDX
EDX EAX EDX EAX
/
เศษ จํานวนเต็ม ESI
EDI
EBP
ESP
doubleword memory
ตัวอยาง Z = X/Y และ M = X%Y เมื่อ % หมายถึง modulo และ X,Y,Z,M เปนเลขจํานวนเต็มไมมีเครื่องหมาย ขนาด
32 บิต เขียนไดเปน MOV EAX,X
MOV EDX,0
DIV Y
MOV Z,EAX
MOV M,EDX
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
121
การหารขอมูลขนาด word
AX
BX
CX
DX
DX AX DX AX
/
เศษ จํานวนเต็ม SI
DI
BP
SP
word memory
ตัวอยาง Z = X/10 และ M = X%10 เมื่อ % หมายถึง modulo และ X,Z,M เปนเลขจํานวนเต็มไมมีเครื่องหมาย ขนาด
16 บิต เขียนไดเปน MOV AX,X
MOV DX,0
MOV BX,10
DIV BX
MOV Z,AX
MOV M,DX
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
122
การหารขอมูลขนาดไบต AH
AL
BH
BL
CH
CL
DH
DL
AX AH AL
/
เศษ จํานวนเต็ม byte memory
ตัวอยาง MOV AX,13
MOV BL,5
DIV BL ; 13 / 5 , AH = 3, AL = 2 IDIV : Signed (Integer) Division idiv source
เหมือน DIV แตเปนการคูณเลขจํานวนเต็มมีเครื่องหมาย
ตัวอยาง Dividend(AX) Divisor Quotient (AL) Remainder(AH)
7 2 3 1
7 -2 -3 1
-7 2 -3 -1
-7 -2 3 -1
หมายเหตุ เครื่องหมายของเศษ (remainder) จะเหมือนกับตัวต้ัง (dividend) เสมอ
สวนเครื่องหมายของผลลัพธเปนไปตามกฎที่วา บวกหารบวกหรือลบหารลบผลลัพธเปนบวก มิฉะนั้นเปนลบ
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
123
ตัวอยาง Z = X/Y และ M = X%Y เมื่อ % หมายถึง modulo และ X,Y,Z,M เปนเลขจํานวนเต็มมีเครื่องหมาย ขนาด 32
บิตเขียนไดเปน MOV EAX,X
CDQ
IDIV Y
MOV Z,EAX
MOV M,EDX
ตัวอยาง Z = X/10 และ M = X%10 เมื่อ % หมายถึง modulo และ X,Z,M เปนเลขจํานวนเต็มมีเครื่องหมายขนาด 16
บิต เขียนไดเปน MOV AX,X
CWD
MOV BX,10
IDIV BX
MOV Z,AX
MOV M,DX
ตัวอยาง Z = X/Y และ M = X%Y เมื่อ % หมายถึง modulo และ X,Y,Z,M เปนเลขจํานวนเต็มมีเครื่องหมายขนาด 8
บิต เขียนไดเปน MOV AL,X
CBW
IDIV Y
MOV Z,AL
MOV M,AH
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
124
AAD : ASCII Adjust for Division
คําสั่ง AAD จะปรับคาของตัวต้ังในการหารใหเปนเลขฐานสอง ในเรจิสเตอร AL ซึ่งทําการโดยการคูณ
สวนบนของตัวต้ังหรือคาในเรจิสเตอร AH ดวย 10 และบวกผลลัพธกับสวนลางของตัวต้ังหรือคาในเรจิสเตอร AL
และจะทําใหคาใน AH เปน 0 คําสั่ง AAD จะตองถูกเรียกใชกอนการหาร
ตัวอยาง ; AX = 0000 0011 0000 0111 unpacked BCD for 37 decimal
; CL = 0000 0101 unpacked BCD for 5 decimal
aad ; adjust to binary before division
; ax = 0025h = 37
div cl ; divide ax by cl
; al = quotient = 07 unpacked BCD
; ah = remainder = 02 unpacked BCD 4.5.7 Sign-Extension CBW : Convert Byte to Word
คําสั่ง CBW เปนคําสั่งที่ลอกคาของบิต 7 ในเรจิสเตอร AL ไปใสในเรจิสเตอร AH
7 0 7 0
AH AL
Note! CWDE : Convert Word to Doubleword เปนคําสั่งที่ลอกคาของบิต 15 ในเรจิสเตอร AX ไปใสในเรจิสเตอร EAX CWD : Convert Word to Doubleword
คําสั่ง CWD เปนคําสั่งที่ลอกคาของบิต 15 ในเรจิสเตอร AX ไปใสในเรจิสเตอร DX
15 0 15 0
DX AX CDQ : Convert Doubleword to Qword
คําสั่ง CDQ เปนคําสั่งที่ลอกคาของบิต 31 ในเรจิสเตอร EAX ไปใสในเรจิสเตอร EDX
31 0 31 0
EDX EAX
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
125
4.6 Logical, shift and rotate Instructions
mnemonic assembler format flags
VM RF NT PLI OF DF IF TF SF ZF AF PF CF LOGICAL
and and destination,source - - - - 0 - - - * * ? * 0
or or destination,source - - - - 0 - - - * * ? * 0
xor xor destination,source - - - - 0 - - - * * ? * 0
not not destination - - - - - - - - - - - - -
test test destination,source - - - - 0 - - - * * ? * 0
Shift sal/shl sal destination,count - - - - * - - - * * ? * *
sar sar destination,count - - - - * - - - * * ? * *
shr shr destination,count - - - - * - - - 0 * ? * *
Rotate rol rol destination,count - - - - * - - - - - - - *
ror ror destination,count - - - - * - - - - - - - *
rcl rcl destination,count - - - - * - - - - - - - *
rcr rcr destination,count - - - - * - - - - - - - *
Note! * means changed, – means unchanged, and ? means undefined
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
126
4.6.1 Logical AND : Logical AND and destination,source
ตัวอยาง and eax,ebx
and dwdata,eax
and ecx,0ffh
and [ebp+4],0ffffffh OR : Logical OR or destination,source
ตัวอยาง or eax,ebx
or ecx,0ffh XOR : Logical XOR xor destination,source
ตัวอยาง xor ax,bx
xor eax,0ffffffffh NOT : Logical NOT not destination
ตัวอยาง not eax
TEST : Test Bits test destination,source
เหมือนคําสั่ง and แต destination ไมเปลี่ยนคา
ตัวอยาง test eax,ebx
test dwdata,eax
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
127
4.6.2 Shift SAL/SHL : Shift Left sal destination,count SAR : Shift Arithmetic Right sar destination,count
SHR : Shift Right shr destination,count
สรุป CF
SAL/SHL 0
CF
SAR
CF
SHR 0
หมายเหตุ การทํา sal/shl หนึ่งบิต ของเลขจํานวนเต็มไมมีเครื่องหมาย จะไดผลลัพธ เหมือนผลลัพธของ การคูณดวย
สอง และการทํา sar หนึ่งบิต ของเลขจํานวนเต็มมีเครื่องหมาย จะไดผลลัพธ เหมือนผลลัพธของ การหารดวยสอง
สวนการทํา shr หนึ่งบิต ของเลขจํานวนเต็มมีไมเครื่องหมาย จะไดผลลัพธ เหมือนผลลัพธของ การหารดวยสอง
การคูณหรือหารดวยสองจึงควรใชวิธีนี้มากกวา เพราะทําไดเร็วกวาคําสั่งคูณหรือหาร
ตัวอยาง AL CF
SAL AL,1 AL: 01101000 CF : 1
SAR AL,1 AL: 11011010 CF: 0
SHL AL,1 AL: 01101000 CF : 1
SHR AL,1 AL: 01011010 CF: 0
1011 0100 1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
128
4.6.3 Rotate ROL: Rotate Left rol destination,count ROR: Rotate Right ror destination,count RCL: Rotate Left Through Carry rcl destination,count RCR: Rotate Right Through Carry rcr destination,count
สรุป CF
ROL
CF
ROR
CF
RCL
CF
RCR
ตัวอยาง AL CF
ROL AL,1 AL: 01101001 CF : 1
ROR AL,1 AL: 01011010 CF: 0
RCL AL,1 AL: 01101001 CF : 1
RCR AL,1 AL: 11011010 CF: 0
1011 0100 1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
129
4.7 Control instructions mnemonic assembler format flags
VM RF NT PLI OF DF IF TF SF ZF AF PF CF Unconditional Transfers
call call target - - - - - - - - - - - - -
ret ret [popvalue] - - - - - - - - - - - - -
jmp jmp target - - - - - - - - - - - - - Conditional Transfers ja/jnbe ja label - - - - - - - - - - - - -
jae/jnb jae label - - - - - - - - - - - - -
jb/jnae/jc jb label - - - - - - - - - - - - -
jcxz jcxz label - - - - - - - - - - - - -
je/jz je label - - - - - - - - - - - - -
jg/jnle jg label - - - - - - - - - - - - -
jge/jnl jge label - - - - - - - - - - - - -
jl/jnge jl label - - - - - - - - - - - - -
jle/jng jle label - - - - - - - - - - - - -
jnc jnc label - - - - - - - - - - - - -
jne/jnz jne label - - - - - - - - - - - - -
jno jno label - - - - - - - - - - - - -
jnp/jpo jnp label - - - - - - - - - - - - -
jns jns label - - - - - - - - - - - - -
jo jo label - - - - - - - - - - - - -
jp/jpe jp label - - - - - - - - - - - - -
js js label - - - - - - - - - - - - -
Note! – means unchanged
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
130
4.7.1 Unconditional Transfers CALL : Call a Procedure call target
การทํางาน จะ push address ของ คําสั่งถัดไป (ซึ่งเก็บใน EIP) ลง stack แลว jmp ไปบัง target
RET Return from a Procedure
ret หรือ ret value
การทํางาน จะ pop คาจาก stack ใสใน EIP ถามี value จะบวก ESP ดวย value
JMP : Unconditional Jump jmp target 4.7.2 Conditional Transfers Jcondition : Jump on Condition format encoding full displacement 0000 1111 1000 tttn full displacement mnemonic tttn checked used after comparison JA 0111 CF = 0, ZF = 0 Unsigned data, above (higher)
JAE 0011 CF = 0 Unsigned data, above/equal
JB 0010 CF = 1 Unsigned data, below (lower)
JBE 0110 CF = 1 or ZF = 1 Unsigned data, below/equal
JE 0100 ZF = 1 Signed/unsigned data, equal
JG 1111 ZF = 0, SF = OF Signed data, greater
JGE 1101 SF = OF Signed data, greater/equal
JL 1100 SF not = OF Signed data, lower
JLE 1110 ZF = 1 or SF not = OF Signed data, lower/equal
JNA 0110 CF = 1 or ZF = 1 Unsigned data, not above
JNAE 0010 CF = 1 Unsigned data, not above/equal
JNB 0011 CF = 0 Unsigned data, not below
JNBE 0111 CF = 0, ZF = 0 Unsigned data, not below/equal
JNE 0101 ZF = 0 Signed/unsigned, not equal
JNG 1110 ZF = 1 or SF not = OF Signed data, not greater
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
131
JNGE 1100 SF = not = OF Signed data, not greater/equal
JNL 1101 SF = OF Signed data, not lower
JNLE 1111 ZF = 0, SF = OF Signed data, not lower/equal
JC 0010 CF = 1 If CF set (same as JB/JNAE)
JNC 0011 CF = 0 If CF off (same as JAE/JNB)
JNO 0001 OF = 0 If OF off
JNP 1011 PF = 0 If odd parity
JNS 1001 SF = 0 If sign is positive
JNZ 0101 ZF = 0 If signed/unsigned data not zero
JO 0000 OF = 1 If OF set
JP 1010 PF = 1 If even parity
JPE 1010 PF = 1 Same as JP
JPO 1011 PF = 0 Same as JNP
JS 1000 SF = 1 If sign is negative
JZ 0100 ZF = 1 If signed/unsigned data is zero
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
132
String Instructions mnemonic assembler format flags
OF DF IF TF SF ZF AF PF CF Repeat Prefixes
rep rep - - - - - - - - -
repe/repz repe - - - - - - - - -
repne/repnz repne - - - - - - - - -
Move String movs movs destination,source - - - - - - - - -
movsb movsb - - - - - - - - -
movsw movsw - - - - - - - - -
Compare String cmps cmps destination,source * - - - * * * * *
cmpsb cmpsb * - - - * * * * *
cmpsw cmpsw * - - - * * * * *
Scan String scas scas destination * - - - * * * * *
scasb scasb * - - - * * * * *
scasw scasw * - - - * * * * *
Load and Store String lods lods source - - - - - - - - -
lodsb lodsb - - - - - - - - -
lodsw lodsw - - - - - - - - -
stos stos destination - - - - - - - - -
stosb stosb - - - - - - - - -
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
133
stosw stosw - - - - - - - - -
Note! – means unchanged, and * means changed
8.1 Repeat Prefixes REP : Repeat String
Operation. Repeats a string operation a specified number of times. REP is an operational repeat prefix
coded before the string instructions MOVS and STOS. Load the ECX with a count prior to execution. For
each execution of the string instruction, REP decrements ECX by 1 and repeats the operation until the
ECX is 0, at which point processing continues with the next instruction.
Source Code. REP string_instruction
Object Code. 11110010
REPE/REPZ/REPNE/REPNZ : Repeat String Conditionally
Operation. Repeats a string operation a specified number of times or until a condition is met. REPE,
REPZ, REPNE, and REPNZ are operational repeat prefix coded before the string instructions SCAS and
CMPS, which change the ZF. Load the ECX with a count prior to execution. For REPE/REPZ (repeat while
equal/zero), the operation repeats while the ZF is 1 (equal/zero condition) and ECX is not zero. For
REPNE/REPNZ (repeat while not equal/zero), the operation repeats while the ZF is 0 (unequal/nonzero
condition) and the ECX is not zero. While the conditions are true, the operation decrements the ECX by 1
and executes the string instruction.
Source Code. REPE/REPZ/REPNE/REPNZ string_instruction
Object Code. REPNE/REPNZ: 11110010
REPE/REPZ : 11110011
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
134
8.2 Move String MOVS/MOVSB/MOVSW : Move String
Operation. Moves data between memory locations. Normally used with the REP prefix and a length in the
ECX, MOVSB moves bytes, MOVSW moves word. The first operand is addressed by the ESI and the
second by the DSI. If the DF is 0, the operation moves data from left to right into the first operand’s
destination and increments the EDI and ESI by 1 or 2. If the DF is 1, the operation moves data from right
to left and decrements the EDI and ESI. REP decrements the ECX by 1 for each repetition. The operation
ends when the ECX is decremented to 0; the EDI and ESI are advanced past the last byte moved.
Source Code. [REP] MOVSB/MOVSW
Note! For the generalized form of MOVS, how do you specify whether an 8- or 16-bit transfer is to be
performed? This will depend on your assembler e.g. example movs byte or movs word.
Object Code. 1010010w 8.3 Compare String CMPS/CMPSB/CMPSW : Compare String
Operation. Compares strings of any length in memory. A REPnn prefix normally precedes these
instructions, along with a maximum value in the ECX. CMPSB compares byte, CMPSW compares words.
The EDI address the first operand and the ESI address the second. If the DF is 0, the operation
compares from left to right and increments the ESI and EDI by 1 for byte or 2 for word; if the DF is 1, it
compares from right to left and decrements the ESI and EDI. REPnn decrements the ECX by 1 for each
repetition. REPNE ends when the first match is found, REPE ends when the first nonmatch is found, or
both end when the ECX is decrements to 0; the EDI and ESI are advanced past the byte that caused
termination. The last compare sets/clears the flags.
Source Code. [REPnn] CMPSB/MOVSW
Object Code. 1010011w
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
135
8.4 Scan String SCAS/SCASB/SCASW : Scan String
Operation. Scans a string in memory for a specified value. For SCASB load the value in the AL, for
SCASW load it in the AX. The ESI references the string in memory that is to be scaned. The operations
are normally used with a REPE/REPNE prefix, along with a count in the ECX; use REPE to find the first
nonmatch and REPNE to find the first match. If the DF is 0, the operation scans memory from left to right
and increments the EDI. If the DF is 1, the operation scans memory from right to left and decrements the
EDI. REPnn decrements the ECX for each repetition. The operation ends on an equal (REPNE) or an
unequal (REPE) condition or when the ECX is decremented to 0. The last compare clears/sets the flags. If
the specified condition is not found, REP has decremented the ECX to 0; otherwise, the EDI and ESI
contain the address of the following item.
Source Code. [REPnn] SCASB/SCASW
Object Code. 1010111w 8.5 Load and Store String LODS/LODSB/LODSW : Load String
Operation. Loads the accumulator register with a value from memory. Although LODS is a string
operation, it does not require a REP prefix. The EDI registers address a byte (if LOADB), word(if LODSW)
and load if from memory into the AL, or AX respectively. If the DF is 0, the operation adds 1 (if byte), or 2
(if word) to ESI; otherwise it subtracts 1, or 2.
Source Code. LODSB/LODSW
Object Code. 1010110w
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
136
STOS/STOSB/STOSW : Store String
Operation. Stores the contents of the accumulator in memory. When used with a REP prefix along with a
count in the ECX, the operation duplicates a string value a specified number of times; this is suitable for
such actions as clearing an area of memory. For STOSB load the value in the AL, for STOSW load the
value in the AX. The EDI pair references a location in memory where the value is to be stored. If the DF is
0, the operation stores in memory from left to right and increments the EDI. If the DF is 1, the operation
stores from right to left and decrements the EDI. REP decrements the ECX for each repetition and ends
when it becomes 0.
Source Code. [REP] STOSB/STOSW
Object Code. 1010101w
ตัวอยาง Str_compare PROC USES eax edx esi edi
string1: DWORD,
string2: DWORD
mov esi,string1
move edi,string2
L1: mov al,[esi]
mov dl,[edi]
cmp al,0
jne L2
cmp dl,0
jne L2
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
137
jmp L3
L2: inc esi
inc edi
cmp al,dl
je L1
L3: ret
Str_compare ENDP
Str_length PROC USES edi,
pString: DWORD
mov edi,pString
mov eax,0
L1: cmp byte ptr [edi],0
je L2
inc edi
inc eax
jmp L1
L2: ret
Str_length ENDP
Str_copy PROC USES eax ecx esi edi
source:DWORD,
target:DWORD
invoke Str_length,source
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
138
mov ecx,eax
inc ecx
mov esi,source
mov edi,target
cld
rep movsb
ret
Str_copy ENDP 4.8 ตัวอยางการเขียนโปรแกรมโดยใชคําส่ังของ IA-32
จากแบบฝกหัดในหัวขอ 2.1 สามารถเขียนใหมดวยคําส่ังของ IA-32 ได ดังนี้
ก. เขียนโปรแกรม เพื่ออานเลขจํานวนเต็มบวก และพิมพคา Factorial ของเลขดังกลาว
เดิม ใหมใชคําส่ังของ IA-32
L1: READ X L1: ; ไมมีคําส่ัง READ จะกลาวถึงในภายหลัง
CMP X,1 CMP X,1
JL L1 JL L1
MOV FAC,1 MOv FAC,1
L2: CMP X,2 L2: CMP X,2
JL L3 JL L3
MUL FAC,X MOV EAX,FAC
IMUL X
MOV FAX,EAX
SUB X,1 DEC X
JMP L2 JMP L2
L3: WRITE FAC L3: ; ไมมีคําส่ัง WRITE จะกลาวถึงในภายหลัง
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
139
ข. เขียนโปรแกรม เพื่อพิมพเลข Fibonacci จํานวน 20 ตัวแรก เมื่อ เลข Fibonacci มีนิยาม ดังนี้ F1 := 1, F2:=1
Fi = Fi-1 + Fi-2 i = 3, 4, 5, . . .
เดิม ใหมใชคําส่ังของ IA-32
MOV F1,1 MOV F1,1
WRITE F1 ; ไมมีคําส่ัง WRITE จะกลาวถึงในภายหลัง
MOV F2,1 MOV F2,1
WRITE F2 ; ไมมีคําส่ัง WRITE จะกลาวถึงในภายหลัง
FORI: MOV I,1 FORI: MOV I,1
LOOPI: CMP I,18 LOOPI: CMP I,18
JG ENDLOOPI JG ENDLOOPI
MOV F3,F1 MOV EAX,F1
MOV F3,EAX
ADD F3,F2 MOV EAX,F2
ADD F3,EAX
WRITE F3 ; ไมมีคําส่ัง WRITE จะกลาวถึงในภายหลัง
MOV F1,F2 MOV EAX,F2
MOV F1,EAX
MOV F2,F3 MOV EAX,F3
MOV F2,EAX
ADD I,1 INC I
JMP LOOPI JMP LOOPI
ENDLOOPI: ENDLOOPI:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
140
ค. เขียนโปรแกรม เพื่อหาคําตอบของสมการ
X + 3Y +9Z = 126 X≥0, Y≥0, Z≥0
เดิม ใหมใชคําส่ังของ IA-32 FORX: MOV X,0 FORX: MOV X,0 LOOPX: CMP X,126 LOOPX: CMP X,126 JG ENDLOOPX JG ENDLOOPX FORY: MOV Y,0 FORY: MOV Y,0 LOOPY: CMP Y,42 LOOPY: CMP Y,42 JG ENDLOOPY JG ENDLOOPY FORZ: MOV Z,0 FORZ: MOV Z,0 LOOPZ: CMP Z,14 LOOPZ: CMP Z,14 JG ENDLOOPZ JG ENDLOOPZ MOV SUM,X MOV EAX,X MOV SUM,EAX MOV T,Y MOV EAX,Y MUL T,3 MOV EBX,3 IMUL EBX ADD SUM,T ADD SUM,EAX MOV T,Z MOV EAX,Z MUL T,9 MOV EBX,9 IMUL EBX ADD SUM,T ADD SUM,EAX CMP SUM,126 CMP SUM,126 JNE $ENDIF JNE $ENDIF WRITE X ; ไมมีคําสั่ง WRITE จะกลาวถึงในภายหลัง WRITE Y ; ไมมีคําสั่ง WRITE จะกลาวถึงในภายหลัง WRITE Z ; ไมมีคําสั่ง WRITE จะกลาวถึงในภายหลัง $ENDIF: $ENDIF:
ADD Z,1 INC Z JMP LOOPZ JMP LOOPZ ENDLOOPZ: ENDLOOPZ: ADD Y,1 INC Y JMP LOOPY JMP LOOPY ENDLOOPY: ENDLOOPY: ADD X,1 INC X JMP LOOPX JMP LOOPX ENDLOOPX: ENDLOOPX:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
141
5.1 ภาษาแอสเซมบลี ภาษาเครื่องเปนตัวเลขฐานสอง และมีรูปแบบคอนขางยุงยาก ไมเหมาะที่จะนํามาเขียนโปรแกรม จึงไดมีการพัฒนาภาษาสัญลักษณขึ้นมา เรียกวา ภาษาแอสเซมบลี เนื่องจากซีพียูไมสามารถดําเนินการโดยตรงกับภาษาสัญลักษณดังกลาวได จึงตองมีตัวแปล ซึ่งทําหนาที่แปลภาษาแอสเซมบลีเปนภาษาเครื่อง ตัวแปลดังกลาว เรียกวา แอสเซมเบลอร ภาษาแอสเซมบลีประกอบดวยคําสั่ง สองประเภท คือ
- pseudo instruction หรือ directive ใชเพื่อกําหนด ตําแหนง, ขนาด และ/หรือ คาของขอมูล หรือใชสั่ง
แอสเซมเบลอรเพื่อดําเนินการอยางใดอยางหนึ่ง แอสเซมเบลอรไมไดแปลคําสั่งเหลานี้เปนภาษาเครื่อง เชน
X dd 1234
Y db ‘hello’
คําสั่ง dd และ db เปน pseudo instruction โดยที่ X เปนตําแหนงของขอมูล ขนาด 4 ไบต มีคา 1234
และ Y เปนขอมูลจํานวน 5 ไบต มีคา hello
- machine instruction เปนคําสั่งภาษาเครื่อง แตเขียนในรูปของสัญลักษณ คือ แทนรหัสดําเนินการดวย
สัญลักษณ เรียกวา mnemonic และตัวดําเนินการ อาจเปน ช่ือของเรจิสเตอร, เปนคาคงที่ (immediate)
หรือ เปนช่ือของตําแหนงในหนวยความจํา คําสั่งเหลานี้ แอสเซมเบลอรจะแปลเปนภาษาเครื่อง เชน ADD EAX,5
MOV X,EAX
คําสั่งแรก มี ADD เปน mnemonic แทน รหัสดําเนินการบวก และมีตัวถูกดําเนินการสองตัว คือ EAX
ซึ่งเปนช่ือของเรจิสเตอร และ 5 เปนคาคงที่ หมายถึง นําคา 5 ใสในเรจิสเตอร EAX สวนคําสั่งที่สอง มี
MOV เปน mnemonic แทน รหัสดําเนินการเคลื่อนยาย และมีตัวถูกดําเนินการสองตัว คือ X เปน
ตําแหนงขอมูลในหนวยความจํา และ EAX หมายถึง ทําสําเนาคาในเรจิสเตอร EAX ใสใน
หนวยความจําที่ตําแหนง X
5.2 ASSEMBLERS แอสเซมเบลอรเปนโปรแกรมที่ทําหนาที่แปลภาษาแอสเซมบลีใหเปนโปรแกรมภาษาเครื่อง ขอมูลเขา คือ โปรแกรมภาษาแอสเซมบลี ขอมูลออก คือ โปรแกรมภาษาเครื่องและขาวสารสําหรับ linker เรียกวา object module
และ program listing
ขั้นตอนจากการแปลโปรแกรมภาษาแอสเซมบลีจนได executable program แสดงดวยภาพได ดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
142
library routines
. . .
and other modules
การทํางานของแอสเซมเบลอร แบงออกเปน 2 pass ในที่นี้จะกลาวถึงโดยยอเทานั้น
• pass แรก ทําหนาที่สราง symbol table
หนาที่หลักของ pass แรก คือ กําหนดคาใหกับ symbol ที่ใชในโปรแกรม คาของ symbol ระหวางการแปล
คือ คา ของ location counter (LC) ซึ่งเริ่มตนมีคาเปน 0 แลวบวกเพิ่มดวยความยาวของคําสั่งหรือขอมูล เชน
.DATA
SUM DD 0
X DD 1
.CODE
L1: CMP X,100
JG L2
MOV EAX,X
ADD X,EAX
ADD X,1
JMP L1
L2: END
assembly language
(source program)
assembler
object module
linker
executable program
หรือ load module
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
143
สมมุติวา ทุกคําสั่งกินเนื้อที่ 2 ไบต และ ขอมูลขนาด DD กินเนื้อที่ 4 ไบต คาของ LC จะมีคา ดังนี้ LC
.DATA
0 SUM DD 0
4 X DD 1
.CODE
8 L1: CMP X,100
10 JG L2
12 MOV EAX,X
14 ADD X,EAX
16 ADD X,1
18 JMP L1
20 L2: END
(หมายเหตุ ในที่นี้ .CODE, .DATA และ END เปน directive ไมกินเนื้อที่)
symbol table จะเปน ดังนี้ name value
SUM 0
X 4
L1 8
L2 20
เปนตน
• pass ท่ีสอง ทําหนาที่ผลิตภาษาเครื่อง การทํางานจะใช LC เหมือนใน pass แรก แตเมื่อพบคําสั่งที่เปน machine instruction จะผลิตภาษาเครื่อง
ของคําสั่งนั้น ถาในคําสั่งมีการอางถึง symbol จะใชคาของ symbol ใน symbol table มาคํานวณ แตถาเปนขอมูล จะ
ผลิตขอมูลตามรูปแบบของขอมูลนั้น เชน เปน two’s complement เปนตน สําหรับ directive เชน PUBLIC,
EXTERN เปนตน จะผลิตขาวสารสําหรับ linker
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
144
5.3 LINKERS โปรแกรมมักจะเขียนแยกออกเปน module ยอย ๆ หรือมักจะเรียกใช subroutine เชน sine เปนตน
subroutine อาจมองไดวาเปน module ยอย module หนึ่ง เปนหนาที่ของ linker ที่จะตองนํา module ยอย ๆ มารวม
เปนโปรแกรมเดียวกัน เชนเดียวกันกับ loader การรวมอาจทําในชวงการเขียนโปรแกรม ในกรณีนี้ ผูเขียนโปรแกรม
ตองนํา source code ของทุก ๆ module มารวมกันเอง หรืออาจทําในชวงการแปล ในกรณีนี้ แอสเซมเบลอรจะนํา
source code ของทุก ๆ module มารวมกันทั้งหมดในชวงการแปล วิธีการรวมที่กลาวมาขางตน ไมมีประสิทธิภาพ
เพราะตองเสียเวลาในการแปล source code ของ module ที่เรียกใชใหมทุกครั้ง วิธีการที่เปนที่นิยมและดีกวา คือ
การแปล source code ของ module ใหเปน object module เพื่อใหโปรแกรมอื่น ๆ เรียกใช โดยไมตองแปล
source code ใหมทุกครั้ง object module อาจนํามาเก็บไวในคลัง (library) เพื่อใชรวมกับ object module อื่น ๆ ใน
ภายหลังก็ได การรวมจึงนาจะทําหลังการแปลและกอนการบรรจุ ในกรณีนี้ source code จึงไมจําเปนตองเขียนดวย
ภาษาเดียวกัน ดังภาพ
การรวม object module ที่ไดจากการแปลซึ่งมีจุดเริ่มตนที่ relative address 0 มารวมเปน module
เดียวกัน เรียกวา relocatable load module ขณะที่รวมกันจะมีการปรับ relative address ของ object module ที่
นํามารวมกันใหมใหสอดคลองกับ relative address ของ module ใหม ซึ่งมี relative address เริ่มตนเปน 0 เชนกัน
เราเรียก linker ที่ผลิต relocatable load module สําหรับ loader วา linkage editor
LINKER
C source code assembly source code
C Compiler Assembler
Object Module Object Module
Library
Executable Program
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
145
ในการเขียนโปรแกรมแยกออกเปน module สัญลักษณ (symbol) ที่อยูใน module อื่น แตนํามาอางถึงใน
module เรียกวา external symbol และเรียกการอางถึงวา external reference สวนสัญลักษณใน module ที่ตองการ
ให module อื่น อางถึงได เรียกวา global symbol หรือ public symbol และในการกระโดดไปทํางานใน module ไม
จําเปนตองเริ่มที่คําสั่งแรกของ module สามารถกําหนด entry points ที่ตําแหนงไหนใน module ก็ได เชน pseudo
code ตอไปนี้ - module A
PUBLIC A,RETURN
EXTERN TEST,B
START: MOV B,0
JMP TEST
RETURN: ADD B,5
A DD 15
END START
- module B
PUBLIC TEST,B
EXTERN RETURN,A
TEST: ADD A,10
JMP RETURN
B DD 10
END
เปนตน เปนหนาที่ของ linker ที่จะตองปรับ address ของ external reference เมื่อมีการรวม module เขาดวยกัน
เชนเดียวกันกับ loader การรวมกันของ module อาจทําในชวง execution time ในกรณีนี้ จะยังไมมีการ
ปรับ address ของ external reference จนกวาจะมีการ execute ถึงคําสั่งที่มีการอางถึง module ที่ถูกอางถึงจึงจะ
นํามาบรรจุลงหนวยความจํา แลวจึงมีการปรับ address ของ external reference แลว execute ตอไป เราเรียก
linker ประเภทนี้วา dynamic linker
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
146
5.4 LODERS loader ทําหนาที่นําโปรแกรมภาษาเครื่องที่พรอมจะ execute (executable program) ซึ่งเก็บอยู
secondary storage เชน จานแมเหล็ก เปนตน มาบรรจุในหนวยความจําหลัก ดังภาพ
หนวยความจําหลัก
loading
นอกจากบรรจุโปรแกรมลงหนวยความจําแลว loader อาจตองทํา address binding คือ ตองเปลี่ยน
logical address ในโปรแกรม เปน physical address ของหนวยความจํา การทํา address binding อาจทําที่สถานะ
ใดสถานะหนึ่ง ในสี่สถานะตอไปนี้ - ทําในชวงการเขียนโปรแกรม (programming time) ในกรณีนี้ ผูเขียนโปรแกรมตองกําหนดตําแหนง
physical address โดยตรง เชน
physical address instruction
250 0
. . .
300 mov @250,12
. . .
หมายถึง กําหนดให physical address 250 เปนขอมูลมีคา 12 เปนตน
- ทําในชวงการแปล (assembly time) ในกรณีนี้ผูเขียนโปรแกรมไมตองกําหนดตําแหนง physical
address โดยตรง เชน
X DW 0
. . .
mov X,12
. . .
ในชวงการเขียนโปรแกรม เราไมจําเปนตองรูวาตําแหนง X อยูที่ physical address เทาใด
executable
program
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
147
- ทําในชวงการบรรจุ (load time) ในกรณีนี้ ตําแหนง physical address ไมจําเปนตองรูในชวงการ
เขียนโปรแกรมและการแปล ตําแหนงของสัญลักษณตาง ๆ ที่ไดจากการแปล เปน relative address
- ทําในชวงการ execute (execution time) ตําแหนงที่บรรจุในหนวยความจํายังไมไดทํา address
binding กับ physical address จนกวาจะมีการ execute คําสั่งที่อางถึงตําแหนงในหนวยความจํา จึง
จะมีการทํา address binding เพื่อใหได physical address
• Absolute Loaders loader ที่งายที่สุด คือ absolute loader หนาที่ของมัน คือ บรรจุ executable program ลงหนวยความจํา
ตามตําแหนงที่เปน physical address ซึ่งไดจากการแปล เชน bootstrap loader เปนตน
นอกจากคําสั่งและขอมูลของ executable program แลว แฟมที่เก็บ executable program จะตองบรรจุ
ขาวสารให absolute loader รู คือ
- ความยาวของโปรแกรม
- ตําแหนง physical address แรก ของหนวยความจํา ที่จะบรรจุโปรแกรม
- ตําแหนง execution address (คําสั่งแรกที่จะ execute) ของโปรแกรม
• Relocatable Loaders โปรแกรมที่ไมมีการทํา address binding ในชวงการแปล จะมี address เปน relative address (ปรกติ
แลว relative address แรกของโปรแกรมจะเปน 0 ) จึงสามารถบรรจุโปรแกรมเริ่มตนที่ physical address ใดก็ได
โดยการปรับคา relative address ใหเปน physical เชน ถา relative address เริ่มตนของโปรแกรมเปน 0 และบรรจุ
โปรแกรมในหนวยความจํา เริ่มตนที่ physical address 300 ดังนั้น relocatable loader จะบวกทุก ๆ relative
address ในโปรแกรมดวย 300 เปนตน ในกรณีนี้ แฟมที่เก็บโปรแกรมจะตองบรรจุขาวสารบอกใหรูวา ตําแหนงใด
เปน relative address เพื่อที่ relocatable loader จะไดปรับคาใหถูกตองเมื่อมีการบรรจุลงหนวยความจํา เชน
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
148
physical address
0
. . .
300
Loading at 300 500
505
• Dynamic Loaders ขอเสียของ relocatable loader คือ เมื่อบรรจุโปรแกรมลงหนวยความจําแลว physical address จะถูก
กําหนดตายตัว ในกรณีของการทํางานหลาย ๆ งานพรอมกัน หรือกรณีของ virtual memory (จะเรียนในวิชา
Operating Systems) โปรแกรมอาจจะถูกยายจากหนวยความจําหลักไปเก็บใน disk และยายจาก disk มายัง
หนวยความจําหลักใหมแตไมจําเปนตองอยูที่เดิม ดังนั้นการ binding address จึงทําไมไดในชวงการแปล ตองทํา
ในชวงการ execute เทานั้น รายละเอียดตาง ๆ จะกลาวถึงในวิชา Operating Systems
Relative address instruction
0-3 0000
. . .
200-204 mov @0,12
200-205 . . .
000
. . .
mov @300,12
. . .
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
149
6. การโปรแกรมภาษาแอสเซมบลีดวย MASM32
6.1 Install MASM32 สามารถ download MASM32 ไดที่ 2Hhttp://www.movsd.com/ ทําการ unzip แลว run install ตามลําดับ
ใหจํา drive ที่ install เชน c: หรือ d: เปนตน จากนั้นสราง batch file ใน drive และ directory ที่จะเขียนโปรแกรม
ชื่อ buildc.bat ดังนี้
@echo off
REM The following three lines can be customized for your system:
REM ********************************************BEGIN customize
SET PATH=C:\MASM32\BIN;%PATH%
SET INCLUDE=C:\MASM32\INCLUDE
SET LIB=C:\MASM32\LIB
REM ********************************************END customize
ML /c /Fl /coff %1.asm
if errorlevel 1 goto terminate
LINK /MAP /SUBSYSTEM:CONSOLE %1.obj user32.lib kernel32.lib
if errorlevel 1 goto terminate
dir %1.*
:terminate
หมายเหตุ - ใหเปลี่ยนช่ือ drive ตรง customize ใหตรงกับที่ install
- ถาใช masm32 version ตํ่ากวา 8.2 ตรง ML /c /Fl /coff %1.asm ใหแกเปน ML /c /coff %1.asm
- สําหรับผูที่ใช MASM615 ในหนังสือ Assembly Language for Intel-Based Computers, 4th ของ
Kip R. Irvine ใหใช make32.bat ดังนี้ (อยาลืมเปลี่ยนช่ือ drive ตามที่ install)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
150
@echo off
REM The following three lines can be customized for your system:
REM ********************************************BEGIN customize
SET PATH=C:\MASM615;%PATH%
SET INCLUDE=C:\MASM615\INCLUDE
SET LIB=C:\MASM615\LIB
REM ********************************************END customize
ML /c /Fl /coff %1.asm
if errorlevel 1 goto terminate
LINK32 /MAP /SUBSYSTEM:CONSOLE %1.obj user32.lib kernel32.lib
if errorLevel 1 goto terminate
dir %1.*
:terminate
คําอธิบาย
@echo off หมายถึงไมตองแสดงคําสั่งออกจอภาพ
REM เปนหมายเหตุ ไมมีความหมายใด ๆ ใชเพื่อเปนหมายเหตุเทานั้น
SET PATH=C:\MASM615;%PATH% หมายถึง กําหนดเสนทางที่จะไปคนหาคําสั่ง %PATH% หมายถึง
เสนทางเดิมที่เคยกําหนด ในที่นี้ใหคนหาใน C:\MASM32 กอน ถาไมพบจึงไปคนในเสนทางเดิมที่เคยกําหนด
SET INCLUDE=C:\MASM615\INCLUDE หมายถึง เสนทางที่จะไปคนแฟม ตรงคําสั่ง INCLUDE
SET LIB=C:\MASM615\LIB หมายถึงเสนทางที่จะไปคนแฟมที่เปน library (.lib)
ML /c /Fl /coff %1.asm คําสั่งของ assembler เพื่อแปล source code ที่เก็บในแฟม %1.asm เมื่อ %1
เปน argument ตัวที่ 1 เชน make32 example1 ในที่นี้ %0 คือ make32 และ %1 คือ example1 เปนตน สวน /c
หมายถึง แปลอยางเดียว /Fl หมายถึง ใหแสดง listing ดวย และ /coff หมายถึง ให object file มีรูปแบบของ coff
if errorlevel 1 goto terminate หมายถึง ถา ML มี exit code เปน 1 (แสดงวา มีความผิดพลาดใน source
code หรือ แปลไมผาน) ใหกระโดดไปที่ตําแหนง terminate
LINK32 /MAP /SUBSYSTEM:CONSOLE %1.obj user32.lib kernel32.lib คําสั่งของ linker เพื่อเช่ือมโยง
object file (.obj) หรือ library file (.lib) สําหรับ /MAP หมายถึงใหแสดง map file และ /SUBSYSTEM:CONSOLE
ใหเช่ือมโยงโปรแกรมแบบ console
dir %1.* คําสั่งแสดงแฟมที่มีช่ือตรงตาม %1 โดยมี extension เปนอะไรก็ได
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
151
:terminate เปนตําแหนงที่มีการกระโดดมายังตําแหนงนี้
6.2 WIN32 API Windows32 API (Application Program Interface) มีฟงกชันจํานวนมากไวใหเรียกใช โดยฟงกชันเหลานี้
เก็บอยูในแฟม .dll (dynamic link library) ตาง ๆ เชน kernel32.dll (ฟงกชันเกี่ยวกับ memory และ process
management), user32.dll (ฟงกชันทางดาน user interface) หรือ gdi32.dll (ฟงกชันทางดาน graphics) เปนตน
เมื่อเราเขียนโปรแกรมและเรียกใชฟงกชันเหลานั้น ฟงกชันเหลานี้จะไมไดนํามารวมกับโปรแกรมของเราใน excecutable program แต linker จะเขียนขาวสารที่เกี่ยวของกับการเรียกใชฟงกชันเหลานั้น และเมื่อ loader บรรจุ
โปรแกรมลงหนวยความจํา เมื่อมีการ execute ถึงคําสั่งที่เรียกฟงกชันเหลานั้น จึงจะมีการ load ฟงกชันนั้น แตถาเคย
มีการ load ฟงกชันนั้นแลว จะไมมีการ load ซ้ําอีก นั่นคือ การ link และ load ทําในขณะในชวง execution time
สําหรับฟงกชันตาง ๆ ที่มีใหใช ดูไดใน win32.hlp สามารถ download ไดที่ 3 Hhttp://www.cs.psu.ac.th/iew/cs344-
222/win32api.zip ตัวอยาง ในภาษาแอสเซมบลี MASM32 การเรียกใช ทําดังนี้ Invoke ExitProcess,0
6.3 การเขียนโปรแกรม โปรแกรมที่จะเขียนเปนโปรแกรม Win32 ซึ่งว่ิงบนระบบปฏิบัติการวินโดว ใน protected mode และใช
สถาปตยกรรม IA-32 วินโดวว่ิงโปรแกรม Win32 แตละโปรแกรมใน virtual space แตละโปรแกรมสามารถมี
virtual space ไดถึง 4GB แม physical memory จะมีหนวยความจําหลักไมถึง 4GB ก็ตาม โปรแกรมแตละ
โปรแกรมมี virtual space แยกจากกันไมสามารถอางถึงกันได ซึ่งตางกับ Win16 ที่สามารถมองเห็นซึ่งกันและกัน
memory model ของโปรแกรม Win32 เปนแบบ flat แตกตางจาก memory model ของ Win16 และ DOS
ที่ตองคํานึงถึง segments แต memory model แบบ flat ไมตองคํานึงถึง segments อีกตอไป (Windows จะจัดการ
ใหเอง) ตําแหนงของ virtual address space สามารถอางถึงไดต้ังแต 0 ถึง 232-1 หรือสามารถอางถึงไดถึง 4GB
การเขียนโปรแกรมภายใต WINDOWS 32 บิต มีสองแบบ คือ
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
152
ก. แบบ console
โปรแกรมแบบ console มีลักษณะเหมือนโปรแกรมที่ว่ิงภายใตระบบปฏิบัติการ DOS ดังแสดงดวยภาพ
ขางลาง
หมายเหตุ สําหรับ WINDOWS 95, 98, ME ใหคลิกสองครั้งที่ MS-DOS prompt สวน WINDOWS 2000, XP ใหไป
ที่ start -> ALL programs -> Accessories -> command prompt
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
153
ข. แบบ GUI (Graphic User Interface)
มีลักษณะเปนหนาตาง ดังแสดงดวยภาพขางลาง
ในที่นี้จะพูดถึงเฉพาะการเขียนโปรแกรมแบบ console เทานั้น การเขียนโปรแกรมแบบ GUI ควรใช
ภาษาระดับสูง เชน BASIC หรือ C จะงายกวา
สําหรับ source program จะเขียนดวย editor ตัวใดก็ได เชน Notepad, Editplus เปนตน แตให save เปน
file ที่มี extension เปน .asm
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
154
6.3.1 คําสั่ง คําสั่งภาษาแอสเซมบลีมีสองประเภท คือ คําสั่ง directive (หรือ pseodo instruction) กับ machine
instruction ซึ่งเปนคําสั่งที่ CPU รูจัก
machine instruction เขียนในหนึ่งบรรทัด ดังนี้ [ label: ] [ mnemonic [ operand(s) ] ] [ ; comment ]
เมื่อ [ ] หมายถึงจะมีหรือไมก็ได เชน
ก. main: มีเฉพาะ label:
ข. lahf มีแต mnemonic
ค. inc x มี mnemonic คือ inc และ operand 1 ตัว คือ x
mov eax,5 มี mnemonic คือ mov และ operands สองตัว คือ eax และ 5
ง. L1: cmp x,100
จ. L2: ret ; return
6.3.2 ตัวอยาง skeleton ของโปรแกรม .386 .MODEL Flat, STDCALL MEMORY high address .STACK size in byte(s) .DATA? <Your uninitialized data> ...... .DATA <Your initialized data> ...... .CONST <Your constants> ...... .CODE <label> <Your code> ..... low address end <label>
.STACK
.DATA?
ขอมูลไมมีคาเริ่มตน .DATA
ขอมูลมีคาเริ่มตน .CONST
ขอมูลมีคาคงที่
.CODE
คําสั่ง
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
155
6.4 หลักการตั้งชื่อ name ประกอบดวย ตัวอักษร a-z หรือ A-Z ตัวเลข 0-9 และสัญลักษณพิเศษ ? @ . _ $ อักขระ . ใชไดเฉพาะเปน
อักขระตัวแรกเทานั้น อักขระตัวแรกตองไมเปนตัวเลข ช่ือตองไมซ้ํากับคําสงวน อันไดแก เรจิสเตอร, mnemonic,
directive, operation-code หรือ operator เปนตน
name ใชสําหรับกําหนด label, variable หรือ symbol กรณีที่เปน label ตองมี : ตอทายดวย แต label ที่
เปนช่ือ subroutine หรือ variable ไมตองมี : ตอทายก็ได
คําแนะนํา : เพื่อไมใหช่ือซ้ํากับคําสงวน อาจใช $ เปนอักขระแรก เชน $L , $EVEN เปนตน EVEN เปนคําสงวนใช
เปนช่ือไมได 6.5 Directive 6.5.1 .386 บอกใหแอสเซมเบลอรรูวาใชชุดคําสั่งของ intel 80386 หรืออาจใช .486 หรือ .586 สําหรับ intel 80486
หรือ Pentium ตามลําดับ
6.5.2 .MODEL Flat, STDCALL ใชกําหนด memory model สําหรับโปรแกรม Win32 ใหใช Flat สําหรับ STDCALL เปนขอตกลงในการ
ผาน parameters (ใหดูหัวขอ subroutine ประกอบ) เมื่อมีการ call subroutine สําหรับโปรแกรม Win32 ใหใชแบบ STDCALL
6.5.3 .STACK, .DATA, .DATA?, .CONST และ .CODE .STACK ใชเพื่อกําหนดสวนที่เปนstack
.DATA ใชเพื่อกําหนดสวนที่เปนขอมูล
.DATA? ใชเพื่อกําหนดขอมูลที่ไมมีการกําหนดคาเริ่มตน
.CONST ใชเพื่อกําหนดขอมูลที่เปนคาคงที่
หมายเหตุ สามารถใช .DATA สาํหรับขอมูลที่กําหนดและไมกําหนดคาเริ่มตนและคาคงที่ แตถาใช .DATA? จะไมกิน
เนื้อที่ในแฟมที่บรรจุ executable program (แตจะกินเนื้อที่ในหนวยความจําเมื่อ loader บรรจลุงหนวยความจํา)
.CODE ใชกําหนดสวนที่เปนคําสั่ง
ในโปรแกรมสามารถเขียนสวนใดก็ได และสามารถเขียนแตละสวนไดหลาย ๆ ครั้ง
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
156
6.5.4 END ใชเพื่อกําหนดใหแอสเซมเบลอรหยุดการแปล หรือจบโปรแกรม ถาไมมี label หลัง END แสดงวาไมมี
จุดเริ่มตนของการ execute เชน กรณีที่เขียนเปน subroutine เปนตน ถามี แสดงวาเปนจุดเริ่มตนของการ execute
6.5.5 COMMENT การเขียนหมายเหตุ ทําไดโดยใช ; (semicolon) ต้ังแต semicolon ถึงสิ้นสุดบรรทัด (end of line) จะเปน
หมายเหตุ
6.5.6 Data types ใชเพื่อกําหนดเนื้อที่และคาของขอมูล
รูปแบบ [name] operation-code initval[,initval]…
เมื่อ
operation-code อาจจะเปนคาใดคาหนึ่ง ตอไปน้ี
operation-code description bytes attribute
DB Define byte 1 byte
DW Define word 2 word
DD Define doubleword 4 doubleword
DQ Define quadword 8 quadword
DT Define tenbytes 10 tenbyte
สําหรับ initval อาจจะเปน numeric values, character หรือ string, constant expression, หรือ ?
• Numeric Values อาจเปน integer หรือ floating point
Integer ประกอบดวยตัวเลขที่เปนไปไดของแตละเลขฐาน และสามารถตามดวย radix (d = decimal, h =
hexadecimal, q หรือ o = octal, b = binary) ได ถาไมมี radix จะหมายถึงเลขฐานสิบ กรณีที่เปนเลขฐานสิบหก
ตัวเลขตัวแรกตองไมเปน A,B,C,D,E,F ถาเปนตองใสเลข 0 นําหนาเสมอ
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
157
เชน 11110000b binary
200 decimal
300d decimal
0ffh hexadecimal
4a6h hexadecimal
324q octal
10o octal
1.76E32 floating point
• Character หรือ String สามารถเขียนไดสองแบบ คือ เขียนอักขระใด ๆ ที่ไมใช ‘ ภายในเครื่องหมาย ‘ ‘ ถาตองการ
เขียน ‘ ตองเขียนสองตัวติดกัน เพื่อแทน ‘ หนึ่งตัว หรือ เขียนอักขระใด ๆ ที่ไมใช “ ภายในเครื่องหมาย “ “ ถา
ตองการเขียน “ ตองเขียนสองตัวติดกัน เพื่อแทน “ หนึ่งตัว เชน
“a“
‘B‘
“I‘m“
‘I“m‘
‘H“E‘
‘12#@%$‘
หมายเหตุ อักขระหนึ่งตัวกินเนื้อที่ 1 ไบต และมีคาตามรหัสของอักขระนั้น ๆ
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
158
• Constant expression สามารถนํา integer, character, location counter ($), และ ตัวแปร (location counter
ของตัวแปร) มาคํานวณทางคณิตศาสตร ดวยตัวดําเนินการเรียงจาก precedence สูงไปต่ํา ดังนี้
ตัวดําเนินการ ความหมาย associative
() parentheses
+ , - unary plus, minus right
* , / , mod multiply, divide, modulo left
+ , - binary plus, minus left
เชน constant expression value
20*5 100
-4+-2 -6
31 mod 6 1
6/4 1
‘2’-30h 2
3+2*5 13
• ? ใชเมื่อไมตองการกําหนดคา ระวัง! ตางกับ ‘?‘ หรือ “?“ ซึ่งหมายถึง การกําหนดคาใหเทากับรหัสของ ?
• operator DUP ในกรณีที่ตองการกําหนดคาเรียงกันซ้ํา ๆ เทากับจํานวนที่ตองการ เชน db 20 dup(0) หมายถึง
ตองการจองเนื้อที่ 20 ไบต แตละไบตมีคา 0 หรือ dd 100h dup(?) หมายถึง ตองการจองเนื้อที่ขนาด 1024 ไบต
(256 double word) โดยไมตองกําหนดคาเริ่มตน
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
159
ตัวอยาง
.data
char db ‘A‘ ; ASCII character 41h = 65 = 01000001b = 101q
signed1 db -128 ; smallest signed value
signed2 db +127 ; largest signed value
unsigned1 db 0 ; smallest unsigned value
unsigned2 db 255 ; largest unsigned value
list1 db 10, 30q, 40h, 00100010b,”B”
ages db ?,?,? ; uninitilized 3 bytes
rowsize db 10*20
dw 0,65535 ; lowest and highest unsigned values
dw -32768,+32767 ; lowest and highest signed values
dd 0ABCDEFh,-3
dd 256*2
mixed dw 1000h,4096, ‘AB‘,”C”
db 2 dup(‘ABC‘)
astring db “Hello“
astring_length db $-astring ; $ is location counter
มีความหมายเหมือนกับ
.data MEMORY ฐาน 16
char db ‘A‘ ตําแหนง char + 0 0100 0001 41
signed1 db -128 +1 1000 0000 80
signed2 db +127 +2 0111 1111 7F
unsigned1 db 0 +3 0000 0000 00
unsigned2 db 255 +4 1111 1111 FF
list1 db 10 +5 0000 1010 0A
db 30q +6 0001 1000 30
db 40h +7 0100 0000 40
db 00100010b +8 0010 0010 22
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
160
db ”B” +9 0100 0010 42
ages db ? +10 อะไรก็ได อะไรก็ได
db ? +11 อะไรก็ได อะไรก็ได
db ? +12 อะไรก็ได อะไรก็ได rowsize db 200 +13 1100 1000 C8
dw 0 +14 0000 0000 00
+15 0000 0000 00
dw 65535 +16 1111 1111 FF
+17 1111 1111 FF
dw -32768 +18 0000 0000 00
+19 1000 0000 80
dw +32767 +20 0111 1111 7F
+21 1111 1111 FF
dd 0ABCDEF9h, +22 1111 1001 F9
+23 1101 1110 DE
+24 1011 1100 BC
+25 0000 1010 0A
dd -3 +26 1111 1101 FD
+27 1111 1111 FF
+28 1111 1111 FF
+29 1111 1111 FF
dd 512 +30 0000 0000 00
+31 0000 0010 02
+32 0000 0000 00
+33 0000 0000 00
mixed dw 1000h +34 0000 1000 01
+35 0000 0000 00
dw 4096 +36 0000 0000 00
+37 0001 0000 10
dw ‘AB‘ +38 0100 0010 42
+39 0100 0001 41
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
161
dw ”C” +40 0100 0011 43
+41 0000 0000 00
db ‘A’ +42 0100 0001 41
db ‘B’ +43 0100 0010 42
db ‘C’ +44 0100 0011 43
db ‘A’ +45 0100 0001 41
db ‘B’ +46 0100 0010 42
db ‘C’ +47 0100 0011 43
astring db “H” +48 0100 1000 48
db “e” +49 0110 0101 65
db “l” +50 0110 1100 6C
db “l” +51 0100 1100 6C
db “o“ +52 0110 1111 6F
astring_length db 5 ; = 53-48 +53 0000 0101 05
หมายเหตุ dw ‘ABC’ ผิด เพราะ มีคาเกิน 16 บิต แต db ‘ABC’ ถูก เพราะหมายถึง db ‘A’,’B’,’C’
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
162
6.5.7 PROTO ใชเพื่อกําหนด prototype ของ subroutine ใชบอกจํานวน dummy argument และขนาดของ dummy
argument แตละตัว สําหรับ WIN32 ใหมีขนาด 32 บิต คือ DWORD หรือ BYTE PTR
รูปแบบ label PROTO [distance] [langtype] [, [parameter]:tag]...
เมื่อ
label เปนช่ือของ subroutine มีช่ือเดียวกันกับ label ของคําสั่ง PROC และ ENDP
distance เปน NEAR, FAR, NEAR16, NEAR32, FAR16 หรือ FAR32
ถาไมกําหนด จะกําหนดตาม memory model สําหรับ Flat จะหมายถึง NEAR
langtype กําหนดขอตกลงในการผาน parameter เชน C, PASCAL, SYSCALL หรือ STDCALL เปนตน
parameter เปนช่ือของ dummy parameter ไมตองมีก็ได
tag เปนขนาดของ parameter เชน WORD, DWORD, BYTE PTR เปนตน
หรือ เปน VARARG ซึ่งเขียนไดเฉพาะ parameter ตัวสุดทาย และใชไดกับ langtype แบบ
C, SYSCALL หรือ STDCALL เทานั้น ต.ย. ก. ในภาษา C
int foo (int i, char * j);
ภาษาอแสเซมบลีเขียนไดเปน foo PROTO :DWORD,:DWORD
หรือ foo PROTO :DWORD,:PTR BYTE
หมายเหตุ PTR BYTE มีขนาด 32 บิต เหมือนกับ DWORD แตสื่อความหมายวาเปน address ไดดีกวา DWORD
ข. int bar (int i, …);
ภาษาอแสเซมบลีเขียนไดเปน bar PROTO :DWORD,:VARARG
ในการแปลคําสั่ง PROTO จะกําหนดชื่อ subroutine เหมือนกับของคําสั่ง invoke เชน _foo@8
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
163
6.5.8 INVOKE ใชเพื่อเรียก subroutine ซึ่งจะมีการผาน parameter ตามที่กลาวแลวใน .MODEL สําหรับฟงกชันตาง ๆ ใน
API ของ Win32 การเรียกช่ือฟงกชัน จะตองกําหนดใหอักษรตัวเล็กและตัวใหญตางกัน ดวย คําสั่ง option casemap :none ; case sensitive
รูปแบบ INVOKE expression [,arguments] เมื่อ expression เปนนิพจนเพื่อบอกตําแหนงของ subroutine ที่เรียกใช
arguments เปนรายการของ parameters ที่จะผานไปยัง subroutines ซึ่งอาจจะเปน
register::register (สําหรับ register pair), นิพจน หรือ ADDR label หมายเหตุ
subroutine ที่จะเรียกใชดวย invoke ตองเขียนดวย PROC และ ENDP หรือ กําหนด prototype ดวยคําส่ัง
PROTO มากอน
ในการแปล ชื่อของ subroutine จะมีการใส _ ไวขางหนาเหมือนของภาษา C และลงทายดวย @จํานวนเนื้อ
ที่ของพารามิเตอรทั้งหมด เชน int foo(int i, int j) เมื่อเรียกใชดวย invoke foo,5,10 จะแปลเปน
push 10
push 5
call _foo@8
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
164
6.5.9 PROC และ ENDP ใชเพื่อเขียน subroutine แอสเซมเบลอรจะผลิต PROLOGUE code เพื่อผาน parameters ทาง stack และ
EPILOGUE code เพื่อลบ parameters ทิ้งเมื่อออกจาก subroutine เองโดยอัตโนมัติ ถาทานตองการกําหนดเองให
ใช directive OPTION PROLOGUE: และ OPTION EPILOGUE: (หมายเหตุ subroutine สามารถเปน nested ได
ถาไมมี parameters, local variables หรือ USES และตองไมผลิต segment หรือ group ใหม)
รูปแบบ label PROC [distance] [langtype] [visibility]
[<prologuearg>]
[USES reglist] [,parameter [:tag]]...
[LOCAL varlist]
statements
label ENDP
เมื่อ
label, distance, langtype, parameter และ tag เหมือน directive PROTO
visibility เปน PRIVATE, PUBLIC หรือ EXPORT ถาไมกําหนดจะเปน PUBLIC สวน EXPORT
จะหมายถึง PUBLIC และ FAR
prologuearg เปน arguments ที่จะผานไปยัง prologue code
reglist เปนรายชื่อของเรจิสเตอร (ถามีมากกวาหนึ่งตัวใหคั่นดวย blank) ที่จะ save เก็บ
รักษาไวบน stack และจะ restore เมื่อออกจาก subroutine
statements เปนคําสั่งใด ๆ เมื่อตองการออกจาก subroutine ใชคําสั่ง ret ระวังอยาใช retf หรือ iretf
เพราะแอสเซมเบลอรจะไมผลิต epilogue code
สําหรับ local variables จะตองประกาศโดยใช directive LOCAL
หมายเหตุ ไมจําเปนตองเขียน prologue , epilogue, save/restore registers และ ret [total_parmsizes] เอง
ในการแปลคําสั่ง PROC จะกําหนดชื่อ subroutine เหมือนกับของคําสั่ง invoke และ PROTO เชน _foo@8
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
165
ตัวอยาง เขียน subroutine fact เพื่อหา factorial โดยใช PROC และมีการ call แบบ stdcall ได ดังนี้
fact PROC USES edx n:DWORD
cmp n,1
jle ret_one
mov eax,n
dec eax
invoke fact,eax
imul n
jmp ret_fact
ret_one:
mov eax,1
ret_fact:
ret
fact ENDP
มีการเรียกใชเพื่อหา 3! ดังนี้
invoke fact,3
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
166
5.5.10 LOCAL ใชเพื่อกําหนด local variable โดยที่แอสเซมเบลอรจะจองเนื้อที่บน stack ใหโดยอัตโนมัติ
รูปแบบ LOCAL name [[count]][:qualifiedtype] [, name [[count]]
[:qualifiedtype]]...
เมื่อ
name เปนช่ือของ local variable
[count] ถามีตองเขียนในวงเล็บใหญ เพื่อจํานวนครั้งที่จะกําหนดเนื้อที่
qualifiedtype กําหนดขนาด เชน WORD หรือ DWORD หรือระเบียน เปนตน
เชน LOCAL array[20]:BYTE
LOCAL temp:DWORD
LOCAL myrec:Person
ตัวอยาง ภาษา C
int f(int i, int j)
{
int m,n,k;
…
}
ภาษาแอสเซมบลี f PROC i:DWORD,j:DWORD
LOCAL M:DWORD,N:DWORD,K:DWORD
…
ret
f ENDP
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
167
5.5.11 EQU ใชเพื่อกําหนด นิพจนหรือขอความซึ่งอยูภายใน < > ใหกับ symbol
รูปแบบ name EQU expression
หรือ name EQU <text> เชน
MASM EQU 5.1 + 0.9 ;Evaluates to 6.0
Msft EQU <”Microsoft”> ;String equate
M1 EQU 3*4
M2 EQU <3*4>
.data
version dd MASM ; version dd 6.0
db Msft ; db “Microsoft”
dw M1 ; dw 12
dw M2 ; dw 3*4
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
168
INPUT/OUTPUT (I/O) IBM PC ออกแบบใหมี I/O สองประเภท คือ
- memory map I/O ไดแก จอภาพ ซึ่งจะใชหนวยความจําหลักสวนหนึ่งเปน VRAM (video buffer) การ
เขียนขอมูลไปยัง VRAM จะเกิดขอความหรือภาพบนจอภาพ
- port I/O มีขนาด 16 บิต มีหมายเลข 0 ถึง 65535 เชน keyboard, serial port, parallel port เปนตน
IA-32 จะมีคําสั่ง IN และ OUT เพื่อ อานหรือเขียนขอมูลไปยังหมายเลข port ตาง ๆ
การติดตอสื่อสารระหวาง CPU กับอุปกรณภายนอกใชวิธีการ interrupt
Interrupt Interrupt มีสองประเภท คือ software interrupt (หรือ trap) และ hardware interrupt ไมวาจะเปน
interrupt แบบใด จะมีขบวนการจัดการกับ interrupt เหลานั้นดวยการจดจําตําแหนงของคําสั่งที่จะ execute ถัดไป
ไวบนกองซอน แลวกระโดดไปยัง interrupt handler routine เพื่อบริการ interrupt ดังกลาว เมื่อบริการ interrupt
handler routine เสร็จ ก็จะกลับมาทํางานที่คําสั่งที่ตําแหนงซึ่งไดเคยจดจําไว แสดงดังภาพ
…
instruction 1
instruction 2 เกิด interrupt
จําตําแหนงคําสั่งที่จะกระทําตอไป
… กระโดดไปทํางานที่ interrupt handler routine
กลับไปกระทําคําสั่งที่เคยจดจําตําแหนงไว
1
2 3
4
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
169
Hardware Interrupt
8086/8088 มี hardware interrupt ที่เปน input สองประเภท คือ non-maskable interrupt (NMI) และ
interrupt request (INTR) ดังภาพ 8259 8086/8088 port 20h (EOI) 20h = eoi
NMI
bit 15 9 0 INTR interrupt in port 21h IMR 1 = unmask 0 = mask
FLAGS IF
1 (sti) = enable ISR
0 (cli) = disable IRR
หมายเหตุ สําหรับ IA-32 ในสวนของ 8259 จะมีเพิ่มเติมเปน master interrupt controller กับ slave interrupt
controller (ดูคูมือของ IA-32)
NMI ปกติใชสําหรับ parity error หรือ เกิดความผิดพลาดของระบบ เชน ไฟดับ เปนตน interrupt ประเภทนี้
ไมสามารถบังคับไมใหเกิดได (คําสั่ง cli ไมมีผลกับ NMI) ถาเกิด NMI interrupt การบริการจะใช interrupt type 2
เปน interrupt handler routine ซึ่งการทํางานจะตองรีบเก็บขอมูลที่สําคัญลง CMOS ซึ่งเปนหนวยความจําที่มี
แบตเตอรี่สํารอง เปนตน
สําหรับ INTR , Intel 8086/8088 มี 8259 Interrupt Controller เปนตัวควบคุมการเกิด interrupt อุปกรณ
ตัวนี้มี Interrupt Mask Register (IMR) ขนาด 8 bits (b7b6b5b4b3b2b1b0) และมีเลขที่ port หมายเลข 21h บิตที่ 7 จะ
เกี่ยวของกับ interrupt หมายเลข 7 บิตที่ 6 จะเกี่ยวของกับ interrupt หมายเลข 6 ตามลําดับ ถากําหนดใหบิตใดมีคา
เปน 1 (unmask) เมื่อเกิด interrupt จากอุปกรณที่เกี่ยวของกับบิตนั้น 8259 จะไมสงสัญญาณให 8086/8088 ทราบ
นั้นคือ interrupt นั้นจะถูกละเลย ถาตองการให 8259 สงสัญญาณให 8086/8066 ทราบเพื่อให interrupt นั้นมีผล
ตองกําหนดใหบิตที่เกี่ยวของมีคาเปน 0 (mask) อยางไรก็ตาม interrupt จะมีผลถา IF (Interrupt Flag) มีคาเปน 1
(enable) ไมใช 0 (disable) ดูคําสั่ง cli และ sti ในบทที่ 9
อุปกรณ 8259 กําหนด priority หรือ level ใหกับแตละบิตที่กลาวมา ผูใชไมสามารถเปลี่ยนแปลง priority
ดังกลาว interrupt บิต 0 จะมี priority สูงสุด และ interrupt บิต 7 จะมี priority ตํ่าสุด
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
170
Level Device Priority
0 Timer channel 0 highest
1 Keyboard
2 -
3 Asynchronous communications
4 Alternate asynchronous communications
5 Fixed disk
6 Diskette
7 Printer lowest
ในบางชวงเวลาอาจจะมี interrupt มากกวาหนึ่ง level เกิดขึ้นพรอมกัน (ขณะที่กําลังบริการอุปกรณที่มี
priority ตํ่ากวา แลวเกิด interrupt จากอุปกรณที่มี priority สูงกวา) อุปกรณที่มี priority สูงกวาจะไดรับการบริการ
กอน สวนอุปกรณที่มี priority ตํ่ากวาจะตองรอ เมื่อบริการ interrupt เสร็จผูเขียนโปรแกรมจะตองบอกการสิ้นสุดของ
การบริการ interrupt ให 8259 รู ดวยการ ใสคา 20h ไปที่ port หมายเลข 20h (เรียกวา End Of Interrupt (EOI)
command) เขียนเปนภาษาแอสเซมบลีได ดังนี้ mov al,20h
out 20h,al
เพื่อที่อุปกรณที่มี priority ตํ่ากวาที่กําลังรออยูจะไดรับการบริการตอไป
ขณะที่กําลังบริการ interrupt อยู 8259 จะปองกันไมให interrupt จากอุปกรณที่มี priority ตํ่ากวาหรือ
เทากับ มีผล โดยไมสงสัญญาณไปบอกให 8086/8088 รู หรือละเลย interrupt ดังกลาวนั่นเอง
8259 จะใช Interrupt Mask Register (IMR) , Interrupt Request Register(IRR), และ Interrupt Service
Register (ISR) เพื่อจัดการกับเรื่องที่กลาวมาทั้งหมดขางตน ดังนี้
- ใช IMR เพื่อ mask และ unmask ผูเขียนโปรแกรมสามารถละเลย interrupt ได
- ใช ISR เพื่อบอกใหรูวา กําลังบริการ interrupt ใดอยู
- ใช IRR เพื่อบอกใหรูวา interrupt level ใดรองขอ
การปองกันไมให interrupt ที่มี priority ตํ่ากวา มีผล ทําไดโดยการตรวจสอบบิตใน IRR กับบิตใน ISR ถาบิตที่มี
priority สูงกวาใน ISR อยางนอยหน่ึงบิตเปน 1 แสดงวากําลังบริการ interrupt ที่มี priority สูงกวาอยู จะละเลย
interrupt ที่รองขอ อยางลืมวาเมื่อบริการ interrupt ใดเสร็จ เปนหนาที่ของผูเขียนโปรแกรมที่จะตองใช EOI
command เพื่อบอกให 8259 รู จะไดกําหนดใหบิตของ interrupt ที่บริการเสร็จใน ISR เปน 0 เพื่อที่จะให interrupt
ที่มี priority ตํ่ากวาสามารถรองขอได
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
171
หมายเหตุ ในกรณีที่ลืม EOI command หลังจากสิ้นสุดการบริการ timer interrupt ซึ่งเปน priority สูงสุด เครื่องจะ
hang เพราะไมสามารถเกิด interrupt ที่มี priority ตํ่ากวาหรือเทากับไดอีก การสง EOI command สองครั้งก็อาจจะ
ทําใหการทํางานผิดพลาดได ระบบปฏิบัติการจะเปนตัวจัดการกับทรัพยากรที่เกี่ยวของกับอุปกรณเหลานี้ ทานจึงไมควรใช EOI command ในโปรแกรมของทาน เพราะ interrupt handler routine ของระบบปฏิบัติการจะทําหนาที่นี้
อยูแลว Software Interrupt
Intel 8086/8088 มีคําสั่ง int ใหผูใชสามารถทํา software interrupt ได หลังคําสั่ง int คือหมายเลข interrupt
ซึ่งมีคาไดต้ังแต 0 – 255 Keyboard
เมื่อผูใชกดปุมบน keyboard จะเกิด interrupt INTR บิต 1 ไปยัง 8259 ถา interrupt นี้มีผล interrupt handler
(9) ของ keyboard จะอานคา scan code จาก keyboard ที่ port 60h ซึ่งมีคาตาง ๆ ดังนี้
F1 F2 ESC 1 2 3 4 5 6 7 8 9 0 _ = ← Num lock Scroll Lock
59 60 1 2 3 4 5 6 7 8 9 10 11 12 13 14 69 70
F3 F4 ←→ Q W E R T Y U I O P [ ] ← Home ↑ PgUp -
61 62 15 16 17 18 19 20 21 22 23 24 25 26 27 71 72 73 74
28
F5 F6 Ctrl A S D F G H J K L ; ‘ ‘ ← → +
62 64 29 30 31 32 33 34 34 36 37 38 39 40 41 75 76 77
78
F7 F8 ⇑ \ Z X C V B N M , . / ⇑ * End ↓ PgDn
65 66 42 43 44 45 46 47 48 49 50 51 52 53 54 55 79 80 81
F9 F10 Alt Caps Lock Ins Del
67 68 56 57 58 82 83
ขอมูลจาก port 60h ไมใช ASCII code เปนหนาที่ของ interrupt handler ของ keyboard จะแปลงเปน ASCII
code ให และใสคาที่แปลงแลวไวใน queue เพื่อใหระบบปฏิบัติการนําไปใชได
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
172
scan code ที่เกิดจากการกดปุม keyboard ครั้งแรกมีต้ังแต 1 – 83 เรียกวา “make” codes เมื่อผูใชปลอยปุม
keyboard จะสง scan code ครั้งที่สอง เรียกวา “break” code ดวยการบวก 128 ไปที่ “make” code ซึ่งจะมีคา
ต้ังแต 129 – 211 (กําหนดให bit 7 มีคา 1) ในกรณีที่ผูใชกดปุมแชไวเกิน ½ วินาที keyboard จะสง “make” code
ใหใหม จํานวน 10 ครั้งตอวินาที จนกวาจะปลอยจึงจะสง “break” code
การแปลง scan code เปนคาที่เก็บใน queue คอนขางยุงยากเพราะ ความหมายของการกดปุม เชน shift กับ
c จะหมายถึง C หรือ Ctrl-C จะมีความหมาย “break execution” เปนตน นอกจากนี้ยังมี toggle keys เชน Caps
Lock, Num Lock เปนตน สําหรับการกดปุมหลายปุมพรอมกัน เชน Ctr-Alt-Del จะมีผลอยางใดอยางหนึ่ง เขชน การ
reboot แทนที่จะเปนการใสคาใน queue เปนตน
ในการเขียนโปรแกรมประยุกต เราจะไมติดตอกับ I/O ทาง hardware โดยตรง แตจะเรียกใชบริการของ
ระบบปฏิบัติการแทน
FILE HANDLE ระบบปฏิบัติการ DOS รุนที่ 2 เปนตนไป และ WINDOWS รวมทั้ง UNIX และ LINUX จะใช file handle ใน
การติดตอกับแฟมขอมูล การติดตอกับแฟมขอมูลครั้งแรกตอง open file โดยการกําหนดชื่อของแฟมกอน ถา open
ได ระบบปฏิบัติการจะกําหนดหมายเลข handle ใหกับแฟมดังกลาว จํานวนแฟมที่จะ open ไดพรอม ๆ กันในแตละ
ครั้งขึ้นอยูกับระบบปฏิบัติการแตละตัว การอานเขียนขอมูลในแฟมจะใช file handle และเมื่อเลิกใชตอง close แฟม
ดังกลาว โดยใช file handle นอกจากนี้ยังมีอุปกรณมาตรฐานสามอันที่มีลักษณะการทํางานเหมือน file handle แต
ไมตองมีการ open และ close สามารถใชไดเลย ไดแก stdin, stdout และ stderr ซึ่งแทน keyboard ใชเพื่ออาน
ขอมูลจาก keyboard, จอภาพ ใชเพื่อเขียนขอมูลออกจอภาพ และจอภาพ ใชเพื่อเขียนขอความผิดพลาดออกจอภาพ
ตามลําดับ
สําหรับโปรแกรมแบบ console ฟงกชันของ WIN32 API ที่ใชสําหรับนําหมายเลข handle ของอุปกรณ
มาตรฐานทั้งสามมาใช ไดแก GetStdHandle ซึ่งมี prototype ดังนี้ GetStdHandle PROTO :DWORD
และเรียกใช ดังนี้ ก. stdin
invoke GetStdHandle,STD_INPUT_HANDLE
ข. stdout
invoke GetStdHandle,STD_OUTPUT_HANDLE
ค. stdout
invoke GetStdHandle, STD_ERROR_HANDLE
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
173
เมื่อ STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12
ตัวเลขขางตนไมใชหมายเลข handle แตเปนตัวเลขที่ WINDOWS กําหนดขึ้น หมายเลข handle จริง ๆ ที่ไดจะ
สงกลับทาง eax
สําหรับการอานเขียน ใชฟงกชัน ReadFile และ WriteFile สามารถดูไดจาก WIN32 help และตัวอยาง
ขางลาง
ตัวอยางโปรแกรม อาน/เขียน จาก stdin และ stdout ; FILE:readwrite.asm
; How to use WIN32 API for reading and writting string from standard input and standard output
; How to Compile&link
; For masm32-> buildc readwrite
; For masm615->make32 readwrite
.386
.model flat, stdcall
option casemap :none ; case sensitive
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12
NULL equ 0
GetStdHandle PROTO :DWORD
ReadFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WriteFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO :DWORD
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
174
.data
stdin_hFile dd ?
stdout_hFile dd ?
inbuff db 256 dup(?)
NumberOfBytesRead dd ?
NumberOfBytesWrite dd ?
.code
main:
; show how to get STD_INPUT_HANDLE
invoke GetStdHandle,STD_INPUT_HANDLE
mov stdin_hFile,eax
; show how to get STD_OUTPUT_HANDLE
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout_hFile, eax
; show how to ReadFile
invoke ReadFile,stdin_hFile,ADDR inbuff,256,ADDR NumberOfBytesRead,NULL
; show how to WriteFile
invoke WriteFile,stdout_hFile,ADDR inbuff,NumberOfBytesRead,ADDR
NumberOfBytesWrite,NULL
; exit process
invoke ExitProcess,0
end main
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
175
ตัวอยางโปรแกรม เขียน string ; FILE:helloworld.asm
; How to write string
; How to Compile&link
; For masm32-> buildc helloworld
; For masm615->make32 helloworld
.386
.model flat, stdcall
option casemap :none ; case sensitive
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12
NULL equ 0
GetStdHandle PROTO :DWORD
ReadFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WriteFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO :DWORD
.data
stdout_hFile dd ?
NumberOfBytesWrite dd ?
prompt db 'Hello World'
newline db 0dh,0ah ; carriage return and linefeed
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
176
.code
L0:
; get STD_OUTPUT_HANDLE
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout_hFile, eax
; show prompt
invoke WriteFile,stdout_hFile,ADDR prompt,11,ADDR NumberOfBytesWrite,NULL
; write newline
invoke WriteFile,stdout_hFile,ADDR newline,2,ADDR NumberOfBytesWrite,NULL
; exit process
invoke ExitProcess,0
end L0
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
177
ตัวอยางโปรแกรม อาน/เขียน เลขจํานวนเต็มมีเครื่องหมาย 32 บิต ; FILE:readwriteint.asm
; How to read and write signed integer (N)
; How to Compile&link
; For masm32-> buildc readwriteint
; For masm615->make32 readwriteint
.386
.model flat, stdcall
option casemap :none ; case sensitive
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12
NULL equ 0
GetStdHandle PROTO :DWORD
ReadFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WriteFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO :DWORD
atoi PROTO :DWORD
itoa PROTO :DWORD,:DWORD
.data
stdin_hFile dd ?
stdout_hFile dd ?
inbuff db 256 dup(?)
NumberOfBytesRead dd ?
NumberOfBytesWrite dd ?
outbuff db 12 dup(?)
N dd ?
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
178
.code
; int atoi(char *atoi_buff); --- Convert ASCII string to 32-bit signed integer.
blank equ 20h ; ASCII blank character
tab equ 09h ; ASCII tab character
atoi proc USES ebx ecx edx atoi_buff:DWORD
mov esi,atoi_buff
xor ebx,ebx ; initialize forming answer
xor ecx,ecx ; initialize sign flag
atoi1: mov al,[esi]
inc esi ; scan off whitespace
cmp al,blank ; ignore leading blanks
je atoi1
cmp al,tab ; ignore leading tabs
je atoi1
cmp al,'+' ; if + sign, proceed
je atoi2
cmp al,'-' ; is it - sign?
jne atoi3 ; no, test if numeric
dec ecx ; was - sign, set flag, for negative result
atoi2: mov al,[esi] ; get next character
inc esi
atoi3:cmp al,'0' ; is character valid?
jb atoi4 ; jump if not '0' to '9'
cmp al,'9'
ja atoi4 ; jump if not '0' to '9'
and eax,0fh ; isolate lower four bits
xchg ebx,eax ; previous answer x 10
mov edx,10
mul edx
add ebx,eax ; add this digit
jmp atoi2 ; convert next digit
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
179
atoi4: mov eax,ebx ; put result into EAX
jecxz atoi5 ; jump if sign flag clear
neg eax ; make result negative
atoi5:
ret ; back to caller
atoi endp
; int itoa(int i, char *itoa_buff);
;--- Convert 32-bit signed integer to ASCII string
itoa proc USES ebx ecx edx esi i:DWORD, itoa_buff:DWORD
mov ecx,10 ; convert to base 10, change here for base 2, 8, 16
mov eax,i
mov esi,itoa_buff
add esi,11 ; advance to end of buffer
push esi ; and save that address.
or eax,eax ; test sign of 32-bit value,
pushfd ; and save sign on stack.
jns itoa1 ; jump if value was positive.
neg eax ; find absolute value.
itoa1: mov edx,0 ; divide value by base to extract
div ecx ; next digit for forming string
add dl,'0' ; convert remainder to ASCII digit
cmp dl,'9' ; in case converting to hex ASCII,
jle itoa2 ; jump if in range 0-9,
add dl,'A'-'9'-1 ; correct digit if in range A-F for base 16
itoa2: dec esi ; back up through buffer
mov [esi],dl ; store this character into string
or eax,eax
jnz itoa1 ; no, convert another digit
popfd ; was original value negative?
jns itoa3 ; no, jump
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
180
dec esi ; yes, store sign into output
mov byte ptr [esi],'-'
itoa3:pop eax ; calculate length of string
sub eax,esi
mov ecx,eax ; keep length in ecx
; move string to the beginning of itoa_buff
mov edx,itoa_buff
itoa4: cmp eax,0
je exit_itoa
mov bl,[esi]
mov [edx],bl
inc edx
inc esi
dec eax
jmp itoa4
exit_itoa:
; fill zero of string
mov [edx],DWORD PTR 0
mov eax,ecx
ret ; back to caller
itoa endp
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
181
start:
; First get STD_INPUT_HANDLE and STD_OUTPUT_HANDLE
invoke GetStdHandle,STD_INPUT_HANDLE
mov stdin_hFile,eax
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout_hFile, eax
; read N
; step1: read string
invoke ReadFile,stdin_hFile,ADDR inbuff,256,ADDR NumberOfBytesRead,NULL
; step 2: convert string to signed integer
invoke atoi,ADDR inbuff
; step 3: keep in N
mov N,eax
; write N
; step 1: convert signed integer (N) to string
invoke itoa,N,10,ADDR outbuff
; length of string is in eax
; step 2: write string
invoke WriteFile,stdout_hFile,ADDR outbuff,eax,ADDR NumberOfBytesWrite,NULL
; exit process
invoke ExitProcess,0
end start
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
182
แถวลําดับ (array) แถวลําดับสามารถกําหนดเนื้อที่ใหติดกัน โดยมีขนาด s*n เมื่อ s เปนขนาดเปนไบตของสมาชิกแตละตัว
และ n เปนจํานวนสมาชิกทั้งหมด
ก. แถวลําดับ 1 มิติ
สมมุติวา a เปนแถวลําดับ 1 มิติ ขนาด 20 (มีสมาชิก 20 ตัว) สมาชิกแตละตัวกินเนื้อที่ 1 ไบต คาเริ่มตนเปน
อะไรก็ได สามารถกําหนดเนื้อที่ได ดังนี้ a db 20 dup(?)
สมาชิกแตละตัวมีตําแหนง ดังนี้
a+0 1 ไบต
a+1 1 ไบต
a+2 1 ไบต …
a+19 1 ไบต
แตถเ a เปนแถวลําดับ 1 มิติ ขนาด 20 (มีสมาชิก 20 ตัว) สมาชิกแตละตัวกินเนื้อที่ 2 ไบต คาเริ่มตนเปน
อะไรก็ได สามารถกําหนดเนื้อที่ได ดังนี้ a dw 20 dup(?)
สมาชิกแตละตัวมีตําแหนง ดังนี้ a+0 2 ไบต
a+2 2 ไบต
a+4 2 ไบต …
a+38 2 ไบต
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
183
แตถเ a เปนแถวลําดับ 1 มิติ ขนาด 20 (มีสมาชิก 20 ตัว) สมาชิกแตละตัวกินเนื้อที่ 4 ไบต คาเริ่มตนเปน
อะไรก็ได สามารถกําหนดเนื้อที่ได ดังนี้ a dd 20 dup(?)
สมาชิกแตละตัวมีตําแหนง ดังนี้ a+0 4 ไบต
a+4 4 ไบต
a+8 4 ไบต …
a+76 4 ไบต
ตองการหาสูตรทั่วไป สําหรับหาตําแหนงของสมาชิกในแถวลําดับ 1 มิติ ขนาด n ที่สมาชิกแตละตัวกินเนื้อที่
s byte ได ดังนี้
ตําแหนง สมาชิกตัวที่ a+0 1
a+s*1 2
. . .
a+s*(n-1) n
สูตร สมาชิกตัวที่ i อยูที่ตําแหนง a+s*(i-1)
ข) แถวลําดับ 2 มิติ
สมมุติวา a เปนแถวลําดับ 2 มิติ ขนาด 3*4 (มีสมาชิก 12 ตัว) สมาชิกแตละตัวกินเนื้อที่ 1 คํา คาเริ่มตนกําหนดดังนี้ 11 12 13 14
21 22 23 24
31 32 33 34
ถาตองการเก็บแบบ row major order เขียนเปนภาษาแอสเซมบลีไดดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
184
a dw 11,12,13,14,21,22,23,24,31,32,33,34
ถาตองการเก็บแบบ column major order เขียนเปนภาษาแอสเซมบลีไดดังนี้ a dw 11,21,31,12,22,32,13,23,33,14,24,34
ตองการหาสูตรทั่วไป สําหรับหาตําแหนงของสมาชิกในแถวลําดับ 2 มิติ ขนาด m*n โดยที่สมาชิกแตละตัว
กินเนื้อที่ s byte แบบ row order major ได ดังนี้
ตําแหนง สมาชิกตัวที่ a+ s*(1-1) 1,1
a+ s*(2-1) 1,2
. . .
a+ s*(n-1) 1,n
a+s*n+ s*(1-1) 2,1
a+s*n+ s*(2-1) 2,2
. . .
a+s*n+ s*(n-1) 2,n
. . .
a+s*n*(i-1)+s*(1-1) i,1
a+s*n*(i-1)+s*(2-1) i,2
. . .
a+s*n*(i-1)+s*(j-1) i,j
. . .
a+s*n*(i-1)+s*(n-1) i,n
. . .
a+s*n*(m-1)+s*(1-1) m,1
a+s*n*(m-1)+s*(2-1) m,2
. . .
a+s*n*(m-1)+s*(n-1) m,n
สูตร สมาชิกตัวที่ i,j อยูที่ตําแหนง a+s*n*(i-1)+s*(j-1)
s*n
s*n
แถวที่ 1
แถวที่ 2
แถวที่ i s*n
s*n แถวที่ m
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
185
ในทํานองเดียวกัน ตองการหาสูตรทั่วไป สําหรับหาตําแหนงของสมาชิกในแถวลําดับ 2 มิติ ขนาด m*n โดย
ที่สมาชิกแตละตัวกินเนื้อที่ s byte แบบ column order major ได ดังนี้
สูตร สมาชิกตัวที่ i,j อยูที่ตําแหนง a+s*m*(j-1)+s*(i-1)
ตัวอยาง ตองการเขียนโปรแกรมเพื่อบวกขอมูลในแถวลําดับ a ที่มีสมาชิก 100 ตัว เก็บไวที่ตัวแปร sum โดยที่สมาชิก
แตละตัวกินเนื้อที่ 4 ไบต
.data
a dd 100 dup (?)
sum dd 0
.code
mov ecx,1 ; use ecx as counter from 1 to 100
mov ebx,0 ; use ebx as index
L1: cmp ecx,100
jg L2
mov eax,a[ebx]
add sum,eax
inc ecx
add ebx,4
jmp L1
L2:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
186
ระเบียน (record)
สามารถกําหนดเหมือนแถวลําดับ คือ ต้ังช่ือของระเบียนเปนตําแหนงเริ่มตน สําหรับแตละ field ในแถว
ลําดับใชระยะหางจากตําแหนงเริ่มตนของระเบียน เชน .data
person_rec label byte
db 40 dup (?) ; name
birthdate label word
dw ? ; day
dw ? ; month
dw ? ; year
.code
lea ebx,person_rec
mov ax,WORD PTR[ebx+40] ; day
หรือ กําหนด type ใหเปนระเบียนได ดังนี้
name STRUCT [alignment] [, NONUNIQUE]
fielddeclarations
name ENDS
เมื่อ name เปนช่ือของระเบียน หรือ structname
alignment อาจเปน 1, 2 หรือ 4 เปน boundary alignment (เริ่มตนที่ตําแหนงซึ่งหารดวย 1, 2 หรือ 4
ลงตัว) ถาไมกําหนด จะเปน 1
NONUNIQUE การอางถึง field ตองเปน fully specifies name
fielddeclarations กําหนด filed ตาง ๆ
และเมื่อ ไดช่ือของระเบียนและโครงสรางแลว สามารถกําหนดตัวแปรใหมีชนิดเปนระเบียนได ดังนี้
[name] structname <[initializer [, initializer]...]>
หรือ
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
187
[name] structname { \
[initializer] \
[, initializer]... \
}
หรือ [name] structname constant DUP ({[initializer[, initializer]...]})
ถาไมกําหนด initializer ตรง field ไหน จะใชคา default ในระเบียน เชน
BirthDate STRUCT
DAY dw 17 ; default value
MONTH dw 01 ;default value
YEAR dw 2003 ;default value
BirthDate ENDS
Person STRUCT
FirstName db "HatYai",0 ; default value
LastName db "Thailand",0 ;default value
mydate BirthDate <> ; use default value of BirthDate
Person ENDS
me Person <> ; use default value of Person
การอางถึงขอมูลใน field ไดดวย name.fieldname เชน
.code
mov ax,me.mydate.DAY
mov edx,offset me.FirstName
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
188
6.5.12 LABEL Directive
LABEL directive นิยมใชเมื่อตองการใหขอมูลที่ตําแหนงเดียวกันสามารถอางถึงไดหลายขนาด เชน
.code
mov al,byte1 ; move 1 st byte
mov bx,word2 ; move third and fourth bytes
.data
byte1 label byte ; define first byte as byte1
word1 dw 2532h ; define first two bytes as word1
word2 label word ; define third and fourth bytes as word2
byte2 db 25h ; define third byte as byte2
db 32h ; define fourth byte
หมายเหตุ byte1 -> <- word1
byte2 -> <- word2
6.5.13 PTR operator
ใชเพื่อกําหนดขนาดของขอมูลที่ตองการ แทนขนาดของตัวแปรเดิมที่เคยกําหนดไว เชน .data
bytea db 22h ; bytea
db 35h ; bytea+1
worda dw 2672h ; worda
.code ; worda+1
mov ah,byte ptr worda ; ah = 72h
mov bl,byte ptr worda+1 ; bl = 26h
mov byte ptr worda,5 ; worda change from 72h to 5
mov ax,word ptr bytea ; ax = 3522h
32h
25h
25h
32h
22h
35h
72h
26h
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
189
หรือใชเพื่อกําหนดขนาดของขอมูลที่ตองการใด ๆ เชน lea ebx,mytable
mov BYTE PTR [ebx+5],0 หรือ mov [ebx+5],BYTE PTR 0
หมายเหตุ ในกรณีที่รูขนาดของขอมูลก็ไมจําเปนตองใช เชน mov [ebx+5],al
เพราะรูวา al มีขนาด 8 บิต
6.5.14 Offset operator ใชเพื่อกําหนด offset (ตําแหนงของหนวยความจํา) เชน
.DATA
MYDATA DB “Hello”
.CODE
mov eax,offset MYDATA ; นําตําแหนงของ MYDATA ใสใน eax ไมใชขอมูลของ MYDATA
หมายเหตุ offset ที่ใชกับการกําหนดหนวยความจําแบบ direct addressing mode จะมีความหมายเหมือนคําสั่ง lea
เชน
mov eax,offset MYDATA จะเหมือนกับ lea eax,MYDATA
แต ในกรณีของการกําหนดหนวยความจําแบบอื่น จะไมเหมือนกัน เพราะ offset มีการคํานวณตําแหนงของ
หนวยความจําในชวงการแปล (compile time) แต lea เปนคําสั่งภาษาเครื่องที่จะทําในชวง execution time ดังนั้น
ตําแหนงที่คํานวณไดจาก offset จะยังไมรูคาในเรจิสเตอรที่กําหนด ในชวงการแปลจะกําหนดใหเรจิสเตอรเหลานั้น
เปน 0 เชน
mov ebx,offset mydata
mov eax,offset[ebx] จะไดวา eax มีคาเปน 0 เพราะไมทราบคา ebx ในชวงการแปล
จะตางกับ mov ebx,offset mydata
lea eax,[ebx] จะไดวา eax มีคาเปนตําแหนงของ mydata เพราะทราบคาของ ebx ในชวง execution time
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
190
SUBROUTINES subroutine บางครั้งเรียกวา procedure, function หรือ subprogram เปนสวนยอยของโปรแกรมโดยมีการ
ต้ังช่ือ subroutine และ dummy argument หรือ dummy parameter (ถามี) เมื่อ เรียกใช ดวยคําสั่ง call หรือ
เรียกช่ือ จะมีการผาน actual argument หรือ actual parameter ไปยัง dummy argument หรือ actual parameter
และกระโดดไปทํางานใน subroutine และเมื่อทํางาน เสร็จ จะกลับมายังคําสั่งถัดจากคําสั่งที่เรียกใชตอไป
ตัวอยาง global variable dummy parameters
ช่ือ subroutine
Int m;
int foo(int i, int j)
{ local variable
int k;
สงคากลับ k = i+j;
return k;
}
main()
{ การเรียกใช actual parameters
m = foo(12,17);
}
ใน main() เมื่อมีการเรียกใช m = foo(12,17) จะมีการผาน actual parameter 12 ไปให dummy
parameter i และ 17 ไปให j ของ subroutine foo แลวกระโดดไปทํางานที่ subroutine foo ซึ่งจะกําหนดให k = i+j
ดังนั้น k = 29 และสงคากลับ มายัง main ซึ่งทําให m มีคา 29
หมายเหตุ สําหรับ IA-32 การสงคา 32 บิต กลับ จะใชเรจิสเตอร eax
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
191
PARAMETER PASSING เมื่อมีการเรียกใช subroutine อาจมีการสงผาน parameter ทางหนวยความจํา (global variable) ,
เรจิสเตอร หรือกองซอน (หรือผสมกัน) การผานทางเรจิสเตอรจะเร็วกวา แตมีขอจํากัด เนื่องจากจํานวนเรจิสเตอรมี
นอย ถามี parameter จํานวนมากไมสามารถผานทางเรจิสเตอรไดหมด การผานพารามิเตอรทาง global data ทําได
ชากวา แตผานไดมากเทาที่หนวยความจํามีพอ การผานพารามิเตอรทาง global variable และเรจิสเตอร ไมสามารถ
ใชกับ recursive subroutine ได ตองผานพารามิเตอรทางกองซอนเทานั้น
ในที่นี้จะกลาวถึงเฉพาะการผาน parameter ทางกองซอน เนื่องจากการผาน parameter ทางเรจิสเตอร
หรือ global variable ตรงไปตรงมา
ตามขอตกลงของภาษาระดับสูง เมื่อมีการเรียกใช subroutine จะเกิดกรอบกองซอน (activation record
หรือ stack frame) ดังนี้
เลขที่สูง ช้ีไปยังตําแหนง dynamic link ของ stack
frame กอนหนานี้ parameter
parameter
… จัดการโดยผูเรียก
parameter
parameter
return address
dynamic link
local variable
stack local variable จัดการโดยผูถูกเรียก
growth …
เลขที่ตํ่า local variable
หมายเหตุ return address และ dynamic link อาจแตกตางกันออกไปตามความเหมาะสมของแตละสถาปตยกรรม
ตําแหนงของ dynamic link เรียกวา frame pointer หรือ base pointer เปนตําแหนงฐาน ที่จะใชคํานวณ
ตําแหนงของ parameter และ local variable โดย parameter จะมีระยะหางจาก base pointer เปนบวก สวน local
variable จะมีระยะหางเปนลบ เชน ถาทุก ๆ ชองในภาพขางตน มีขนาด 4 ไบต ตําแหนงตาง ๆ จะเปน ดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
192
เลขที่สูง ช้ีไปยังตําแหนง dynamic link ของ stack
frame กอนหนานี้ parameter
parameter
. . . … จัดการโดยผูเรียก
fp+12 parameter
fp+8 parameter
fp+4 return address
fp dynamic link
fp-4 local variable
fp-8 local variable จัดการโดยผูถูกเรียก
stack . . . …
growth local variable
เลขที่ตํ่า
• ผูเรียก
จะดําเนินการตอไปนี้ - ถามี parameter กดคาหรือเลขที่ของ parameter (ขึ้นอยูกับวาเปนการสง parameter แบบไหน) ลง
บนกองซอนในชวงกระทําการตามลําดับ จากตัวแรกถึงตัวสุดทาย ถาเปนภาษาปาสคาล ตัวสุดทายจะอยูบนสุด แตถาเปนภาษาซี จะทํากลับกัน
- เรียกใชชุดคําสั่งยอยหรือฟงกชันที่ตองการ IA-32 มีคําสั่ง call ซึ่งทําหนาที่นี้โดยตรง คําสั่ง call จะกด
เลขที่กลับ (return address : เลขที่ของคําสั่งถัดจากคําสั่ง call) ลงบนกองซอนในชวงกระทําการ แลว
กระโดดไปทํางานที่ subroutine ที่ตองการ (สถาปตยกรรมบางแบบไมมีคําสั่ง call โดยตรง ในกรณีนี้
ตองกดเลขที่กลับมาทํางานตอ ลงบนกองซอนในชวงกระทําการ แลวใชคําสั่งกระโดด เพื่อไปทํางานที่ subroutine ตองการเอง)
- สําหรับการ call แบบ C ผูเรียกจะตองเอา parameters ทั้งหมดบนกองซอนออกเอง สวนการ call แบบ
Pascal ผูถูกเรียกจะจัดการสวนนี้เอง
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
193
ตัวอยาง สมมุติวา subroutine foo มี dummy parameters ดังนี้ foo(dpara1, dpara2, …, dparan)
และมีการเรียกใชดวย actual parameters ดังนี้ foo(apara1, apara2, …, aparan)
ก. การ call แบบ Pascal ผานพารามิเตอรจากซายไปขวา เขียนเปน ภาษาเอสเซมบลีของ IA-32 ได ดังนี้
push apara1
push apara2
…
push aparan
call foo
ข. การ call แบบ C ผานพารามิเตอรจากขวามาซาย เขียนเปน ภาษาเอสเซมบลีของ IA-32ได ดังนี้ push aparan
…
push apara1
call foo
add esp,total_parameters_sizes
• ผูถูกเรียก จะมีการดําเนินการ ดังตอไปน้ี
- กดคาโยงพลวัต (dynamic link) ลงบนกองซอนในชวงกระทําการ
- จองเนื้อที่ใหกับตัวแปรทองถิ่นบนกองซอนในชวงกระทําการ (หมายเหตุ สําหรับ IA-32 ถาเปน real
mode หรือ Intel 8086/8088 ควรทํา word boundary alignment โดยให จํานวนเนื้อที่ทั้งหมดตอง
หารดวย 2 ลงตัว และถาเปน Protected mode ควรทํา double boundary alignment โดยให จํานวน
เนื้อที่ทั้งหมดตองหารดวย 2 ลงตัว)
- สําหรับการ call แบบ Pascal จะตองเอา parameters ทั้งหมดบนกองซอนออก
เขียนเปนคําสั่งภาษาแอสเซมบลี IA-32 โดยใช ebp เปน base pointer และ esp เปน stack pointer ได
ดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
194
foo:
; prologue
push ebp
mov ebp,esp
; allocate local variable
sub esp,total_local_sizes
เมื่อ total_parm_sizes เปนเลขจํานวนเต็ม มีคาเทากับขนาดของ parameter รวมกันทั้งหมด
เมื่อผูถูกเรียกทํางานเสร็จ จะตองลบกรอบกองซอนทิ้ง วิธีการลบทําไดงาย ๆ โดยการใชคําสั่ง ตอไปนี้
ก. การ call แบบ Pascal
; epilogue
mov esp,ebp
pop ebp
ret total_parm_sizes
ข. การ call แบบ C
;epilogue
mov esp,ebp
pop ebp
ret
เมื่อ total_parm_sizes เปนเลขจํานวนเต็ม มีคาเทากับขนาดของ parameter รวมกันทั้งหมด คําสั่งแรก
เลื่อน esp ใหช้ีไปยังตําแหนงที่เก็บคาโยงพลวัต (ตําแหนงที่ช้ีโดย ebp) คําสั่งที่สองบรรจุคาโยงพลวัตไวใน ebp
เพื่อใหช้ีไปยังคาโยงพลวัตของกรอบกองซอนของตัวเรียกกอนหนานี้ แต esp ยังช้ีอยูที่ตําแหนงซึ่งเก็บเลขที่กลับของ
กรอบกองซอนที่กําลังลบอยู และคําสั่งที่สามกลับไปยังผูเรียก และลบ parameter ทั้งหมดทิ้ง เปนอันสิ้นสุดการ
ทํางานของผูถูกเรียก
สําหรับการ call แบบ STDCALL เปนลูกผสมระหวาง C กับ Pascal เปนการผาน parameters จากขวามา
ซาย
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
195
ในกรณีที่ subroutine มีจํานวนพารามิเตอรคงที่ เชน int foo(int I, int j, int k) มีจํานวนพารามิเตอรคงที่ 3
ตัว ในกรณีนี้ ผูถูกเรียกจะเอา parameters ทั้งหมดออกจาก stack เอง ดวยคําสั่ง ret total_parm_sizes
foo:
…
ret total_parm_sizes
การเรียกใช foo(apara1,apara2,apara3) ตองทําดังนี้
push apara3
push apara2
push apara1
call foo
สําหรับ subroutine ที่มีจํานวนพารามิเตอรไมคงที่ เชน int foo(int i, int j, …) ผูถูกเรียกไมรูจํานวน
พารามิเตอรที่แนนอน จึงไมสามารถเอา parameters ทั้งหมดออกจาก stack จึงใชคําสั่ง ret
foo:
…
ret
เปนหนาที่ของผูเรียกที่จะตองเอา parameters ทั้งหมดออกจาก stack เชน
ก. การเรียกใช foo(apara1,apara2) ตองทําดังนี้
push apara2
push apara1
call foo
add esp,8
ข. การเรียกใช foo(apara1,apara2,apara3) ตองทําดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
196
push apara3
push apara2
push apara1
call foo
add esp,12 SAVE REGISTERS
การเขียน subroutine ที่ดี ตองไมทําลาย registers ที่ผูเรียก ใชอยู จึงควรมีการ save คาใน register และ
restore คาเหลานั้นกลับ กอนที่จะ return
การเขียน subroutine สําหรับ IA-32 โดยมีการผานพารามิเตอรทางกองซอน มีการ save/restore register
และมีการผานคากลับทาง register eax มี skeleton ดังนี้
foo: ; prologue
push ebp
mov ebp,esp
; allocate local variable
sub esp,total_local_sizes
; save registers
; เชน ; push ebx
; push ecx
… คําสั่ง ของ subr … (เชน ทําลายคาใน ebx และ ecx) ระวัง หามทําลายคาใน ebp
… ทําลายคาใน eax ได แตตองใสคาที่จะสงกลับทาง eax กอน ret …
; restore registers
; เชน ; pop ecx
; pop ebx
; epilogue
mov esp,ebp
pop ebp
ret สําหรับ call แบบ C และ ret total_parm_sizes สําหรับการ call แบบ Pascal
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
197
RECURSIVE SUBROUTINE
subroutine ที่สามารถกลับมาเรียกตัวเองกอน return เรียกวา recursive subroutine จําเปนตองใชการผาน
parameter ในลักษณะกองซอน เชน ฟงกชัน fact เขียนดวยภาษา C ที่ใชคํานวณ factorial ในโปรแกรมตอไปนี้ #include <stdio.h>
int fact (int n)
{
if (n<=1) return 1;
return n*fact(n-1) /* return address 2*/;
}
main()
{
printf("%d\n",fact(3) /* return address 1 */);
}
สําหรับ fact เขียนเปน subroutine ตามขอตกลงของการ call แบบ C ดวยภาษาแอสเซมบลี IA-32 ได ดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
198
fact: ; prologue
push ebp
mov ebp,esp
; no local variable
; save register
push edx
cmp dword ptr [ebp+8],1 ; if (n<= 1)
jle ret_one ; return 1;
mov eax,[ebp+8] ; eax <- n
dec eax ; eax <- n-1
push eax ; fact(n-1)
call fact ;
mul dword ptr [ebp+8] ; return n*fact(n-1)
jmp ret_fact
ret_one:
mov eax,1 ; return 1
ret_fact:
; restore registers
pop edx
mov esp,ebp
pop ebp
ret
และมีการเรียกใช fact(3) ใน main() ดังนี้
push 3
call fact
add esp,4
เมื่อมีการเรียก fact(3) ใน main() จะเกิดกรอบกองซอน ดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
199
- เมื่อ n =3
3
return address 1
fp dynamic link
- เมื่อ n = 2
3
return address 1
dynamic link
2
return address 2
fp dynamic link
- เมื่อ n = 1
3
return address 1
dynamic link
2
return address 2
dynamic link
1
return address 2
fp dynamic link
- จากนั้นฟงกชัน fact จะ return 1 คาที่จะสงกลับไปคือ 1 และตําแหนงที่จะ return คือ return address 2 การ return
จะลบกรอบกองซอนทิ้ง และเลื่อน fp กลับ ตาม dynamic link ดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
200
3
return address 1
dynamic link
2
return address 2
fp dynamic link
ตรงตําแหนง return address 2 จะคํานวณคาที่ fact return คือ 1 กับคา n ในขณะนี้ คือ 2 จะได 2*1 = 2 แลว return
คาที่จะสงกลับไปคือ 2 และตําแหนงที่จะ return คือ return address 2 การ return จะลบกรอบกองซอนทิ้ง และ
เลื่อน fp กลับ ตาม dynamic link ดังนี้
3
return address 1
fp dynamic link
ตรงตําแหนง return address 2 จะคํานวณคาที่ fact return คือ 2 กับคา n ในขณะนี้ คือ 3 จะได 3*2 = 6 แลว return
คาที่จะสงกลับไปคือ 6 และตําแหนงที่จะ return คือ return address 1 การ return จะลบกรอบกองซอนทิ้ง และเลื่อน
fp กลับ ตาม dynamic link ซึ่งจะเปนอะไรก็ได เพราะไมมีกรอบกองซอนเหลืออยู จากนั้น main จะแสดงผลลัพธ
เปน 6
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
201
MACROS
ในการเขียนโปแกรมภาษาแอสเซมบลี บอยครัง้ที่มีการเขียนบล็อกของคําสั่งซ้ํา ๆ กันหลายครั้ง จึงเกิดแนวความคิดที่จะมีคําสั่งยอเพื่อแทนบล็อกของคําสั่ง โดยการตั้งช่ือใหกับบล็อกของคําสั่ง และใชช่ือเปนคําสั่งยอ
การตั้งช่ือและการกําหนดคําสั่งในบล็อก เรียกวา macro definition สวนการเรียกใช เรียกวา macro call ทุกครั้งที่มีการเรียกใช โดยการอางชื่อของ macro คําสั่งในบล็อกของ macro ที่มีช่ือดังกลาว จะนํามาแทนที่ช่ือน้ัน
โปรแกรมที่ทําหนาที่จดจํา macro definition และการแทนที่ช่ือดวยบล็อกของคําสั่ง เรียกวา macro processor
ตัวอยาง - macro definition
xy macro
add x,5
add y,10
endm
เมื่อ macro บอกใหรูวาเปน macro definition ในตัวอยางนี้ มีช่ือเปน xy และ endm บอกใหรูวาสิ้นสุด
บล็อกของคําสั่ง สวนคําสั่งในบล็อกไดแก add x,5 กับ add y,10 เรียกวาสวน body
- macro call เรียกช่ือของ macro เชน
xy
xy
จะมีการแทนชื่อ xy ดวยคําสั่งในสวนของ body เรียกวา expanding ดังนี้ add x,5
add y,10
add x,5
add y,10
macro processor
โปรแกรมภาษาแอสเสมบลี +
macro
โปรแกรมภาษาแอสเสมบลี
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
202
นอกเหนือจากการแทนที่ดวยคําสั่งในบล็อกแลว macro ยังมี facility อื่น ๆ เชน
• Macro Arguments
สามารถกําหนด dummy arguments ได เชน
- macro definition
add3 macro arg1,arg2,arg3
add x,arg1
add x,arg2
add x,arg3
endm
- macro call
add3 1,2,3
- expanding
add x,1
add x,2
add x,3
• Conditional Macro Expansion
อาจมีคําสั่งของ macro เพื่อตรวจสอบสภาวะในการ expanding เชน คําสั่ง AIF
- macro definition
vary macro arg0,count,arg1,arg2,arg3
arg0 add x,arg1
AIF (count EQ 1) .FINI
add x,arg2
AIF (count EQ 2) .FINI
add x,arg3
.FINI
endm
- macro call
vary loop1,3,a,b,c
vary loop2,2,a,b
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
203
vary loop3,1,a
- expanding
loop1 add x,a
add x,b
add x,c
loop2 add x,a
add x,b
loop3 add x,a
• Macro Call Within Macro Definition
เชน - macro definition
add1 macro arg1
add x,arg1
add y,arg1
endm
add2 macro arg1,arg2,arg3
add1 arg1
add1 arg2
add1 arg3
endm
- macro call
add2 a,b,c
- expanding
add x,a
add y,a
add x,b
add y,b
add x,c
add y,c
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
204
• Macro Definition Within Macro Definition
เชน - macro definition
add4 macro arg
add x,4
arg macro dummy
add x,5
add x,dummy
endm
add x,6
endm
- macro call
add4 add5
add5 a
- expanding
add x,4
add x,6
add x,5
add x,a
Macros V.S. Subroutines macro มีความแตกตางจาก subroutine คือ
- การ call macro กระทําในชวงการแปล (assemble หรือ compile time) โดยการ expanding ในขณะ
ที่ทํา expanding จะมีการแทน dummy parameter ดวย actual parameter (ถามี) สวน การ call
subroutine กระทําในชวงกระทําการ (execution time) เปนการจําตําแหนงของคําสั่งถัดไป และ
กระโดดไปยัง subroutine ที่ตองการ การสงผาน parameter ทําไดหลายแบบ เชน pass by value
หรือ pass by reference เปนตน
- ทุกครั้งที่มีการ call macro สวน body ของ macro definition จะถูก expand ทุกครั้งและกินเนื้อที่
เพิ่มขึ้นเทากับจํานวนครั้งที่มีการ call แตการ call subroutine จะกินเนื้อที่เทากับคําสั่ง call เทานั้น
subroutine ที่ถูก call ยังคงกินเนื้อที่เทาเดิม
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
205
6.5.15 MACRO และ ENDM ใชกําหนด macro definition
รูปแบบ name MACRO [parameter[:tag]] [,parameter[:tag]]...]
[LOCAL varlist]
statements
[EXITM [textitem]]
ENDM
เมื่อ
name เปนช่ือ macro
parameter เปน argument
:tag อาจเปน :REQ, :=default หรือ :VARARG. :REQ อยางใดอยางหนึ่ง
statements เปนคําสั่งใด ๆ
6.5.16 INCLUDE ใชเพื่อกําหนดชื่อแฟมที่จะนํามา source code มาแทรก เชน คําสั่งเหลานี้ STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12
NULL equ 0
GetStdHandle PROTO :DWORD
ReadFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WriteFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO :DWORD
มีเขียนไวแลวในแฟม (จะสรางแฟมใหมที่เก็บคําสั่งเหลานี้ก็ได) สําหรับ MASM32 มีอยูแลว ซึ่งอาจอยูใน
แฟม windows.inc, user32.inc, kernel32.inc จึงแทนไดดวยคําสั่ง include windows.inc
include user32.inc
include kernel32.inc
สําหรับ MASM615 มีอยูแลว ซึ่งอาจอยูในแฟม win.inc จึงแทนไดดวยคําสั่ง include win.inc
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
206
7.1 Floating-point instructions คําสั่งของ floating-pointing มี 5 รูปแบบ ดังนี้ General Floating-Point Instruction Formats
Instruction
First Byte Second Byte Optional Fields
1 11011 OPA 1 mod 1 OPB r/m s-i-b disp
2 11011 MF OPA mod OPB r/m s-i-b disp
3 11011 d P OPA 1 1 OPB R ST(I)
4 11011 0 0 1 1 1 1 OP
5 11011 0 1 1 1 1 1 OP
15-11 10 9 8 7 6 5 4 3 2 1
เมื่อ MF = Memory Format
00 – 32-bit real
01 – 32-bit integer
10 – 64-bit real
11 – 16-bit integer
P = Pop
0 – Do not pop stack
1 – Pop stack after operation
d = Destination
0 – Destination is ST(0)
1 – Destination is ST(i)
R XOR d = 0 – Destination OP Source
1 – Source OP Destination
ST(i) = Register stack element I
000 – Stack Top
001 – Second stack element
. . .
111 – Eight stack element
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
207
หมายเหตุ mod กับ r/m มีความหมายเหมือน integer instructions
instruction and format encoding F2XM1 – Compute 2ST(0) – 1 11011 001 1111 0000
FABS – Absolute Value 11011 001 1110 0001 FADD – Add ST(0) <- ST(0) + 32-bit memory 11011 000 mod 000 r/m
ST(0) <- ST(0) + 64-bit memory 11011 100 mod 000 r/m
ST(d) <- ST(0) + ST(i) 11011 d00 11 000 ST(i) FADDP –Add and Pop ST(0) <- ST(0) + ST(i) 11011 110 11 000 ST(i)
FBLD – Load Binary Coded Decimal 11011 111 mod 100 r/m
FBSTP – Store Binary Coded Decimal and Pop 11011 111 mod 110 r/m
FCHS – Change Sign 11011 001 1110 0000
FCLEX – Clear Exceptions 11011 011 1110 0010 FCMOVcc – Conditional Move on EFLAG Register Condition Codes mov if below (B) 11011 010 11 000 ST(i)
mov if equal (E) 11011 010 11 001 ST(i)
move if below or equal (BE) 11011 010 11 010 ST(i)
move if unordered (U) 11011 010 11 011 ST(i)
move if not below (NB) 11011 011 11 000 ST(i)
move if not equal (NE) 11011 011 11 001 ST(i)
move if not below or equal (NBE) 11011 011 11 010 ST(i)
move if not unordered (NU) 11011 011 11 011 ST(i) FCOM – Compare Real 32-bit memory 11011 000 mod 010 r/m
64-bit memory 11011 100 mod 010 r/m
ST(i) 11011 000 11 010 ST(i) FCOMP – Compare Real and Pop 32-bit memory 11011 000 mod 011 r/m
64-bit memory 11011 100 mod 011 r/m
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
208
ST(I) 11011 000 11 010 ST(i)
FCOMPP – Compare Real and Pop Twice 11011 110 11 011 001
FCOMI – Compare Real and Set EFLAGS 11011 011 11 110 ST(i)
FCOMIP – Compare Real, Set EFLAGS, and Pop 11011 111 11 110 ST(I)i
FCOS – Cosine of ST(0) 11011 001 1111 1111
FDECSTP – Decrement Stack-Top Pointer 11011 001 1111 0110 FDIV – Divide ST(0) <- ST(0) / 32-bit memory 11011 000 mod 110 r/m
ST(0) <- ST(0) / 64-bit memory 11011 100 mod 110 r/m
ST(d) <- ST(0) / ST(i) 11011 d00 1111 R ST(i) FDIVP – Divide and Pop ST(0) <- ST(0) / ST(i) 11011 110 1111 1 ST(i) FDIVR – Reverse Divide ST(0) <- 32-bit memory / ST(0) 11011 000 mod 111 r/m
ST(0) <- 64-bit memory / ST(0) 11011 100 mod 111 r/m
ST(d) <- ST(i) / ST(0) 11011 d00 1111 R ST(i) FDIVRP – Reverse Divide and Pop ST(0) <- ST(i) / ST(0) 11011 110 1111 0 ST(i)
FFREE – Free ST(i) Register 11011 101 1100 0 ST(i) FIADD – Add Integer ST(0) <- ST(0) + 16-bit memory 11011 110 mod 000 r/m
ST(0) <- ST(0) + 32-bit memory 11011 010 mod 000 r/m FICOM – Compare Integer 16-bit memory 11011 110 mod 010 r/m
32-bit memory 11011 010 mod 010 r/m FICOMP – Compare Integer and Pop 16-bit memory 11011 110 mod 011 r/m
32-bit memory 11011 010 mod 011 r/m FIDIV ST(0) <- ST(0) + 16-bit memory 11011 110 mod 110 r/m
ST(0) <- ST(0) + 32-bit memory 11011 010 mod 110 r/m FIDIVR
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
209
ST(0) <- ST(0) + 16-bit memory 11011 110 mod 111 r/m
ST(0) <- ST(0) + 32-bit memory 11011 010 mod 111 r/m FILD – Load Integer 16-bit memory 11011 111 mod 000 r/m
32-bit memory 11011 011 mod 000 r/m
64-bit memory 11011 111 mod 101 r/m FIMUL ST(0) <- ST(0) * 16-bit memory 11011 110 mod 001 r/m
ST(0) <- ST(0) * 32-bit memory 11011 010 mod 001 r/m
FINCSTP – Increment Stack Pointer 11011 001 1111 0111 FINIT – Initialize Floating-Point Unit FIST – Store Integer 16-bit memory 11011 111 mod 010 r/m
32-bit memory 11011 011 mod 010 r/m FISTP – Store Integer and Pop 16-bit memory 11011 111 mod 011 r/m
32-bit memory 11011 011 mod 011 r/m
64-bit memory 11011 111 mod 111 r/m FISUB ST(0) <- ST(0) – 16-bit memory 11011 110 mod 100 r/m
ST(0) <- ST(0) – 32-bit memory 11011 010 mod 100 r/m FISUBR ST(0) <- ST(0) – 16-bit memory 11011 110 mod 101 r/m
ST(0) <- ST(0) – 32-bit memory 11011 010 mod 101 r/m FLD – Load Real 32-bit memory 11011 001 mod 000 r/m
64-bit memory 11011 101 mod 000 r/m
80-bit memory 11011 011 mod 101 r/m
ST(i) 11011 001 11 000 ST(i)
FLD1 – Load + 1.0 into ST(i) 11011 001 1110 1000
FLDCW – Load Control World 11011 001 mod 101 r/m
FLDENV – Load FPU Environment 11011 001 mod 100 r/m
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
210
FLD2E – Load log2 (e) into ST(0) 11011 001 1110 1010
FLDL2T – Load log2 (10) into ST(0) 11011 001 1110 1001
FLDLG2 – Load log10 (2) into ST(0) 11011 001 1110 1100
FLDLN2 – Load log e (2) into ST(0) 11011 001 1110 1101
FLDPI – Load pi into ST(0) 11011 001 1110 1011
FLDZ – Load +0.0 into ST(0) 11011 001 1110 1110 FMUL – Multiply ST(0) <- ST(0) * 32-bit memory 11011 000 mod 001 r/m
ST(0) <- ST(0) * 64-bit memory 11011 100 mod 001 r/m
ST(0) <- ST(0) * ST(i) 11011 d00 1100 1 ST(i) FMULP – Multiply and Pop ST(0) <- ST(0) * ST(i) 11011 d00 11000 1 ST(i)
FNOP – No Operation 11011 001 1101 0000
FPATAN – Partial Arctangent 11011 001 1111 0011
FPREM – Partial Remainder 11011 001 1111 1000
FPREM1 – Partial Remainder (IEEE) 11011 001 1111 0101
FPTAN – Partial Tangent 11011 001 1111 0010
FRNDINT – Round to Integer 11011 001 1111 1100
FRSTOR – Restore FPU State 11011 101 mod 100 r/m
FSAVE – Store FPU State 11011 101 mod 110 r/m
FSCALE – Scale 11011 001 1111 1101
FSIN – Sine 11011 001 1111 1110
DSINCOS – Sine and Cosine 11011 001 1111 1011
FSQRT – Square Root 11011 001 1111 1010 FST – Store Real 32-bit memory 11011 001 mod 010 r/m
64-bit memory 11011 101 mod 010 r/m
ST(i) 11011 101 11 010 ST(i)
FSTCW – Store Control Word 11011 001 mod 111 r/m
FSTENV – Store FPU Environment 11011 001 mod 110 r/m FSTP – Store Real and Pop 32-bit memory 11011 001 mod 011 r/m
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
211
64-bit memory 11011 101 mod 011 r/m
80-bit memory 11011 011 mod 111 r/m
ST(i) 11011 101 11 011 ST(i)
FSTSW – Store Status Word into AX 11011 111 1110 0000
FSTSW – Store Status Word into Memory 11011 101 mod 111 r/m FSUB – Subtract ST(0) <- ST(0) – 32-bit memory 11011 000 mod 100 r/m
ST(0) <- ST(0) – 64-bit memory 11011 100 mod 100 r/m
ST(d) <- ST(0) – ST(i) 11011 d00 1110 R ST(i) FSUBP – Subtract and Pop ST(0) <- ST(0) – ST(i) 11011 110 1110 1 ST(i) FSUBR – Reverse Subtract ST(0) <- ST(0) – 32-bit memory 11011 000 mod 101 r/m
ST(0) <- ST(0) – 64-bit memory 11011 100 mod 101 r/m
ST(d) <- ST(0) – ST(i) 11011 d00 1110 R ST(i) FSUBRP – Reverse Subtract and Pop ST(I) <- ST(i) – ST(0) 11011 110 1110 0 ST(i)
FTST – Test 11011 001 1110 0100
FUCOM – Unordered Compare Real 11011 101 1110 0 ST(i)
FUCOMP – Unordered Compare Real and Pop 11011 010 1110 1001 FUCOMPP – Unordered Compare Real and Pop Twice 11011 010 1110 1001 FUCOMI – Unordered Compare Real and Set EFLAGS 11011 011 11 101 ST(i) FUCOMPI – Unordered Compare Real, Set EFLAGS, and Pop 11011 111 11 101 ST(i)
FXAM - Examine 11011 001 1110 0101
FXCH – Exchange ST(0) and ST(I) 11011 001 1100 1 ST(i)
FXTRACT – Extract Exponent and Significand 11011 001 1111 0100
FYL2X – ST(1) * log 2 (ST(0)) 11011 001 1111 00001
FYL2XP1 – ST(1) * log 2 (ST(0) + 1.0) 11011 001 1111 1001
FWAIT – Wait until FPU Ready 11011 1011
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
212
IA-32 CPU Integer Unit Floating Point unit (math coprocessor) EAX st(0) EBX st(1) ECX st(2) EDX st(3) คําส่ัง fld, fst
St(4) จะมีผลตรงนี้ EBP st(5) ESP st(6) ESI st(7) EDI Control EIP status EFLAGS
high address MEMORY คําส่ัง push, pop, call, ret
ESP จะมีผลตรงนี้ low address
CS
DS
SS
ES
FS
GS
stack
.data
ขอมูล .code
คําสั่ง
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
213
ในที่นี้จะเร ียนเฉพาะคําสัง่บางคําสั่งทีจ่ําเปนเทานัน้ I. Initialize FINIT
ต.ย. .code
finit ; st(0)
…
; st(7)
II. Data Movement 1. FLD mem_real
ต.ย. .data
x dd 1.5
y dd -2.3
z dd 7.5
.code
finit ; st(0)-st(7) empty
fld x
; st(0)
; st(1)-st(7) empty
fld y
; st(0)
; st(1)
; st(2)-st(7) empty
fld z
; st(0)
; st(1)
; st(2)
; st(3)-st(7) empty
1.5
-2.3
1.5
7.5
-2.3
1.5
empty
…
empty
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
214
หมายเหตุ สําหรับ integer ใหใชคําสั่ง FILD mem_int
2. FST mem_real
ต.ย. .data
x dd ?
.code
finit
…
; st(0)
; st(1)
; st(2)
fst x ; x <- 7.5
; st(0)
; st(1)
; st(2)
หมายเหตุ สําหรับ integer ใหใชคําสั่ง FIST mem_int
3. FSTP mem_real
ต.ย. .data
x dd ?
.code
…
; st(0)
; st(1)
; st(2)
fstp x ; x <- 7.5
7.5
-2.3
1.5
7.5
-2.3
1.5
7.5
-2.3
1.5
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
215
; st(0)
; st(1)
หมายเหตุ สําหรับ integer ใหใชคําสั่ง FISTP mem_int
III. Arithmetic instructions
บวก (ADD)
คําสั่ง ความหมาย FADD st(0) <- st(0) + st(1)
FADD st(i) st(0) <- st(0) + st(i)
FADD st(0),st(i) st(0) <- st(0) + st(i)
FADD st(i),st(0) st(i) <- st(i) + st(0)
FADD mem_real st(0) <- st(0) + mem_real
FIADD mem_int st(0) <- st(0) + mem_int
FADDP st(i),st(0) st(i) <- st(i) + st(0) , pop
destination <- destination + source
ลบ (SUB)
เหมือนบวก แทน ADD ดวย SUB แตมีคําสั่ง SUBR ซึ่งมีความหมาย destination <- source – destination
เชน FSUBRP st(i),st(0) หมายถึง st(i) <- st(0) – st(i) , pop
คูณ (MUL)
เหมือนบวก แทน ADD ดวย MUL
หาร (DIV)
เหมือนบวก แทน ADD ดวย DIV แตมีคําสั่ง DIVR ซึ่งมีความหมาย destination <- source / destination
เชน FDIVRP st(i),st(0) หมายถึง st(i) <- st(0) / st(i) , pop
-2.3
1.5
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
216
IV. รอหรือไมรอ เนื่องจาก integer unit และ floating point unit (coprocessor) ของ IA-32 processor ทํางานขนานกัน
แตใชหนวยความจํารวมกัน ดังนั้น บางเวลาตองทํา synchronize ระหวางกัน โดยใชคําสั่ง FWAIT เมื่อใชคําสั่งนี้ ถา
floating point unit ไมวาง (busy) integer unit จะตองรอจนกวา floating point unit จะวาง
เพื่อไมใหผูใชตองกังวลเกี่ยวกับการ synchronize ระหวาง unit ทั้งสอง ทุกคําสั่งของ coprocessor จะมี
คําสั่ง fwait ไวขางหนาเสมอ เชน กรณีที่ทานเขียน ดังนี้ fld dword ptr [ebp]
fld dword ptr [ebp+4]
คําสั่งภาษาเครื่องที่ได จะมีลักษณะ ดังนี้ fwait
fld dword ptr [ebp]
fwait
fld dword ptr [ebp+4]
อยางไรก็ตามในบางสถานะการณ ทานตองระมัดระวัง เชน กรณีตอไปน้ี fld myvar
fwait
mov word ptr myvar,0
mov word ptr myvar+2,0
ถาไมมีคําสั่ง fwait หลัง fld ถา Coprocessor ไมพรอมที่จะ load คาที่ myvar แลวไมมีคําสั่ง fwait กรณีนี้
CPU จะใส คา 0 ไปที่ myvar ทําใหคาที่ Coprocessor เมื่อพรอมที่จะ load ไมถูกตอง เปนตน อีกตัวอยางหนึ่ง เชน
fistp myvar
fwait
mov ax,word ptr myvar
mov dx,word ptr myvar+2
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
217
ตัวอยาง การคํานวณบวกลบคูณหาร ; X = (7.5*Y)+((Z-3.7)/2.0);
; POSTFIX FORM OF (7.5*Y)+((Z-3.7)/2.0); IS 7.5 Y * Z 3.7 - 2.0 / +
.data
x dd ?
y dd 2.4E1 ; y = 24.0
z dd 1.0E-1 ; z = 0.1
t1 dd 7.5
t2 dd 3.7
t3 dd 2.0
.code
start:
finit ; st(0)-st(7) empty
fld t1 ; 7.5
; st(0)
fld y
; st(0)
; st(1)
fmulp st(1),st(0)
; st(0)
fld z
; st(0)
; st(1)
7.5
24.0
7.5
7.5 * 24.0
0.1
7.5 * 24.0
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
218
fld t2 ; 3.7
; st(0)
; st(1)
; st(2)
fsubp st(1),st(0)
; st(0)
; st(1)
fld t3 ; 2.0
; st(0)
; st(1)
; st(2)
fdivp st(1),st(0)
; st(0)
; st(1)
faddp st(1),st(0)
; st(0)
fstp x ; x <- (7.5 * 24.0) + ((0.1 – 3.7)/2.0) st(0)-st(7) empty
fwait
end start
3.7
0.1
7.5 * 24.0
0.1 – 3.7
7.5 * 24.0
2.0
0.1 - 3.7
7.5 * 24.0
(0.1 – 3.7)/2.0
7.5 * 24.0
(7.5 * 24.0) + ((0.1 – 3.7)/2.0)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
219
V. Comparing Numbers การเปรียบเทียบ
คําสั่ง ความหมาย FCOM เปรียบเทียบคาใน st(0) กับ source st(1)
FCOM st(i) เปรียบเทียบคาใน st(0) กับ source st(i)
FCOM mem_real เปรียบเทียบคาใน st(0) กับ source mem_real
FICOM mem_int เปรียบเทียบคาใน st(0) กับ source mem_int
FCOMP เปรียบเทียบคาใน st(0) กับ source st(1) , pop
FCOMP st(i) เปรียบเทียบคาใน st(0) กับ source st(i) , pop
FCOMP mem_real เปรียบเทียบคาใน st(0) กับ source mem_rea, popl
FICOMP mem_int เปรียบเทียบคาใน st(0) กับ source mem_int, pop
FCOMPP เปรียบเทียบคาใน st(0) กับ source st(1) , pop, pop
หลังเปรียบเทียบบิต c0 และ c3 ใน status register จะถูกกําหนด ดังนี้
C3 c0
0 0 st(0) > source
0 1 st(0) < source
1 0 st(0) = source
1 1 เปรียบเทียบกันไมได
จากนั้นใหนํา คาใน status register ของ floating point unit ไปใสใน register ax ของ integer unit แลวนํา
คาใน ah ใสใน flags register จากนั้นใชคําส่ัง conditional jump (เหมือนการเปรียบเทียบ unsigned integer: ja,
jb, je) ดังนี้
.data
status dw ?
.code
fcompp ; compares the value in ST(0) to the number in ST(1), discards both
fstsw status
fwait
mov ax,status
sahf ; Store AH into Flags
ja label1 ; if st(0) > st(1) jmp label2 ; if st(0) <= st(1)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
220
…
หมายเหตุ 80287 ขึ้นไป สามารถใชคําสั่ง fstsw ax ไดโดยตรง (แทน fstsw status, fwait และ mov ax,status ไม
ตองมีตัวแปร status)
ต.ย. .data
x dd 1.2
y dd -5.3
.code
finit ; st0-st7 empty
fld x ; st0
fld y ; st0
; st1
fcompp ; st0-st7 empty status register in floating unit
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
C3 C0
fstsw ax ; ax register in integer unit
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
sahf ; EFLAGS in integer unit
31 … 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ZF CF
ja L1 ; false
jmp L2 ; true
L1:
…
L2:
1.2
-5.3
1.2
0 1
0 1
0 1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
221
VI. Transcendental Functions
1. LOGS : The log to the base n of any number x, where x is greater than 0, can be found as shown here:
log n(2)*log2(x)
หมายเหตุ logb(a) = logc(a) / logc(b)
เชน log10(x) = log2(x) / log2(10) = log2(x) * log10(2)
.data
x dd ?
.code
…
fldlg2
fld x
fyl2x ; st(1) <- st(1)*log2(st(0)); pop where 0 < x < infinity and -infinity < Y < infinity
fstp x
fwait
…
2. ANTILOGS : This is the general approach to finding the antilog to the base n of some number x:
nx = 2x*log2(n)
Thus, to find common and natural antilogs, you need the instructions FLD1 (load constant 1), FLDL2E
(load log2(e)), FLDL2T (load log2(10)), F2XM1 (2x – 1 where 0 <= x <= 0.5), and FSCALE (st0*2st1). Since
F2XM1 can compute when 0 <= x <= 0.5, so the argument must be decomposed into its integer portions
and fraction portions with FRNDINT and FSUB.
วิธีการ 1. คํานวณ x*log2(n)
2. จากนั้น แยกเปนสองสวน คือ สวนจํานวนเต็ม กับ สวนที่เปนเศษ
3. นําสวนที่เปนเศษมาหาร 2 เพื่อใหมีคาอยูในชวง 0 <= x <= 0.5
4. ใชคําสั่ง F2XM1 เพื่อหาคา 2x – 1 เมื่อ x เปนคาที่ได จากขอ 3
5. บวกคาในขอ 4 ดวย 1 จะได 2x
6. นําคาในขอ 5 คูณกัน จะได 2สวนที่เปนเศษ (หมายเหตุ 2สวนที่เปนเศษ/2 * 2สวนที่เปนเศษ/2 =2สวนที่เปนเศษ)
7. ใชคําสั่ง FSCALE เพื่อคํานวณ 2สวนที่เปนเศษ * 2สวนจํานวนเต็ม จะไดคาตามที่ตองการ เขียนเปนโปรแกรมได ดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
222
.386
.model flat,stdcall
falog10 PROTO
.data
@OLD_CW dw ?
@NEW_CW dw ?
.code
; find antilog10( x) where x is on top of stack , leave result on top of stack
falog10 proc uses eax
fldl2t ; calculate y = x*log2(10) note! use fldl2e for log2(e) find faloge
fmulp st(1),st(0)
fld st(0) ; duplicate y
fstcw @OLD_CW ; save old control word
fwait
mov ax,@OLD_CW ; change rounding mode to "truncate toward zero"
or ax,0c00h
mov @NEW_CW,ax
fldcw @NEW_CW ; set new control word
frndint ; get integer part, n
fldcw @OLD_CW ; restore old control word
fld st(0) ; duplicate n
fxch st(2) ; excahnge y to top
fsubrp st(1),st(0) ; find fraction part .z = y - n
fld1 ; load 1
fchs ; change to -1
fxch st(1) ; exchange .z to top
fscale ; find .z*2**(-1) or .z/2
fstp st(1) ; discard -1
f2xm1 ; find 2**(.z/2) - 1
fld1 ; load 1
faddp st(1),st(0) ; correct to 2**(.z/2)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
223
fmul st(0),st(0) ; square result get 2**(.z)
fscale ; find 2**(.z)*2**(n)
fstp st(1) ; discard n result on top
falog10 endp
end 3. SINE, COSINE, TANGENT
สําหรับ 80387 เปนตนไป สามารถคํานวณไดโดยตรงดวยคําสั่ง FSIN, FCOS, และ FTAN VII. INPUT and OUTPUT
1. ATOF: ฟงกชัน atof ทําหนาที่เปลี่ยน string ซึ่งมีรูปแบบ ดังนี้ [sign][digits][.[digits]][E|e[sign][exp]]
ใหเปน real สําหรับ coprocessor
วิธีการ 1. มองสวน mantissa เหมือนเลขจํานวนเต็ม โดยการคํานวณสวน mantissa แบบเดียวกับ atoi (ดูภาคผนวก ก) แต
คํานวณดวย real คือใช fimul (ดวย 10) และ fiadd (ดวยเลขที่ตําแหนงตาง ๆ) ใหจําตําแหนงของจุดทศนิยมดวย
2. คํานวณสวน exponent
3. ลบสวน exponent ดวย ตําแหนงจุดทศนิยม
4. คํานวณ 10exponent โดยใช antilog10(exponent)
5. นํา mantissa ในขอ 1. คูณกับ 10exponent ในขอ 4. จะไดคา real ตามตองการ
เชน 127.95E32
mantissa = 12795 ตําแหนงจุดทศนิยม = 2
exponent = 32
exponent = 32-2 = 30
หา antilog10(30)
ผลลัพธ = 12795 * antilog10(30)
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
224
2. FTOA : ฟงกชัน ftoa ทําหนาที่เปลี่ยน real ใหเปน string ซึ่งมีรูปแบบ ดังนี้ +0.000000000000000000E+000
วิธีการ 1. ใช FXAM เพื่อตรวจสอบเลข real ถาไมปรกติ แสดง string ที่กําหนดไวแลว แลวเลิกทํา มิฉะนั้นปรกติทําขอตอไป
2. ใช FXTRACT เพื่อแยก real ที่ st(0) ใหเปน mantissa และ exponent จะได mantissa อยูที่ st(0) และ exponent
อยูที่ st(1)
3. เปลี่ยน exponent ในขอ 2. ซึง่เปน 2 ยกกําลัง ใหเปน 10 ยกกําลัง โดยใช antilog
4. ปรับ mantissa ใหเปน integer ดวยการปรับสวน exponent
5. นําสวน mantissa ในขอ 4 เปลี่ยนเปน 18-digit BCD โดยใชคําสั่ง fbstp mant เมื่อ mant เปนที่เก็บ 18-digit
BCD จากนั้นเปลี่ยนเปน ASCII
6. เปลี่ยน exponent(y) ใหเปน ASCII จะได string ตามตองการ
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
225
ภาคผนวก ก.
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
226
ฟงกชันที่ใชเขียนทุกฟงกชันที่มีการ return คา จะผานทาง eax
1. ฟงกชันของ WIN32 API (ใหดูที่ WIN32 help file) ที่ใชมีดังนี้ GetStdHandle, ReadFile, WriteFile, ExitProcess
2. ฟงกชันที่เขียนเอง มีดังนี้ ก. atoi ใชแปลง string ของตัวเลขใหเปน signed integer
มีวิธีการดังนี้ ตัด ‘ ‘ ทิ้ง จําเครื่องหมายถามี
กําหนดให คําตอบเทากับ 0
ทําซ้ํา ๆ ถายังเปนอักขระตัวเลข เปลี่ยน ASCII code ของตัวเลขเปน integer โดยการ and ดวย 0fh
คูณคําตอบดวย 10 และบวกดวย integer ขางตน
ถาเครื่องหมายเปนลบ ทําคําตอบใหเปน negative จะไดคําตอบเปน signed integer ตามตองการ
เชน ‘ ‘,’ ‘,‘-‘,’1’,’2’,’5’ เทากับ –(((((0*10)+1)*10+2)*10)+5)
ข. itoa ใชแปลง signed integer ใหเปน ASCIIZ (terminated with 0) string และสงความยาวของ
string กลับ
มีวิธีการดังนี้ ใหตัวเลขที่ตองกาเปลี่ยนเปนคําตอบ จําเครื่องหมาย ถาเปนเลขลบทําใหเปนเลขบวก ทําซ้ํา ๆ จนกวาคําตอบเปน 0
หารคําตอบดวยเลขฐาน เปลี่ยนเศษเปน อักขระ นํามาจัดเรียงจากขวามาซาย ถาเครื่องหมายที่จําเปนลบ ใสอักขระ ‘-‘ ไวขางหนา
เชน -125 ฐาน 10
125/10 = 12 เศษ 5 บวกดวย 30h เปลี่ยนเปน ‘5’ เก็บไวขวาสุด
12/10 = 1 เศษ 2 บวกดวย 30h เปลี่ยนเปน ‘2’ เก็บตอมาทางซาย
1/10 = 0 เศษ 1 บวกดวย 30h เปลี่ยนเปน ‘1’ เก็บตอมาทางซาย
เลขลบใส ‘-‘ ขางหนา จะได ‘-‘,’1’,’2’,’5’,0
คาที่สงกลับทาง eax = 4
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
227
วิธีสราง library ของฟงกชันที่เขียนขึ้นเองทําดังนี้
mylib.asm
assembler ใชคําสั่ง ML /c /coff mylib.asm
mylib.obj
linker ใชคําสั่ง link –lib /SUBSYSTEM:CONSOLE mylib.obj /out:mylib.lib
หรือ link32 –lib /SUBSYSTEM:CONSOLE mylib.obj /out:mylib.lib
mylib.lib
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
228
เมื่อ mylib.asm เขียน ดังนี้
.386
.model flat, stdcall
atoi PROTO :DWORD
itoa PROTO :DWORD,:DWORD,:DWORD
.code
; int atoi(char *atoi_buff); --- Convert ASCII string to 32-bit signed integer.
blank equ 20h ; ASCII blank character
tab equ 09h ; ASCII tab character
atoi proc USES ebx ecx edx atoi_buff:DWORD
mov esi,atoi_buff
xor ebx,ebx ; initialize forming answer
xor ecx,ecx ; initialize sign flag
atoi1: mov al,[esi]
inc esi ; scan off whitespace
cmp al,blank ; ignore leading blanks
je atoi1
cmp al,tab ; ignore leading tabs
je atoi1
cmp al,'+' ; if + sign, proceed
je atoi2
cmp al,'-' ; is it - sign?
jne atoi3 ; no, test if numeric
dec ecx ; was - sign, set flag, for negative result
atoi2: mov al,[esi] ; get next character
inc esi
atoi3:cmp al,'0' ; is character valid?
jb atoi4 ; jump if not '0' to '9'
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
229
cmp al,'9'
ja atoi4 ; jump if not '0' to '9'
and eax,0fh ; isolate lower four bits
xchg ebx,eax ; previous answer x 10
mov edx,10
mul edx
add ebx,eax ; add this digit
jmp atoi2 ; convert next digit
atoi4: mov eax,ebx ; put result into EAX
jecxz atoi5 ; jump if sign flag clear
neg eax ; make result negative
atoi5:
ret ; back to caller
atoi endp
; void itoa(int i, int radix, char *itoa_buff); --- Convert 32-bit integer to ASCII string
itoa proc USES ebx edx esi i:DWORD, radix:DWORD, itoa_buff:PTR BYTE
mov eax,i
mov esi,itoa_buff
add esi,11 ; advance to end of buffer
push esi ; and save that address.
or eax,eax ; test sign of 32-bit value,
pushfd ; and save sign on stack.
jns itoa1 ; jump if value was positive.
neg eax ; find absolute value.
itoa1: mov edx,0 ; divide value by radix to extract
div radix ; next digit for forming string
add dl,'0' ; convert remainder to ASCII digit
cmp dl,'9' ; in case converting to hex ASCII,
jle itoa2 ; jump if in range 0-9,
add dl,'A'-'9'-1 ; correct digit if in range A-F
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
230
itoa2: dec esi ; back up through buffer
mov [esi],dl ; store this character into string
or eax,eax
jnz itoa1 ; no, convert another digit
popfd ; was original value negative?
jns itoa3 ; no, jump
dec esi ; yes, store sign into output
mov byte ptr [esi],'-'
itoa3: pop eax ; calculate length of string
sub eax,esi
; move string to the beginning of itoa_buff
mov edx,itoa_buff
itoa4: cmp eax,0
je exit_itoa
mov bl,[esi]
mov [edx],bl
inc edx
inc esi
dec eax
jmp itoa4
exit_itoa:
; fill zero of string
mov [edx],DWORD PTR 0
ret ; back to caller
itoa endp
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
231
และมีวิธีการเรียกใช ดังตัวอยาง ตอไปนี้
.386
.model flat, stdcall
option casemap :none ; case sensitive
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12
NULL equ 0
GetStdHandle PROTO :DWORD
ReadFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WriteFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO :DWORD
atoi PROTO :DWORD
itoa PROTO :DWORD,:DWORD,:DWORD
.data
stdin_hFile dd ?
stdout_hFile dd ?
inbuff db 256 dup(?)
NumberOfBytesRead dd ?
NumberOfBytesWrite dd ?
outbuff db 12 dup(?)
N dd ?
.code
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
232
start:
; First get STD_INPUT_HANDLE and STD_OUTPUT_HANDLE
invoke GetStdHandle,STD_INPUT_HANDLE
mov stdin_hFile,eax
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout_hFile, eax
; read N
; step1: read string
invoke ReadFile,stdin_hFile,ADDR inbuff,256,ADDR NumberOfBytesRead,NULL
; step 2: convert string to signed integer
invoke atoi,ADDR inbuff
; step 3: keep in N
mov N,eax
; write N
; step 1: convert signed integer (N) to string
invoke itoa,N,10,ADDR outbuff
; length of string is in eax
; step 2: write string
invoke WriteFile,stdout_hFile,ADDR outbuff,eax,ADDR NumberOfBytesWrite,NULL
; exit process
invoke ExitProcess,0
end start
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
233
ตองแกไข buildc.bat ดังนี้ @echo off
REM The following three lines can be customized for your system:
REM ********************************************BEGIN customize
SET PATH=C:\MASM32\BIN;%PATH%
SET INCLUDE=C:\MASM32\INCLUDE
SET LIB=C:\MASM32\LIB
REM ********************************************END customize
ML /c /Fl /coff %1.asm
if errorlevel 1 goto terminate
LINK /MAP /SUBSYSTEM:CONSOLE %1.obj user32.lib kernel32.lib mylib.lib
if errorlevel 1 goto terminate
dir %1.*
:terminate
และ make32.bat ดังนี้ @echo off
REM The following three lines can be customized for your system:
REM ********************************************BEGIN customize
SET PATH=C:\MASM615;%PATH%
SET INCLUDE=C:\MASM615\INCLUDE
SET LIB=C:\MASM615\LIB
REM ********************************************END customize
ML /c /Fl /coff %1.asm
if errorlevel 1 goto terminate
LINK32 /MAP /SUBSYSTEM:CONSOLE %1.obj user32.lib kernel32.lib mylib.lib
if errorLevel 1 goto terminate
dir %1.*
:terminate
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
234
ภาคผนวก ข.
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
235
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
236
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
237
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
238
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
239
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
240
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
241
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
242
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
243
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
244
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
245
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
246
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
247
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
248
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
249
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
250
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
251
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
252
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
253
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
254
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
255
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
256
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
257
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
258
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
259
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
260
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
261
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
262
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
263
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
264
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
265
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
266
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
267
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
268
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
269
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
270
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
271
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
272
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
273
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
274
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
275
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
276
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
277
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
278
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
279
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
280
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
281
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
282
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
283
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
284
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
285
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
286
ตัวอยาง ตองการเขียนโปรแกรมภาษาแอสเซมบลีสําหรับ MASM32 หรือ MASM615 เพื่ออานเลขจํานวนเต็มบวก (N)
และพิมพคา Factorial ของเลขดังกลาว (N!)
ขั้นตอนที่ 1 ใหคิดกอน ดังนี้ เนื่องจาก N! = N*(N-1)*(N-2)* …*2*1 หรือ = 1* N*(N-1)*(N-2)* …*2
ดังนั้น
อานขอมูลมาเก็บที่ N
เริ่มตนให FAC <- 1 FAC <- FAC*N FAC <- 1*N
N <- N-1 N <- N-1
FAC <- FAC*N FAC <- 1*N*(N-1)
N <- N-1 N <- N-2 …
FAC <- FAC*N FAC <- 1*N*(N-1)*…*2
N <- N-1 N มีคานอยกวา 2
แสดงผลลัพธของ FAC
หมายเหตุ ทํา ซ้ําจนกวา N มีคานอยกวา 2
ขั้นตอนที่ 2 เขียนเปน pseudo code ได ดังนี้ read N
FAC <- 1
while N ≥ 2 do begin FAC <- FAC*N
N <- N-1 end
ใหทดลองใสขอมูลเมื่อ N เปน 0, 1, 2, 3 แลวทําตามขั้นตอนที่เขียน ตรวจสอบวาคําตอบถูกหรือไม
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
287
ขั้นตอนที่ 3 เขียนเปนภาษาสัญลักษณดวยคําสั่งในหัวขอ 2.1 (แบบฝกหัดขอ 2) ได ดังนี้
READ N
MOV FAC,1
L1: CMP N,2
JL L2
MUL FAC,N
SUB N,1
JMP L1
L2: WRITE FAC
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
288
ขั้นตอนที่ 4 เขียนเปนภาษาแอสเซมบลีของ MASM32 หรือ MASM615 ไดดังนี้ ; File: factorial.asm
.386
.model flat, stdcall
option casemap :none ; case sensitive
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12
NULL equ 0
GetStdHandle PROTO :DWORD
ReadFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WriteFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO :DWORD
atoi PROTO :DWORD
itoa PROTO :DWORD,:DWORD,:DWORD
.data
stdin_hFile dd ?
stdout_hFile dd ?
inbuff db 256 dup(?)
NumberOfBytesRead dd ?
NumberOfBytesWrite dd ?
outbuff db 12 dup(?)
N dd ?
prompt1 db 'Enter a number to find factorial (must be integer greather than zero):'
prompt1_length dd $-prompt1
prompt2 db 'Factorial = '
prompt2_length dd $-prompt2
newline db 0dh,0ah ; carriage return and linefeed
FAC dd 1 ; initialize FAC to 1
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
289
.code
; int atoi(char *atoi_buff); --- Convert ASCII string to 32-bit signed integer.
blank equ 20h ; ASCII blank character
tab equ 09h ; ASCII tab character
atoi proc USES ebx ecx edx atoi_buff:DWORD
mov esi,atoi_buff
xor ebx,ebx ; initialize forming answer
xor ecx,ecx ; initialize sign flag
atoi1: mov al,[esi]
inc esi ; scan off whitespace
cmp al,blank ; ignore leading blanks
je atoi1
cmp al,tab ; ignore leading tabs
je atoi1
cmp al,'+' ; if + sign, proceed
je atoi2
cmp al,'-' ; is it - sign?
jne atoi3 ; no, test if numeric
dec ecx ; was - sign, set flag, for negative result
atoi2: mov al,[esi] ; get next character
inc esi
atoi3:cmp al,'0' ; is character valid?
jb atoi4 ; jump if not '0' to '9'
cmp al,'9'
ja atoi4 ; jump if not '0' to '9'
and eax,0fh ; isolate lower four bits
xchg ebx,eax ; previous answer x 10
mov edx,10
mul edx
add ebx,eax ; add this digit
jmp atoi2 ; convert next digit
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
290
atoi4: mov eax,ebx ; put result into EAX
jecxz atoi5 ; jump if sign flag clear
neg eax ; make result negative
atoi5:
ret ; back to caller
atoi endp
; void itoa(int i, int radix, char *itoa_buff); --- Convert 32-bit integer to ASCII string
itoa proc USES ebx edx esi i:DWORD, radix:DWORD, itoa_buff:PTR BYTE
mov eax,i
mov esi,itoa_buff
add esi,11 ; advance to end of buffer
push esi ; and save that address.
or eax,eax ; test sign of 32-bit value,
pushfd ; and save sign on stack.
jns itoa1 ; jump if value was positive.
neg eax ; find absolute value.
itoa1: mov edx,0 ; divide value by radix to extract
div radix ; next digit for forming string
add dl,'0' ; convert remainder to ASCII digit
cmp dl,'9' ; in case converting to hex ASCII,
jle itoa2 ; jump if in range 0-9,
add dl,'A'-'9'-1 ; correct digit if in range A-F
itoa2: dec esi ; back up through buffer
mov [esi],dl ; store this character into string
or eax,eax
jnz itoa1 ; no, convert another digit
popfd ; was original value negative?
jns itoa3 ; no, jump
dec esi ; yes, store sign into output
mov byte ptr [esi],'-'
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
291
itoa3: pop eax ; calculate length of string
sub eax,esi
; move string to the beginning of itoa_buff
mov edx,itoa_buff
itoa4: cmp eax,0
je exit_itoa
mov bl,[esi]
mov [edx],bl
inc edx
inc esi
dec eax
jmp itoa4
exit_itoa:
; fill zero of string
mov [edx],DWORD PTR 0
ret ; back to caller
itoa endp
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
292
L0:
; First get STD_INPUT_HANDLE and STD_OUTPUT_HANDLE
invoke GetStdHandle,STD_INPUT_HANDLE
mov stdin_hFile,eax
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout_hFile, eax
; write string of prompt1
invoke WriteFile,stdout_hFile,ADDR prompt1,prompt1_length,ADDR NumberOfBytesWrite,NULL
; read N
invoke ReadFile,stdin_hFile,ADDR inbuff,256,ADDR NumberOfBytesRead,NULL
invoke atoi,ADDR inbuff
mov N,eax
; FAC is initialized to 1
L1: cmp N,2
jl L2
; MUL FAC,N
mov eax,FAC
imul N
mov FAC,eax
; SUB N,1
dec N
jmp L1
L2:
; write string of prompt1
invoke WriteFile,stdout_hFile,ADDR prompt2,prompt2_length,ADDR NumberOfBytesWrite,NULL
; write FAC
invoke itoa,FAC,10,ADDR outbuff
invoke WriteFile,stdout_hFile,ADDR outbuff,eax,ADDR NumberOfBytesWrite,NULL
; exit process
invoke ExitProcess,0
end L0
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
293
ตัวอยาง เขียนโปรแกรม เพื่อพิมพเลข Fibonacci จํานวน 20 ตัวแรก เมื่อ เลข Fibonacci มีนิยาม ดังนี้ F1 := 1, F2:=1
Fi = Fi-1 + Fi-2 i = 3, 4, 5, . . .
คําตอบ มีหลายวิธี ในที่นี้เปนเพียงคําตอบหนึ่งเทานั้น
ขั้นตอนที่ 1 ใหคิดกอน ดังนี้ F1 <- 1
พิมพ F1
F2 <- 1
พิมพ F2
F3 <- F1+F2 = 1+1=2 F3 <- F1+F2 = 1+2=3 …
พิมพ F3 พิมพ F3
F1 <- F2 = 1 F1 <- F2 = 2
F2 <- F3 = 2 F2 <- F3 = 3 …
ทําซา 18 ครั้ง 1 1 2 3 …
ขั้นตอนที่ 2 เขียนรหัสเทียมได ดังนี้ F1:=1;
WRITE F1;
F2 := 1;
WRITE F2;
FOR I:=1 TO 18
F3 := F1+F2;
WRITE F3;
F1:=F2;
F2:=F3;
END_FOR;
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
294
ขั้นตอนที่ 3 เขียนเปนภาษาสัญลักษณดวยคําสั่งในหัวขอ 2.1 (แบบฝกหัดขอ 2) ได ดังนี้
MOV F1,1
WRITE F1
MOV F2,1
WRITE F2
FORI: MOV I,1
LOOPI: CMP I,18
JG ENDLOOPI
MOV F3,F1
ADD F3,F2
WRITE F3
MOV F1,F2
MOV F2,F3
ADD I,1
JMP LOOPI
ENDLOOPI:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
295
ขั้นตอนที่ 4 เขียนเปนภาษาแอสเซมบลีของ MASM32 หรือ MASM615 ไดดังนี้ ;File: Fibonacci.asm
.386
.model flat, stdcall
option casemap :none ; case sensitive
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12
NULL equ 0
GetStdHandle PROTO :DWORD
ReadFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WriteFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO :DWORD
atoi PROTO :DWORD
itoa PROTO :DWORD,:DWORD,:DWORD
.data
stdout_hFile dd ?
NumberOfBytesWrite dd ?
outbuff db 12 dup(?)
newline db 0dh,0ah ; carriage return and linefeed
F1 dd 1
F2 dd 1
F3 dd ?
I dd ?
.code
; int atoi(char *atoi_buff); --- Convert ASCII string to 32-bit signed integer.
blank equ 20h ; ASCII blank character
tab equ 09h ; ASCII tab character
atoi proc USES ebx ecx edx atoi_buff:DWORD
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
296
mov esi,atoi_buff
xor ebx,ebx ; initialize forming answer
xor ecx,ecx ; initialize sign flag
atoi1: mov al,[esi]
inc esi ; scan off whitespace
cmp al,blank ; ignore leading blanks
je atoi1
cmp al,tab ; ignore leading tabs
je atoi1
cmp al,'+' ; if + sign, proceed
je atoi2
cmp al,'-' ; is it - sign?
jne atoi3 ; no, test if numeric
dec ecx ; was - sign, set flag, for negative result
atoi2: mov al,[esi] ; get next character
inc esi
atoi3:cmp al,'0' ; is character valid?
jb atoi4 ; jump if not '0' to '9'
cmp al,'9'
ja atoi4 ; jump if not '0' to '9'
and eax,0fh ; isolate lower four bits
xchg ebx,eax ; previous answer x 10
mov edx,10
mul edx
add ebx,eax ; add this digit
jmp atoi2 ; convert next digit
atoi4: mov eax,ebx ; put result into EAX
jecxz atoi5 ; jump if sign flag clear
neg eax ; make result negative
atoi5:
ret ; back to caller
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
297
atoi endp
; void itoa(int i, int radix, char *itoa_buff); --- Convert 32-bit integer to ASCII string
itoa proc USES ebx edx esi i:DWORD, radix:DWORD, itoa_buff:PTR BYTE
mov eax,i
mov esi,itoa_buff
add esi,11 ; advance to end of buffer
push esi ; and save that address.
or eax,eax ; test sign of 32-bit value,
pushfd ; and save sign on stack.
jns itoa1 ; jump if value was positive.
neg eax ; find absolute value.
itoa1: mov edx,0 ; divide value by radix to extract
div radix ; next digit for forming string
add dl,'0' ; convert remainder to ASCII digit
cmp dl,'9' ; in case converting to hex ASCII,
jle itoa2 ; jump if in range 0-9,
add dl,'A'-'9'-1 ; correct digit if in range A-F
itoa2: dec esi ; back up through buffer
mov [esi],dl ; store this character into string
or eax,eax
jnz itoa1 ; no, convert another digit
popfd ; was original value negative?
jns itoa3 ; no, jump
dec esi ; yes, store sign into output
mov byte ptr [esi],'-'
itoa3: pop eax ; calculate length of string
sub eax,esi
; move string to the beginning of itoa_buff
mov edx,itoa_buff
itoa4: cmp eax,0
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
298
je exit_itoa
mov bl,[esi]
mov [edx],bl
inc edx
inc esi
dec eax
jmp itoa4
exit_itoa:
; fill zero of string
mov [edx],DWORD PTR 0
ret ; back to caller
itoa endp
L0:
; First get STD_OUTPUT_HANDLE
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout_hFile, eax
; F1, F2 is initialized to 1
; write F1
invoke itoa,F1,10,ADDR outbuff
invoke WriteFile,stdout_hFile,ADDR outbuff,eax,ADDR NumberOfBytesWrite,NULL
; write newline
invoke WriteFile,stdout_hFile,ADDR newline,2,ADDR NumberOfBytesWrite,NULL
; write F2
invoke itoa,F2,10,ADDR outbuff
invoke WriteFile,stdout_hFile,ADDR outbuff,eax,ADDR NumberOfBytesWrite,NULL
; write newline
invoke WriteFile,stdout_hFile,ADDR newline,2,ADDR NumberOfBytesWrite,NULL
FORI: mov I,1
LOOPI: cmp I,18
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
299
jg ENDLOOPI
mov eax,F1
mov F3,eax
mov eax,F2
add F3,eax
; write F3
invoke itoa,F3,10,ADDR outbuff
invoke WriteFile,stdout_hFile,ADDR outbuff,eax,ADDR NumberOfBytesWrite,NULL
; write newline
invoke WriteFile,stdout_hFile,ADDR newline,2,ADDR NumberOfBytesWrite,NULL
mov eax,F2
mov F1,eax
mov eax,F3
mov F2,eax
inc I
jmp LOOPI
ENDLOOPI:
; exit process
invoke ExitProcess,0
end L0
.
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
300
ตัวอยาง เขียนโปรแกรม เพื่อหาคําตอบของสมการ
X + 3Y +9Z = 126 X≥0, Y≥0, Z≥0
คําตอบ มีหลายวิธี ในที่นี้เปนเพียงคําตอบหนึ่งเทานั้น
ขั้นตอนที่ 1 ใหคิดกอน ดังนี้ X Y Z X+3Y+9Z
0 0 0 0 ≠ 126
0 0 1 9 ≠ 126
0 0 2 18 ≠ 126
…
0 0 14 126 = 126 เปนคําตอบหนึ่ง
0 1 0 3 ≠ 126
0 1 1 12 ≠ 126
0 1 2 21 ≠ 126
…
0 1 14 129 ≠ 126
0 2 0 6 ≠ 126
0 2 1 15 ≠ 126
…
0 2 14 132 ≠ 126
…
0 42 0 126 = 126 เปนคําตอบหนึ่ง …
0 42 14 252 ≠ 126
…
126 0 0 126 = 126 เปนคําตอบหนึ่ง …
126 42 14 378 ≠ 126
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
301
ขั้นตอนที่ 2 เขียนรหัสเทียมได ดังนี้ FOR X:=0 TO 126
FOR Y:=0 TO 42
FOR Z:=0 TO 14
IF (X + 3Y +9Z = 126)
THEN WRITE (X,Y,Z);
END_IF;
END_FOR;
END_FOR;
END_FOR;
ขั้นตอนที่ 3 เขียนเปนภาษาสัญลักษณดวยคําสั่งในหัวขอ 2.1 (แบบฝกหัดขอ 2) ได ดังนี้
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
302
FORX: MOV X,0
LOOPX: CMP X,126
JG ENDLOOPX
FORY: MOV Y,0
LOOPY: CMP Y,42
JG ENDLOOPY
FORZ: MOV Z,0
$LOOPZ: CMP Z,14
JG ENDLOOPZ
MOV SUM,X
MOV T,Y
MUL T,3
ADD SUM,T
MOV T,Z
MUL T,9
ADD SUM,T ; IF (X+3Y+9Z = 126 )
CMP SUM,126
JNE $ENDIF
WRITE X ; THEN WRITE (X,Y,Z);
WRITE Y
WRITE Z
$ENDIF:
ADD Z,1
JMP $LOOPZ
ENDLOOPZ:
ADD Y,1
JMP LOOPY
ENDLOOPY:
ADD X,1
JMP LOOPX
ENDLOOPX:
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
303
ขั้นตอนที่ 4 เขียนเปนภาษาแอสเซมบลีของ MASM32 หรือ MASM615 ไดดังนี้ ;File equation.asm
.386
.model flat, stdcall
option casemap :none ; case sensitive
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12
NULL equ 0
GetStdHandle PROTO :DWORD
ReadFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WriteFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO :DWORD
atoi PROTO :DWORD
itoa PROTO :DWORD,:DWORD,:DWORD
.data
stdout_hFile dd ?
NumberOfBytesWrite dd ?
outbuff db 12 dup(?)
colon db ':'
newline db 0dh,0ah ; carriage return and linefeed
X dd ?
Y dd ?
Z dd ?
SUM dd ?
T dd ?
.code
; int atoi(char *atoi_buff); --- Convert ASCII string to 32-bit signed integer.
blank equ 20h ; ASCII blank character
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
304
tab equ 09h ; ASCII tab character
atoi proc USES ebx ecx edx atoi_buff:DWORD
mov esi,atoi_buff
xor ebx,ebx ; initialize forming answer
xor ecx,ecx ; initialize sign flag
atoi1: mov al,[esi]
inc esi ; scan off whitespace
cmp al,blank ; ignore leading blanks
je atoi1
cmp al,tab ; ignore leading tabs
je atoi1
cmp al,'+' ; if + sign, proceed
je atoi2
cmp al,'-' ; is it - sign?
jne atoi3 ; no, test if numeric
dec ecx ; was - sign, set flag, for negative result
atoi2: mov al,[esi] ; get next character
inc esi
atoi3:cmp al,'0' ; is character valid?
jb atoi4 ; jump if not '0' to '9'
cmp al,'9'
ja atoi4 ; jump if not '0' to '9'
and eax,0fh ; isolate lower four bits
xchg ebx,eax ; previous answer x 10
mov edx,10
mul edx
add ebx,eax ; add this digit
jmp atoi2 ; convert next digit
atoi4: mov eax,ebx ; put result into EAX
jecxz atoi5 ; jump if sign flag clear
neg eax ; make result negative
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
305
atoi5:
ret ; back to caller
atoi endp
; void itoa(int i, int radix, char *itoa_buff); --- Convert 32-bit integer to ASCII string
itoa proc USES ebx edx esi i:DWORD, radix:DWORD, itoa_buff:PTR BYTE
mov eax,i
mov esi,itoa_buff
add esi,11 ; advance to end of buffer
push esi ; and save that address.
or eax,eax ; test sign of 32-bit value,
pushfd ; and save sign on stack.
jns itoa1 ; jump if value was positive.
neg eax ; find absolute value.
itoa1: mov edx,0 ; divide value by radix to extract
div radix ; next digit for forming string
add dl,'0' ; convert remainder to ASCII digit
cmp dl,'9' ; in case converting to hex ASCII,
jle itoa2 ; jump if in range 0-9,
add dl,'A'-'9'-1 ; correct digit if in range A-F
itoa2: dec esi ; back up through buffer
mov [esi],dl ; store this character into string
or eax,eax
jnz itoa1 ; no, convert another digit
popfd ; was original value negative?
jns itoa3 ; no, jump
dec esi ; yes, store sign into output
mov byte ptr [esi],'-'
itoa3: pop eax ; calculate length of string
sub eax,esi
; move string to the beginning of itoa_buff
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
306
mov edx,itoa_buff
itoa4: cmp eax,0
je exit_itoa
mov bl,[esi]
mov [edx],bl
inc edx
inc esi
dec eax
jmp itoa4
exit_itoa:
; fill zero of string
mov [edx],DWORD PTR 0
ret ; back to caller
itoa endp
L0:
; First get STD_OUTPUT_HANDLE
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout_hFile, eax
FORX: mov X,0
LOOPX: cmp X,126
jg ENDLOOPX
FORY: mov Y,0
LOOPY: cmp Y,42
jg ENDLOOPY
FORZ: mov Z,0
$LOOPZ: cmp Z,14
jg ENDLOOPZ
mov eax,X
mov SUM,eax
mov eax,Y
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
307
mov ebx,3
imul ebx
add SUM,eax
mov eax,Z
mov ebx,9
imul ebx
add SUM,eax
cmp SUM,126
jne $ENDIF
; write X
invoke itoa,X,10,ADDR outbuff
invoke WriteFile,stdout_hFile,ADDR outbuff,eax,ADDR NumberOfBytesWrite,NULL
; write :
invoke WriteFile,stdout_hFile,ADDR colon,1,ADDR NumberOfBytesWrite,NULL
; write Y
invoke itoa,Y,10,ADDR outbuff
invoke WriteFile,stdout_hFile,ADDR outbuff,eax,ADDR NumberOfBytesWrite,NULL
; write :
invoke WriteFile,stdout_hFile,ADDR colon,1,ADDR NumberOfBytesWrite,NULL
; write Z
invoke itoa,Z,10,ADDR outbuff
invoke WriteFile,stdout_hFile,ADDR outbuff,eax,ADDR NumberOfBytesWrite,NULL
; write newline
invoke WriteFile,stdout_hFile,ADDR newline,2,ADDR NumberOfBytesWrite,NULL
$ENDIF:
inc Z
jmp $LOOPZ
ENDLOOPZ:
inc Y
jmp LOOPY
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
308
ENDLOOPY:
inc X
jmp LOOPX
ENDLOOPX:
; exit process
invoke ExitProcess,0
end L0
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
309
; EXAMPLE 4: example4.asm (copy file file)
; CS344-222 Computer Organization
; Prince Of Songkla University
; Faculty of Science
; Department of Computer Science
; #########################################################################
.386
.model flat, stdcall
option casemap :none ; case sensitive
; #########################################################################
include e:\masm32\include\windows.inc
include e:\masm32\include\user32.inc
include e:\masm32\include\kernel32.inc
; #########################################################################
.data
errmsg db 'Can not open file',0ah,0dh,0
errmsg1 db 'Can not create file',0ah,0dh,0
ask db "File exist replace(Y|N)?",0
filename db "input.dat",0 ; 256 dup (?)
outfilename db "output.dat",0 ;256 dup (?)
handle dd ?
outhandle dd ?
chandle dd ?
stdouthandle dd ?
inbuff db ?,0
len dd ?
answer db ?
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
310
numread dd ?
.code
start:
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdouthandle,eax
invoke CreateFile, ADDR filename, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL
cmp eax,INVALID_HANDLE_VALUE
je err
mov handle,eax
invoke CreateFile, ADDR outfilename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
CREATE_NEW, FILE_ATTRIBUTE_ARCHIVE, NULL
cmp eax,INVALID_HANDLE_VALUE
jne ok2
invoke GetLastError
cmp eax,ERROR_FILE_EXISTS
jne err1
invoke WriteFile,stdouthandle,ADDR ask,24,ADDR len,NULL
invoke GetStdHandle,STD_INPUT_HANDLE
mov chandle,eax
invoke SetConsoleMode,chandle,ENABLE_ECHO_INPUT
askagain:
invoke ReadConsole,chandle,ADDR answer,1,ADDR numread,NULL
cmp answer,'Y'
je ansy
cmp answer,'y'
je ansy
cmp answer,'n'
je exit
cmp answer,'N'
je exit
CS344-222 องคประกอบคอมพิวเตอร (Computer Organization) หนา _____________________________________________________________________
ปรับปรุงจากที่ไดรับทุนสนับสนุนจากเงินรายไดคณะวิทยาศาสตร ป 2546 CopyRight ©2003 by Faculty of
Science, Prince of Songkla University หามจัดพิมพจําหนายโดยไมไดรับอนุญาต
311
jmp askagain
ansy:
invoke CreateFile, ADDR outfilename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL
cmp eax,INVALID_HANDLE_VALUE
jne ok2
jmp err1
ok2: mov outhandle,eax
L:
invoke ReadFile,handle,ADDR inbuff,1,ADDR len,NULL
cmp len,0
je closeh
invoke WriteFile,outhandle,ADDR inbuff,1,ADDR len,NULL
jmp L
closeh:
invoke CloseHandle,handle
invoke CloseHandle,outhandle
invoke ExitProcess,0
err:
invoke WriteFile,stdouthandle,ADDR errmsg,19,ADDR len,NULL
jmp exit
err1:
invoke WriteFile,stdouthandle,ADDR errmsg1,21,ADDR len,NULL
exit: invoke ExitProcess,0
end start