180 likes | 303 Views
16.317 Microprocessor Systems Design I. Instructor: Dr. Michael Geiger Fall 2013 Lecture 16 Subroutines and stack details. Lecture outline. Announcements/reminders HW 4 due 10/16 Exam 1 regrade requests due today No lecture Monday, 10/14 (Columbus Day) Review Jump instructions
E N D
16.317Microprocessor Systems Design I Instructor: Dr. Michael Geiger Fall 2013 Lecture 16 Subroutines and stack details
Lecture outline • Announcements/reminders • HW 4 due 10/16 • Exam 1 regrade requests due today • No lecture Monday, 10/14 (Columbus Day) • Review • Jump instructions • Loop instructions • Today’s lecture • Subroutines • Basics of stack usage Microprocessors I: Lecture 16
Review: jump, loop • Two general types of jump • Unconditional: JMP <target> • Always go to target address • Conditional: Jcc <target> • Go to target address if condition true • Loop instructions • Combines CX decrement with JNZ test • May add additional required condition • LOOPE/LOOPZ: loop if ((CX != 0) && (ZF == 1)) • LOOPNE/LOOPNZ: loop if (CX != 0) && (ZF == 0)) Microprocessors I: Lecture 16
Loop example • Describe the operation of the following program (Example 6.15-6.16). • What is the final value of SI if the 15 bytes between 0A001 and 0A00F have the following values? • 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E MOV DL, 05 MOV AX, 0A00 MOV DS, AX MOV SI, 0000 MOV CX, 000F AGAIN: INC SI CMP [SI], DL LOOPNE AGAIN Microprocessors I: Lecture 16
Subroutine: special program segment that can be “called” from any point in program Implements HLL functions/procedures Written to perform operation that must be repeated in program Actual subroutine code only written once Subroutines Microprocessors I: Lecture 16
Subroutine operation • When called, address of next instruction saved • State may need to be saved before call • Parameters can be passed • Control of program transferred to subroutine • After subroutine finished, return instruction goes back to saved address Microprocessors I: Lecture 16
80386 subroutines • Specify starting point with pseudo-op • <name> PROC NEAR same segment • <name> PROC FAR different segment • May save state/allocate variables at start • If so, will restore at end of subroutine • Last instruction returns to saved address • Always RET • Pseudo-op after RET indicates routine end • <name> ENDP Microprocessors I: Lecture 16
Subroutine example SQUARE PROC NEAR PUSH AX ; Save AX to stack MOV AL, BL ; Copy BL to AL IMUL BL ; AX = BL * AL ; = original BL squared MOV BX, AX ; Copy result to BX POP AX ; Restore AX RET SQUARE ENDP Microprocessors I: Lecture 16
Call/return • Calling subroutine: CALL <proc> • Address of next instruction saved on stack • Either IP (near) or CS, IP (far) • <proc> can be 16- or 32-bit label/immediate, register, memory operand • 16-bit immediate added to IP • 16-bit register/memory replaces IP • 32-bit values replace CS/IP • Ending subroutine: RET • Saved address restored to IP (& CS if needed) Microprocessors I: Lecture 16
Example • Assuming AX = 2 and BX = 4, show the results of the following sequence (Ex. 6.11): • Assume the addresses of the first three instructions are CS:0005, CS:0008, and CS:0009, respectively CALL SUM RET ; End main function SUM PROC NEAR MOV DX, AX ADD DX, BX RET SUM ENDP Microprocessors I: Lecture 16
Example results CALL SUM RET ; End main function SUM PROC NEAR MOV DX, AX DX = AX = 4 ADD DX, BX DX = DX + BX = 4 + 2 = 6 RET SUM ENDP Microprocessors I: Lecture 16
Saving state • May need to save state before routine starts • Overwritten registers (that aren’t return values) • Flags • Placing data on stack: PUSH • Store data “above” current TOS; decrement SP • Stack grows toward lower addresses • New SP points to start of data just stored • Basic PUSH stores word or double word • Directly storing flags: PUSHF • Storing all 16-/32-bit general purpose registers: PUSHA/PUSHAD Microprocessors I: Lecture 16
Restoring state • Removing data from TOS: POP • Data removed from TOS; SP incremented • Basic POP removes word/double word • Directly removing flags: POPF • Removing all 16-/32-bit general purpose registers: POPA/POPAD • POP instructions generally executed in reverse order of corresponding PUSH instructions Microprocessors I: Lecture 16
Revisiting subroutine example SQUARE PROC NEAR PUSH AX ; Save AX to stack MOV AL, BL ; Copy BL to AL IMUL BL ; AL = BL * AL ; = original BL squared MOV BX, AX ; Copy result to BX POP AX ; Restore AX RET SQUARE ENDP Microprocessors I: Lecture 16
Push All and Pop All Operations Microprocessors I: Lecture 16
Stack examples • Assume initial state shown in handout • What is the resulting stack state of each of the following sequences? • PUSH BX PUSH AX • PUSH EBX PUSH EAX • PUSHA Microprocessors I: Lecture 16
Solution • What is the resulting stack state of each of the following sequences? • PUSH BX PUSH AX • 4 bytes pushed to stack, so SP decremented by 4 ESP = 00001FFCH • AX is at top of stack; BX is below that • PUSH EBX PUSH EAX • 8 bytes pushed to stack, so SP decremented by 8 ESP = 00001FF8H • EAX is at top of stack; EBX is below that • PUSHA • 8 words = 16 bytes pushed to stack, so SP decremented by 16 ESP = 00001FF0H • As shown in slide 13, DI is at top of stack, followed by SI, BP, old SP, BX, DX, CX, and AX Microprocessors I: Lecture 16
Final notes • Next time: • HLL assembly translation • Reminders: • HW 4 due 10/16 • Exam 1 regrade requests due today • No lecture Monday, 10/14 (Columbus Day) Microprocessors I: Lecture 16