ดาวน์โหลดงานนำเสนอ
งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ
ได้พิมพ์โดยPraewphan Boonliang ได้เปลี่ยน 10 ปีที่แล้ว
1
ภาควิชาวิทยาศาสตร์ประยุกต์ คณะวิทยาศาสตร์เทคโนโลยีและการเกษตร
แสต็กและโปรแกรมย่อย ผศ.นิพนธ์ บาดกลาง สาขาวิชาคอมพิวเตอร์ ภาควิชาวิทยาศาสตร์ประยุกต์ คณะวิทยาศาสตร์เทคโนโลยีและการเกษตร
2
แสต็ก กระบวนการเข้าก่อนออกหลังหรือเข้าหลังออกก่อน Last-in First-out
นิยามเพื่อกำหนดที่ใช้งาน .STACK 100h เมื่อโปรแกรมประมวลผล SS จะเก็บค่าหมายเลขเซกเมนต์ของหน่วยความจำที่ใช้งาน ตัวชี้แสต็ก (Stack Pointer) หรือ SP จะถูกกำหนดให้ค่าเริ่มต้นเป็น 100h (แสต็กว่าง) แต่ถ้าแสต็กไม่ว่าง SP จะเลื่อนมาในตำแหน่ง offset ที่ค่าลดลง
3
คำสั่ง PUSH และ PUSHF PUSH Source
ตัวอย่าง PUSH AX
4
คำสั่ง PUSH และ PUSHF เมื่อประมวลผลแล้วจะเกิด เหตุการณ์ดังนี้
SP จะลดลง 2 ค่า ค่าของ Source จะถูกนำใส่ลงตำแหน่ง SS : SP และค่าของ Source จะไม่เปลี่ยนแปลง คำสั่ง PUSHF เป็นคำสั่งที่ไม่มีโอเปอร์แรนด์จะนำค่าของแฟล็กเรจิสเตอร์ใส่ลงในแสต็ก
5
การประมวลผลคำสั่ง PUSH (1)
6
การประมวลผลคำสั่ง PUSH (2)
7
การประมวลผลคำสั่ง PUSH (3)
8
คำสั่ง POP และ POPF เป็นคำสั่งนำข้อมูลออกจากส่วนบนของแสต็กมีรูปแบบดังนี้ POP destination Destination เป็นเรจิสเตอร์ (ยกเว้น IP) หรือหน่วยความจำมีขนาด 16 บิท ตัวอย่างเช่น POP BX
9
คำสั่ง POP และ POPF เมื่อประมวลผลแล้วจะเกิดเหตุการณ์ดังนี้
ข้อมูลใน SS : SP (ส่วนบนของแสต็ก) จะถูกเก็บในเป้าหมาย (BX) ตัวชี้แสต็ก (SP) จะเพิ่มขึ้น 2 POPF เป็นคำสั่งที่จะนำข้อมูลจากส่วนบนของแสต็กใส่ในแฟล็กเรจิสเตอร์ คำสั่ง PUSH, PUSHF, POP และ POPF ไม่มีผลต่อแฟส็ก เป็นคำสั่งที่จะต้องใช้กับข้อมูลขนาด 16 บิทเท่านั้น
10
การใช้คำสั่ง POP(1)
11
การใช้คำสั่ง POP(2)
12
การใช้คำสั่ง POP(3)
13
การประยุกต์ใช้แสต็ก Initialize count to 0 Read a character
Display a ‘?’ Initialize count to 0 Read a character WHILE character is not a carriage return DO push character onto the stack increment count read a character End_WHILE; Go to a new line FOR count times DO pop a character from the stack; display it; END_FOR
14
Program Listing EX9_1.ASM
1 : TITLE : REVERSE INPUT 2 : .MODEL SMALL 3 : .STACK 100H 4 : .CODE 5 : MAIN PROC
15
Program Listing EX9_1.ASM
6 : ;display user prompt 7 : MOV AH, 2 ; prepare to display 8 : MOV DL, ‘?’ ; char to display 9 : INT 21H ; display ‘?’ 10 : ;initialize character count 11 : XOR CX, CX ; count = 0 12 : ; read a character 13 : MOV AH, 1 ; prepare to read 14 : INT 21H ; read a char
16
Program Listing EX9_1.ASM
15 : ; while character is not a carriage return do 16 : WHILE_: 17 : CMP AL, 0DH ; CR? 18 : JE END_WHILE ; yes, exit loop 19 : ; save character on the stack and increment count 20 : PUSH AX ; push it on stack 21 : INC CX ; count = count + 1
17
Program Listing EX9_1.ASM
22 : ; read a character 23 : INT 21H ; read a char 24 : JMP WHILE_ ; loop back 25 : END_WHILE : 26 : ; go to a new line 27 : MOV AH, 2 ; display char function 28 : MOV DL, 0DH ; CR 29 : INT 21H ; execute 30 : MOV DL, 0AH ; LF 31 : INT 21H ; execute 32 : JCXZ EXIT ; exit if no characters read
18
Program Listing EX9_1.ASM
33 : ; for count times do 34 : TOP : 35 : ; pop a character from the stack 36 : POP DX ; get a char from stack 37 : ; display it 38 : INT 21H ; display it 39 : LOOP TOP 40 : ; end_for
19
Program Listing EX9_1.ASM
41 : EXIT : 42 : MOV AH, 4CH 43 : INT 21H 44 : MAIN ENDP 45 : END MAIN
20
ตัวอย่างการประมวลผล EX9_1.EXE
C>EX9_1 ?THIS IS A TEST TSET A SI SIHT ?A A ? (กด RETURN จะไม่มีเอาต์พุต) C>
21
โปรแกรมย่อย การเรียกโปรแกรมย่อยและการส่งค่ากลับ
22
การประกาศโปรแกรมย่อย
Name PROC type ; body of the procedure RET name ENDP
23
คำสั่ง CALL CALL name CALL address_expression
24
การประมวลผลคำสั่ง CALL
จะเกิดเหตุการณ์ดังต่อไปนี้ ค่าตำแหน่งของคำสั่งต่อจากคำสั่ง CALL จะถูกนำไปเก็บในแสต็ก ค่า segment : offset ของคำสั่งจะเป็นค่าของ CS : IP ขณะที่ CALL ถูกประมวลผล IP จะเปลี่ยนไปชี้ค่าตำแหน่ง offset ของคำสั่งแรกในโปรแกรมย่อยที่เรียกใช้
25
การเรียกใช้คำสั่ง CALL
26
การเรียกใช้คำสั่ง CALL
27
การทำงานคำสั่ง RET ก่อนประมวลผลคำสั่ง RET
28
การทำงานคำสั่ง RET หลังประมวลผลคำสั่ง RET
29
ตัวอย่างการใช้โปรแกรมย่อย
ตัวอย่างเป็นการเขียนโปรแกรมย่อยเพื่อหาผลคูณของเลขจำนวนเต็มบวก 2 จำนวน A และ B โดยการบวกและเลื่อนบิท
30
มีอัลกอริทึมการหาผลคูณ
Product = 0 REPEAT IF LSB of B is 1 (Recall LSB = Least significant bit) THEN Product = Product + A END_IF Shift left A Shift right B UNTIL B = 0
31
ตัวอย่างถ้าให้ A = 111b = 7 และ B = 1101b = 13
Product = 0 เมื่อ LSB ของ B เป็น 1, Product = b = 111b เลื่อนบิท A ทางซ้าย : A = 1110b เลื่อนบิท B ทางขวา : B = 110b เมื่อ LSB ของ B เป็น 0 เลื่อนบิท A ทางซ้าย : A = 11100b เลื่อนบิท B ทางขวา : B = 11b
32
เมื่อ LSB ของ B เป็น 1, Product = 111b b = b เลื่อนบิท A ทางซ้าย : A = b เลื่อนบิท B ทางขวา : B = 1b Product = b b = b เลื่อนบิท A ทางซ้าย : A = _b เลื่อนบิท B ทางขวา : B = 0 เมื่อ LSB ของ B เป็น 0 ส่งค่า Product = b = 91d
33
ทดลองตรวจสอบคำตอบด้วยการตั้งคูณ
111b 7 x 1101b x 13 d 000 111 b
34
Program Listing EX9_2.ASM
1 : TITLE : MULTIPLICATION BY ADD AND SHIFT 2 : .MODEL SMALL 3 : .STACK H 4 : .CODE 5 : MAIN PROC 6 : ;execute in DEBUG. Place A in AX and B in BX 7 : CALL MULTIPLY 8 : ;DX will contain the product 9 : MOV AH, 4CH 10 : INT 21H 11 : MAIN ENDP
35
12 : MULTIPLY PROC 13 : ;multiplies two nos. A and B by shifting and addition 14 : ;input : AX = A, BX = B. Nos. in range 0 – FFh 15 : ;output : DX = product 16 : PUSH AX 17 : PUSH BX 18 : XOR DX, DX ; product = 0
36
19 : REPEAT : 20 : ; if B is odd 21 : TEST BX, 1 ; is B odd? 22 : JZ END_IF ; no, even 23 : ; then 24 : ADD DX, AX ; prod = prod + A 25 : END_IF : 26 : SHL AX, 1 ; shift left A 27 : SHR BX, 1 ; shift right B 28 : ; until 29 : JNZ REPEAT 30 : POP BX 31 : POP AX 32 : RET 33 : MULTIPLY ENDP 34 : END MAIN
37
ทดสอบค่าต่าง ๆ ด้วยโปรแกรม DEBUG
งานนำเสนอที่คล้ายกัน
© 2024 SlidePlayer.in.th Inc.
All rights reserved.