ธนาวินท์ รักธรรมานนท์ fengtwr@ku.ac.th โปรแกรมย่อย ธนาวินท์ รักธรรมานนท์ fengtwr@ku.ac.th
หัวข้อในวันนี้ โปรแกรมย่อย การเรียกใช้งานโปรแกรมย่อย การทำงานของแสต็กซ์ขณะเรียกใช้งานโปรแกรมย่อย
Procedure Operation (Pascal) Program draw(input, output); Var I:integer; Procedure writeBox; Begin writeln(‘------------’); writeln(‘- -’); End; Begin { main program} writeln(‘Hello…..’); for I:= 1 to 10 do writeBox; writeln(‘Bye’); End.
โปรแกรมย่อยขั้นต้น การเรียกใช้ การประกาศ procname PROC NEAR … ;program RET procname ENDP การเรียกใช้ CALL procname
ตัวอย่างโปรแกรมย่อย - การประกาศ ;print Hex digit ;input al<-digit ;affect : dl,ah printhexdigit proc near mov ah , 2 mov dl , al cmp al , 10 add dl , ’0’ jb printit add dl , ’A’-’0’-10 printit: int 21h ret printhexdigit endp
ตัวอย่างโปรแกรมย่อย - การเรียกใช้ ; print a 2-digit hex number ; the digits is stored in bh,bl ... mov al,bh call printhexdigit mov al,bl ข้อเสียหลักคือรีจิสเตอร์ที่ถูกใช้งานในโปรแกรมย่อยทั้งหมดจะถูกเปลี่ยนค่าไปด้วย แก้โดยใช้สแต็กซ์มาเก็บค่าของรีจิสเตอร์แต่ละตัวไว้ก่อนการทำงาน
โจทย์เกี่ยวกับโปรแกรมย่อย 1. จงเขียนโปรแกรมย่อยเพื่อรับค่าอักษร 1 ตัวจากผู้ใช้และเก็บเป็นตัวเลขไว้ใน AX และถ้าอักษรที่ผู้ใช้ระบุไม่ใช่ตัวเลขให้ AX=-1 call readInt ; ผู้ใช้ใส่ ‘5’ แล้ว AX = 5h 2. จงเขียนโปรแกรมย่อยเพื่อแสดงค่าของตัวเลขที่เก็บไว้ใน DX (ไม่เกิน 255) mov dx , C8h call printInt ; แสดงเลข 200 บนหน้าจอ
โจทย์เกี่ยวกับโปรแกรมย่อย 3. จงเขียนโปรแกรมย่อยเพื่อคำนวณผลรวมตั้งแต่ 1+2+3+..+AX และเก็บคำตอบสุดท้ายไว้ใน AX mov ax,10 call sigma ; ax = 55 4. จงเขียนโปรแกรมย่อยเพื่อหาหรม.ของ BX และ CX โดยเก็บค่าไว้ใน AX mov bx , 100 mov cx , 225 call gcd ; ax = 25
การใช้งานแสต็กซ์ คำสั่งเกี่ยวกับแสต็กซ์ PUSH reg : ใส่ค่าลงใน stack POP reg : อ่านค่าขึ้นมาจาก stack โดยปกติรีจิสเตอร์ SS:SP จะเก็บตำแหน่งบนสุดของแสต็ก. เมื่อเราสั่ง PUSH หรือ POP กับสแต็กซ์หน่วยประมวลผลจะปรับค่าของรีจิสเตอร์ SP ให้มีค่าชี้ตำแหน่งบนสุดของแสต็กอีกครั้ง
ตัวอย่างการใช้งานแสต็กซ์ DX = 034A PUSH DX 034A 1234 ??? SS : SP Mov AX,1234h Mov DX,034Ah Push AX Push DX Pop BX ??? SS : SP AX = 1234 PUSH AX 1234 ??? SS : SP POP BX 034A 1234 ??? SS : SP BX = 034A
;print Hex digit ;input al<-digit printhexdigit proc near mov ah,2 mov dl,al add dl,’0’ cmp al,10 jb printit add dl,’A’-’0’-10 printit: int 21h ret printhexdigit endp push ax push dx pop dx pop ax
การเปลี่ยนไปของแสต็กซ์กับโปรแกรมย่อย call printhexdigit IP ? กระโดดไปทำงานที่โปรแกรมย่อย push ax push dx DX AX IP ? ? pop dx pop ax DX AX IP ? ret กระโดดกลับไป โปรแกรมหลัก IP ?
โจทย์เกี่ยวกับโปรแกรมย่อย 5. จงเขียนโปรแกรมเพื่อแสดงจำนวนเฉพาะที่อยู่ระหว่าง 1 ถึง 999 โดยแสดงผลลัพธ์ทางหน้าจอ คำแนะนำ : ใช้โปรแกรมย่อยช่วยจะง่ายขึ้นมาก - โปรแกรมย่อยแสดงตัวเลข - โปรแกรมย่อยในการตรวจสอบจำนวนเฉพาะ
โจทย์เกี่ยวกับโปรแกรมย่อย (การบ้าน) จงเขียนโปรแกรมย่อยเพื่อทำงานแทนแสต็ก โดยให้เขียน 2 โปรแกรมย่อย ได้แก่ myPush และ myPop กำหนดให้ หน่วยความจำตำแหน่ง 100 เก็บจำนวนข้อมูลที่มีในแสต็ก และหน่วยความจำตำแหน่ง 101 เป็นต้นไปเก็บค่าที่ต้องการ myPush – เป็นโปรแกรมย่อยที่ใช้ในการเก็บข้อมูลใน AX ลงแสต็กที่เรากำหนด myPop – ใช้สำหรับนำข้อมูลออกจาก stack และนำมาเก็บใน AX
Question ?