บทที่ 11 โปรแกรมย่อยขั้นต้น การประกาศ 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 add dl,’0’ cmp al,10 jb printit add dl,’A’-’0’-10 printit: int 21h ret printhexdigit endp 204221 องค์ประกอบคอมพิวเตอร์และภาษาแอสเซมบลี้ ภาควิชาวิศวกรรมคอมพิวเตอร์ มหาวิทยาลัยเกษตรศาสตร์ สัณฑิติ พัชรรุ่งเรือง จิตร์ทัศน์ ฝักเจริญผล
โปรแกรมย่อยขั้นต้น ผลกระทบข้างเคียง คำสั่งเกี่ยวกับ stack ; print a 2-digit hex number ; the digits is stored in bh,bl ... mov al,bh call printhexdigit mov al,bl ผลกระทบข้างเคียง การทำงานของโปรแกรมย่อยอาจมีผลกระทบข้างเคียงกับ รีจิสเตอร์อื่น ๆ ได้ เราควรป้องกันการเกิดผลกระทบนี้ เก็บรักษาค่าเดิมของรีจิสเตอร์ -> ใช้ stack คำสั่งเกี่ยวกับ stack PUSH reg16 : ใส่ค่าลงใน stack POP reg16 : อ่านค่าขึ้นมาจาก stack 204221 องค์ประกอบคอมพิวเตอร์และภาษาแอสเซมบลี้ ภาควิชาวิศวกรรมคอมพิวเตอร์ มหาวิทยาลัยเกษตรศาสตร์ สัณฑิติ พัชรรุ่งเรือง จิตร์ทัศน์ ฝักเจริญผล
การทำงานของคำสั่ง PUSH และ POP โดยปกติรีจิสเตอร์ SS:SP จะเก็บตำแหน่งบนสุดของแสต็ก. เมื่อเราสั่ง PUSH หรือ POP กับแสต็กหน่วยประมวลผลจะปรับค่าของรีจิสเตอร์ SP ให้มีค่าชี้ตำแหน่งบนสุดของแสต็กอีกครั้ง. AX = 1234 PUSH AX SS : SP 1234 SS : SP DX = 034A PUSH DX SS : SP 034A POP BX 034A 1234 SS : SP 1234 BX = 034A 204221 องค์ประกอบคอมพิวเตอร์และภาษาแอสเซมบลี้ ภาควิชาวิศวกรรมคอมพิวเตอร์ มหาวิทยาลัยเกษตรศาสตร์ สัณฑิติ พัชรรุ่งเรือง จิตร์ทัศน์ ฝักเจริญผล
โปรแกรมย่อยขั้นต้น ;print Hex digit ;input al<-digit printhexdigit proc near push ax push dx mov ah,2 mov dl,al add dl,’0’ cmp al,10 jb printit add dl,’A’-’0’-10 printit: int 21h pop dx pop ax ret printhexdigit endp 204221 องค์ประกอบคอมพิวเตอร์และภาษาแอสเซมบลี้ ภาควิชาวิศวกรรมคอมพิวเตอร์ มหาวิทยาลัยเกษตรศาสตร์ สัณฑิติ พัชรรุ่งเรือง จิตร์ทัศน์ ฝักเจริญผล
โปรแกรมย่อยขั้นต้น การเปลี่ยนแปลงของ stack เมื่อมีการเรียกโปรแกรมย่อย call printhexdigit กระโดดไปทำงานที่โปรแกรมย่อย ? IP ? DX push ax push dx AX ปรับค่าโดยอัตโนมัติ หลักการสั่ง CALL และ RET IP ? DX pop dx pop ax AX IP ? ret IP กระโดดกลับไป โปรแกรมหลัก ? การผ่านค่า parameter ให้กับโปรแกรมย่อยจากตัวอย่างใช้การผ่านค่าผ่านทางรีจิสเตอร์. ในบทถัด ๆ ไปเราจะได้เรียนรู้การผ่านค่าผ่านทาง stack ซึ่งเป็นแบบนิยมใช้ในภาษาระดับสูง. 204221 องค์ประกอบคอมพิวเตอร์และภาษาแอสเซมบลี้ ภาควิชาวิศวกรรมคอมพิวเตอร์ มหาวิทยาลัยเกษตรศาสตร์ สัณฑิติ พัชรรุ่งเรือง จิตร์ทัศน์ ฝักเจริญผล