Lecture 9 (The Stack and Procedures) Lecture Outline • Introduction • The Stack • The PUSH Instruction • The POP Instruction •Terminology of Procedures •INDEC / OUTDEC procedures 1 Introduction • The stack segment of a program is used for temporary storage of data and addresses. • PUSH and POP instructions are used to add and remove words from the stack. 2 The Stack • A stack is a one-dimensional data structure. • Items are added and removed from one end of the structure; that is, it processes in a “last-in-first-out” manner. • A program must set aside a block of memory to hold the stack. • Ex: .STACK 100H When the program is assembled and loaded in memory: • SS will contain the segment number of the stack segment. • SP is initialized to 100H, which represents the empty stack position. • When the stack is not empty, SP contains the offset address of the top of the stack. 3 The PUSH Instruction • To add a new word to the stack we PUSH it on. • Syntax: PUSH source 16-bit register or memory location • Execution of PUSH causes the following to happen: • SP is decreased/decremented by 2. • A copy of the source content is moved to the address specified by SS:SP. The source is unchanged. 4 The PUSH Instruction 1234 AX 5678 BX Offset Offset Offset 00F8 00F8 00F8 00FA 00FA 00FA 00FC 00FC 00FC 5678 00FE 00FE 0100 Empty Stack SP 1234 SP 0100 After PUSH AX 00FE SP 1234 0100 AFTER PUSH BX 5 The POP Instruction • To remove the top item from the stack, we POP it. • Syntax: POP destination 16-bit register (except IP) or memory location • Execution of POP causes the following to happen: • The content of SS:SP (the top of the stack) is moved to the destination. • SP is increased by 2. 6 The POP Instruction FFFF CX 5678 CX 5678 CX 0001 DX 0001 DX 1234 DX Offset Offset Offset 00F8 00F8 00F8 00FA 00FA 00FA 00FC 5678 00FC 5678 00FC 5678 00FE 1234 SP 00FE 1234 SP 0100 0100 Stack After POP CX 00FE 0100 1234 SP After POP DX 7 Exercise 1 • Write assembly code that uses the stack operations to swap the content of AX and DX. PUSH AX PUSH DX POP AX POP DX 8 Terminology of Procedures • An assembly program can be structured as a collection of procedures. • The MAIN procedure, contains the entry point to the program. • To carry out a task, the main procedure calls one of the other procedures. • It is also possible for these procedures to call each other, or for a procedure to call itself. • When one procedure calls another, control transfers to the called procedure and its instructions are executed; the called procedure usually returns control to the caller at the next instruction after the call statement. 9 Procedure Declaration • Syntax (except the main procedure): name PROC type The optional operand type is: ; body of the procedure • NEAR: the statement that RET calls the procedure is in the name ENDP same segment as the procedure itself, or Name is the The RET (return) • FAR: the statement that user-defined instruction causes calls the procedure is in a name of the control to transfer different segment. procedure. back to the calling If type is omitted, NEAR is procedure assumed. 15 Communication Between Procedures • Assembly language procedures do not have parameter lists. • It’s up to the programmer to devise a way for procedures to communicate. • E.g. If there are only few input and output values, they can be placed in registers. 10 The CALL Instruction • To invoke a procedure, the CALL instruction is used. 11 The CALL Instruction Offset address Code segment Offset address MAIN PROC IP 0010 0012 CALL PROC1 next instruction 0200 PROC1 PROC first instruction MAIN PROC IP 0010 0012 CALL PROC1 next instruction 0200 PROC1 PROC first instruction RET Offset address RET Stack segment 00FE 0100 Before CALL Code segment Offset address SP 00FE 0100 Stack segment SP 0012 After CALL 12 The RET Instruction Offset address Code segment Offset address MAIN PROC IP 0010 0012 CALL PROC1 next instruction Code segment MAIN PROC 0010 0012 CALL PROC1 next instruction 0200 PROC1 PROC first instruction 0200 PROC1 PROC first instruction 0300 RET 0300 RET Offset address 00FE 0100 IP Stack segment 0012 Before RET Offset address SP Stack segment 00FE 0100 SP After RET 13 INDEC / OUTDEC Procedures • procedures used to read and print decimal data •To invoke the two procedures, use CALL instruction inside the MAIN PROC . •Example CALL INDEC . . . . CALL OUTDEC 14 INDEC / OUTDEC Procedures • INDEC Read character input from user and convert it to decimal stored in AX register Code of INDEC exist in file PGM9_3.ASM •OUTDEC Display the decimal number in register AX to output screen Code of OUTDEC exist in file PGM9_1.ASM •Include the two files using INCLUDE directive Syntax: INCLUDE C:\ASM\ PGM9_3.ASM INCLUDE C:\ASM\ PGM9_1.ASM 15 INDEC / OUTDEC Procedures OUTDEC PROC PUSH AX PUSH BX PUSH CX PUSH DX OR AX,AX JGE @END_IF1 PUSH AX MOV DL,'-' MOV AH,2 INT 21H POP AX NEG AX @END_IF1: XOR CX,CX MOV BX,10D @REPEAT1: XOR DX,DX DIV BX PUSH DX INC CX OR AX,AX JNE @REPEAT1 MOV AH,2 @PRINT_LOOP: POP DX OR DL,30H INT 21H LOOP @PRINT_LOOP POP DX POP CX POP BX POP AX RET OUTDEC ENDP 16 INDEC / OUTDEC Procedures INDEC PROC ;;;;;;;;;;;;;;;;;;; READ DECIMAL NUMBER;;;;;;;;;;;; PUSH BX PUSH CX PUSH DX @BEGIN: MOV MOV INT XOR XOR MOV INT CMP JE CMP JE JMP @MINUS: MOV @PLUS: INT @REPEAT2: CMP JNGE CMP JNLE AND PUSH MOV MUL POP AH,2 DL,'?' 21H BX,BX CX,CX AH,1 21H AL,'-' @MINUS AL,'+' @PLUS @REPEAT2 CX,1 21H AL,'0' @NOT_DIGIT AL,'9' @NOT_DIGIT AX,000FH AX AX,10 BX BX 17 INDEC / OUTDEC Procedures Cont… ADD BX,AX MOV AH,1 INT 21H CMP AL,0DH JNE @REPEAT2 MOV AX,BX OR CX,CX JE @EXIT NEG AX @EXIT: POP DX POP CX POP BX RET @NOT_DIGIT: MOV AH,2 MOV DL,0DH INT 21H MOV DL,0AH INT 21H JMP @BEGIN INDEC ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;END READ;;;;;;;;; 18 INDEC / OUTDEC Procedures MAIN PROGRAM MODEL .STACK .CODE MAIN SMALL 100H PROC ----------------------------------------CALL INDEC CALL OUTDEC ----------------------------------------MOV AH, 4CH INT 21H MAIN ENDP ; exit to DOS INCLUDE C:ASM\PGM9_1.ASM INCLUDE C:ASM\PGM9_3.ASM END MAIN 19