1 / 43

แสต็กและโปรแกรมย่อย

แสต็กและโปรแกรมย่อย. ผศ.นิพนธ์ บาดกลาง สาขาวิชาคอมพิวเตอร์ ภาควิชาวิทยาศาสตร์ประยุกต์ คณะวิทยาศาสตร์เทคโนโลยีและการเกษตร. แสต็ก. กระบวนการเข้าก่อนออกหลังหรือเข้าหลังออกก่อน Last-in First-out นิยามเพื่อกำหนดที่ใช้งาน . STACK 100h

senwe
Télécharger la présentation

แสต็กและโปรแกรมย่อย

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. แสต็กและโปรแกรมย่อย ผศ.นิพนธ์ บาดกลาง สาขาวิชาคอมพิวเตอร์ ภาควิชาวิทยาศาสตร์ประยุกต์ คณะวิทยาศาสตร์เทคโนโลยีและการเกษตร

  2. แสต็ก • กระบวนการเข้าก่อนออกหลังหรือเข้าหลังออกก่อน • Last-in First-out • นิยามเพื่อกำหนดที่ใช้งาน .STACK 100h • เมื่อโปรแกรมประมวลผล SS จะเก็บค่าหมายเลขเซกเมนต์ของหน่วยความจำที่ใช้งาน • ตัวชี้แสต็ก (Stack Pointer) หรือ SP จะถูกกำหนดให้ค่าเริ่มต้นเป็น 100h (แสต็กว่าง) • แต่ถ้าแสต็กไม่ว่าง SP จะเลื่อนมาในตำแหน่ง offset ที่ค่าลดลง

  3. คำสั่ง PUSH และ PUSHF • Source เป็นเรจิสเตอร์หรือหน่วยความจำที่มีขนาด 16 บิท • ตัวอย่าง PUSH AX PUSH Source

  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. การประยุกต์ใช้แสต็ก 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 C>EX9_1 ?A A C>EX9_1 ? (กด RETURN จะไม่มีเอาต์พุต) C>

  21. โปรแกรมย่อย การเรียกโปรแกรมย่อยและการส่งค่ากลับ

  22. การประกาศโปรแกรมย่อย Name PROC type ; body of the procedure RET name ENDP

  23. คำสั่ง CALL • name เป็นชื่อโปรแกรมย่อยที่ต้องการเรียก • address expression เป็นเรจิสเตอร์หรือหน่วยความจำที่เก็บค่าตำแหน่งของโปรแกรมย่อย CALL name CALL address_expression

  24. การประมวลผลคำสั่ง CALL จะเกิดเหตุการณ์ดังต่อไปนี้ • ค่าตำแหน่งของคำสั่งต่อจากคำสั่ง CALL จะถูกนำไปเก็บในแสต็ก ค่า segment : offset ของคำสั่งจะเป็นค่าของ CS : IP ขณะที่ CALL ถูกประมวลผล • IP จะเปลี่ยนไปชี้ค่าตำแหน่ง offset ของคำสั่งแรกในโปรแกรมย่อยที่เรียกใช้

  25. การเรียกใช้คำสั่ง CALL ก่อนใช้คำสั่ง CALL

  26. การเรียกใช้คำสั่ง CALL หลังใช้คำสั่ง 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 = 0 + 111b = 111b เลื่อนบิท A ทางซ้าย : A = 1110b เลื่อนบิท B ทางขวา : B = 110b เมื่อ LSB ของ B เป็น 0 เลื่อนบิท A ทางซ้าย : A = 11100b เลื่อนบิท B ทางขวา : B = 11b

  32. เมื่อ LSB ของ B เป็น 1, Product = 111b + 11100b = 100011b เลื่อนบิท A ทางซ้าย : A = 111000b เลื่อนบิท B ทางขวา : B = 1b เมื่อ LSB ของ B เป็น 1, Product = 100011b + 111000b = 1011011b เลื่อนบิท A ทางซ้าย : A = 1110000_b เลื่อนบิท B ทางขวา : B = 0 เมื่อ LSB ของ B เป็น 0 ส่งค่า Product = 1011011b = 91d

  33. ทดลองตรวจสอบคำตอบด้วยการตั้งคูณทดลองตรวจสอบคำตอบด้วยการตั้งคูณ 111b 7 x 1101b x 13 111 91d 000 111 111 1011011b

  34. Program Listing EX9_2.ASM 1 : TITLE : MULTIPLICATION BY ADD AND SHIFT 2 : .MODEL SMALL 3 : .STACK 100H 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

More Related