งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

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

งานนำเสนอที่คล้ายกัน


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

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

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

3 คำสั่ง PUSH และ PUSHF Source เป็นเรจิสเตอร์หรือหน่วยความจำที่มี ขนาด 16 บิท ตัวอย่าง PUSHAX 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 :.MODELSMALL 3 :.STACK100H 4 :.CODE 5 : MAINPROC

15 Program Listing EX9_1.ASM 6 : ;display user prompt 7 : MOVAH, 2; prepare to display 8 : MOVDL, ‘?’; char to display 9 : INT21H; display ‘?’ 10 : ;initialize character count 11 : XORCX, CX; count = 0 12 : ; read a character 13 : MOVAH, 1; prepare to read 14 : INT21H; read a char

16 Program Listing EX9_1.ASM 15 : ; while character is not a carriage return do 16 : WHILE_: 17 : CMPAL, 0DH; CR? 18 : JEEND_WHILE; yes, exit loop 19 :; save character on the stack and increment count 20 :PUSHAX; push it on stack 21 :INCCX; count = count + 1

17 Program Listing EX9_1.ASM 22 : ; read a character 23 : INT21H; read a char 24 : JMPWHILE_; loop back 25 : END_WHILE : 26 : ; go to a new line 27 :MOVAH, 2; display char function 28 :MOVDL, 0DH; CR 29 : INT21H; execute 30 : MOVDL, 0AH; LF 31 :INT21H; execute 32 :JCXZEXIT; 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 : POPDX; get a char from stack 37 : ; display it 38 : INT21H; display it 39 : LOOP TOP 40 : ; end_for

19 Program Listing EX9_1.ASM 41 : EXIT : 42 : MOVAH, 4CH 43 : INT21H 44 : MAINENDP 45 :ENDMAIN

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 PROCtype ; body of the procedure RET nameENDP

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

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 = 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 เมื่อ LSB ของ B เป็น 1, Product = b b = b เลื่อนบิท A ทางซ้าย : A = _b เลื่อนบิท B ทางขวา : B = 0 เมื่อ LSB ของ B เป็น 0 ส่งค่า Product = b = 91d

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

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 : CALLMULTIPLY 8 : ;DX will contain the product 9 : MOVAH, 4CH 10 : INT21H 11 : MAINENDP

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 :PUSHAX 17 : PUSHBX 18 : XOR DX, DX; product = 0

36 19 :REPEAT : 20 :; if B is odd 21 :TESTBX, 1; is B odd? 22 :JZEND_IF; no, even 23 : ; then 24 :ADDDX, AX; prod = prod + A 25 :END_IF : 26 :SHLAX, 1; shift left A 27 :SHRBX, 1; shift right B 28 : ; until 29 :JNZREPEAT 30 :POPBX 31 :POPAX 32 :RET 33 : MULTIPLY ENDP 34 :ENDMAIN

37 ทดสอบค่าต่าง ๆ ด้วยโปรแกรม DEBUG

38

39

40

41

42

43


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

งานนำเสนอที่คล้ายกัน


Ads by Google