The Stack Stack, Procedures and Macros. Outline Stack organization PUSH and POP instructions Calling procedures Macros Programming guidelines.

Slides:



Advertisements
Similar presentations
Programming 8086 – Part IV Stacks, Macros
Advertisements

Register In computer architecture, a processor register is a small amount of storage available on the CPU whose contents can be accessed more quickly than.
Registers of the 8086/ /2002 JNM.
Assembly Language for x86 Processors 6th Edition Chapter 5: Procedures (c) Pearson Education, All rights reserved. You may modify and copy this slide.
Assembly Programming Notes for Practical2 Munaf Sheikh
EENG 4005 Microprocessors.
Procedures and Stacks. Outline Stack organization PUSH and POP instructions Defining and Calling procedures.
Stack and Subroutines. Outline oStack organization oPUSH and POP instructions oCalling procedures oMacros oProgramming guidelines.
1 Storage Registers vs. memory Access to registers is much faster than access to memory Goal: store as much data as possible in registers Limitations/considerations:
Assembly Language for Intel-Based Computers Chapter 5: Procedures Kip R. Irvine.
1 ICS 51 Introductory Computer Organization Fall 2006 updated: Oct. 2, 2006.
1 Lecture 5: Procedures Assembly Language for Intel-Based Computers, 4th edition Kip R. Irvine.
Run time vs. Compile time
80x86 Processor Architecture
Assembly Language – Lab 5
ICS312 Set 4 Program Structure. Outline for a SMALL Model Program Note the quiz at the next lecture will be to reproduce this slide.MODEL SMALL.586 ;
Micro-Computer Applications: Procedures & Interrupts Dr. Eng. Amr T. Abdel-Hamid ELECT 707 Fall 2011.
Procedures and the Stack Chapter 10 S. Dandamudi.
CDP ECE Spring 2000 ECE 291 Spring 2000 Lecture 7: More on Addressing Modes, Structures, and Stack Constantine D. Polychronopoulos Professor, ECE.
Introduction to Subroutines. All the combinations in which a subroutine can be written 1. The subroutine may be: a. Internal or b. External 2. The type.
Stack Operations LIFO structure (last-in,first-out) –The last value put into the stack is the first value taken out Runtime stack –A memory array that.
1/2002JNM1 Positional Notation (Hex Digits). 1/2002JNM2 Problem The 8086 has a 20-bit address bus. Therefore, it can access 1,048,576 bytes of memory.
ECE291 Computer Engineering II Lecture 6 & Lecture 7 Dr. Zbigniew Kalbarczyk University of Illinois at Urbana- Champaign.
Objective At the conclusion of this chapter you will be able to:
Computer Architecture and Operating Systems CS 3230 :Assembly Section Lecture 3 Department of Computer Science and Software Engineering University of Wisconsin-Platteville.
Strings, Procedures and Macros
Lecture 7 A closer look at procedures Dr. Dimitrios S. Nikolopoulos CSL/UIUC.
Module R3 Process Scheduling. Module R3 involves the creation of a simple “Round Robin” dispatcher. The successful completion of this module will require.
UHD:CS2401: A. Berrached1 The Intel x86 Hardware Organization.
Sahar Mosleh California State University San MarcosPage 1 Stack operations, Applications and defining procedures.
Writing and using procedures
ECE291 Lecture 6 Procedures and macros. ECE 291 Lecture 6Page 2 of 36 Lecture outline Procedures Procedure call mechanism Passing parameters Local variable.
EENG4005 Outline Program organization Debugging hints MASM directives.
Lecture 9 (The Stack and Procedures). 1 Lecture Outline Introduction The Stack The PUSH Instruction The POP Instruction Terminology of Procedures INDEC.
University of Tehran 1 Microprocessor System Design Omid Fatemi Machine Language Programming
Microprocessor Fundamentals Week 2 Mount Druitt College of TAFE Dept. Electrical Engineering 2008.
Calling Procedures C calling conventions. Outline Procedures Procedure call mechanism Passing parameters Local variable storage C-Style procedures Recursion.
Preocedures A closer look at procedures. Outline Procedures Procedure call mechanism Passing parameters Local variable storage C-Style procedures Recursion.
Internal Programming Architecture or Model
Microprocessors CSE- 341 Dr. Jia Uddin Assistant Professor, CSE, BRAC University Dr. Jia Uddin, CSE, BRAC University.
Stack Operations Dr. Hadi AL Saadi.
Assembly language programming
Computer Architecture and Assembly Language
Instruction set Architecture
Format of Assembly language
COURSE OUTCOMES OF Microprocessor and programming
Microprocessor and Assembly Language
Introduction to Compilers Tim Teitelbaum
Assembly Language Programming Part 2
(The Stack and Procedures)
Chapter 3 Addressing Modes
Defining Types of data expression Dn [name] expression Dn [name]
Symbolic Instruction and Addressing
BIC 10503: COMPUTER ARCHITECTURE
Data Addressing Modes • MOV AX,BX; This instruction transfers the word contents of the source-register(BX) into the destination register(AX). • The source.
Stack and Subroutines Module M17.1 Section 11.2.
Programming 8086 – Part IV Stacks, Macros
8086 Registers Module M14.2 Sections 9.2, 10.1.
Morgan Kaufmann Publishers Computer Organization and Assembly Language
Symbolic Instruction and Addressing
Practical Session 4.
(The Stack and Procedures)
Symbolic Instruction and Addressing
Morgan Kaufmann Publishers Computer Organization and Assembly Language
Lecture 06 Programming language.
Chapter 6 –Symbolic Instruction and Addressing
Process.
(The Stack and Procedures)
Computer Organization and Assembly Language
(The Stack and Procedures)
Presentation transcript:

The Stack Stack, Procedures and Macros

Outline Stack organization PUSH and POP instructions Calling procedures Macros Programming guidelines

The stack Space used as temporary storage during the execution of the program Purpose: –saving the return address when calling procedures –saving the contents of registers used in procedures –pass parameters to procedures –allocate memory for local variables in procedures A single access point. LIFO data structure –Data is always accessed from the “top” of the stack –Insert is done by “pushing” data to the top of the stack –Delete is done by “popping” data from the top of the stack

Stack layout in memory In use Free SS SS:SP Original SP Direction of increasing memory addresses Stack grows in direction of decreasing memory addresses

Stack layout in memory SS – Stack segment points to the beginning of the stack segment SP – points always to the top of the stack –SP is decreased when data is pushed. E.g. if we push a word SP is decreased by 2 –SP is increased when data is popped. E.g. is we pope a word SP is popped by 2 BP can point to any element in the stack –Remember that BP is the register that you use in your programs to access data from the stack

Push example 6AB A B3 037FF FE To address 12FFF Stack segment SS SP DX CX BX AX Register array PUSH BX SP before push SP after push

Pop example 392F F To address 0FFFF Stack segment SS SP DX CX BX AX Register array POP BX SP after pop SP before pop

PUSH and POP Instructions to access the stack PUSH and POP always store/load words not bytes In 386 and above you can also push/pop doublewords PUSH X –X can be immediate data, 16-bit register, segment register or 2 bytes of memory POP X –X can be 16-bit register, segment register except CS and memory location

PUSHA and POPA In 286 and later it is possible to push/pop the entire set of general purpose registers –AX,BX,CX,DX,SP,BP,SI,DI

Stack Initialization Let’s assume that we decide to use 64 Kbytes for the stack starting at address 10000h We set SS=1000h and SP=0000h –64K cover addresses from 10000h to 1FFFFh First PUSH decrements SP by 2 (0000h-2=FFFEh), data is stored in 1FFFFh and 1FFFEh

Using the stack Storing –Return address when a procedure is called –Preserve the contents of registers –Local variables required by procedures –Dynamically allocated memory Pass –Parameters passed to procedures

Why preserving registers Registers are global variables in principle Registers can also be used as temporary storage in a procedure If a procedure needs to use registers as temporary storage and these registers contain “useful” global variables, their contents must be preserved The first instructions in the procedure should take care of this

Example: preserving registers PUSH AX; Place AX on the stack PUSH BX; Place BX on the stack PUSH CX; Place CX on the stack PUSH DX; Place DX on the stack PUSH SI; Place SI on the stack PUSH DI; Place DI on the stack ; code that modifies AX,BX,CX,SI,DI POP DI; Restore original value of DI POP SI; Restore original value of SI POP DX; Restore original value of DX POP CX; Restore original value of CX POP BX; Restore original value of BX POP AX; Restore original value of AX

Calling procedures and using the stack call proc_name –Pushes the instruction pointer (IP) –Pushes CS to the stack if the call is to a procedure outside the code segment –Unconditional jump to the label proc_name ret –Pop saved IP and if necessary the saved CS and restores their values in the registers

Procedure example..start mov ax, 10h mov bx, 20h mov cx, 30h mov dx, 40h call AddRegs;this proc does AX + BX + CX + DX  AX call DosExit AddRegs add ax, bx add ax, cx add ax, dx ret

Direct access to the stack PUSH/POP/CALL/RET modify the SP When you need to access variables in the stack you need to manipulate the BP –Example: access the third word from the top of stack and return result in AX PUSH BP; Can you tell why ? MOV BP, SP ADD BP, 4 MOV AX, [BP] When you need to allocate/deallocate memory in the stack you manipulate directly the SP

Procedures at a glance Procedures can access global variables declared at the beginning of the program Procedures can access global variables stored in registers Procedures may have parameters passed to them –Registers with global variables is a form of parameter passing –Pushing parameters to the stack is another form of parameter passing Procedures may need to preserve registers Procedures may return results to the caller in registers or write results in memory

Macros Procedures have some extra overhead to execute (call/ret statements, push/pop IP, CS and data from the stack) A macro is a piece of code which is “macroexpanded” whenever the name of the macro is encountered Note the difference, a procedure is “called”, while a macro is just “expanded/inlined” in your program Macros are faster than procedures (no call instructions, stack management etc.) But they might –Significantly increase code size –Hard to debug

Macro format %macro MACRO_NAME num_args ; ; your code, use %{1} to access the first ; argument, %{2} to access the second ; argument and so on %end macro

Macro example %macro DIV16 3 ; result=x/y MOV AX, %{2} ; take the dividend CWD ; sign-extend it to DX:AX IDIV %{3} ; divide MOV%{1},AX ; store quotient in result %endmacro

Macro example ; Example: Using the macro in a program ; Variable Section varX1 DW 20 varX2 DW 4 varR RESW ; Code Section DIV16 word [varR], word [varX1], word [varX2] ; Will actually generate the following code inline in your ; program for every instantiation of the DIV16 macro (You ; won ’ t actually see this unless you debug the program). ;MOV AX, word [varX1] ;CWD ;IDIV word [varX2] ;MOV word [varR], AX

Organizing your program Create a block diagram or pseudocode of your program in paper –Control flow –Data flow Break the program into logical “components” that can be easily translated to procedures in your code Use descriptive names for variables –Noun_type for types –Nouns for variables –Verbs for procedures

Organizing your program Modular program organization helps debugging –Makes it easier to ‘isolate’ the bug in a single procedure All (Microsoft) programs contain bugs! –This is overstated… –It really means that you shouldn’t expect your program to work the first time you run it… –…but you shouldn’t feel bad about it either, relax and trace the bug

Tracing bugs The debugging process: –Set breakpoints in your programs and use them as checkpoints for checking the contents of registers/memory –Comment out code, this might help you find out whether the commented out code contains the bug Use print statements (and you might not need the debugger!) –Display the values of critical data –Display the status of the program

Tracing bugs Force registers and variables to test the output of the procedure –Helps you debug the procedure using as many inputs as possible If everything else fails –Test your logic –Change your algorithms

Procedures Labeled sections of code that you can jump to or return from any point in your program A procedure in your assembler is merely a non- dotted label Use dotted labels if you want to set jump points within a procedure (local labels)

NASM directives EXTERN, references to procedures defined in other files (e.g. libraries) GLOBAL, makes your procedures available to other files, e.g. if you are writing a library SEGMENT defines segments –SEGMENT stack –SEGMENT code

Example of program structuring ; ECE291:MPXXX ; In this MP you will develop a program which take input ; from the keyboard ;====== Constants ================================================= ;ASCII values for common characters CR EQU 13; EQU ’ s have no effect on memory LF EQU 10; They are preprocessor directives only ESCKEY EQU 27; LF gets replace with 10 when assembled ;====== Externals ================================================= ; -- LIB291 Routines extern dspmsg, dspout, kbdin extern rsave, rrest, binasc

Example of program structuring ;==== LIBMPXXX Routines (Your code will replace calls to these ;functions) extern LibKbdHandler extern LibMouseHandler extern LibDisplayResult extern MPXXXXIT ;====== Stack ==================================================== stkseg segment STACK; *** STACK SEGMENT *** resb 64*8; 64*8 = 512 Bytes of Stack stacktop: ;====== Begin Code/Data ========================================== codeseg segment CODE; *** CODE SEGMENT ***

Example of program structuring ;====== Variables ============================================== inputValiddb 0; 0: InputBuffer is not ready ; 1: InputBuffer is ready ;-1: Esc key pressed operandsStrdb 'Operands: ','$' OutputBuffer16 times db 0; Contains formatted output db ‘ $ ’ ; (Should be terminated with '$') MAXBUFLENGTHEQU 24 InputBufferMAXBUFLENGTH times db 0 ; Contains one line of user input db ‘ $ ’ graphData%include “ graphData.dat ” ; data GLOBAL outputBuffer, inputValid, operandsStr GLOBAL graphData

Example of program structuring ;====== Procedures =========================================== KbdHandler MouseHandler DisplayResult ;====== Program Initialization ===============================..start: mov ax, cs; Use common code & data segment mov ds, ax mov sp, stacktop; Initialize top of stack

Example of program structuring ;====== Main Procedure ======================================== MAIN: MOV AX, 0B800h ;Use extra segment to access video MOV ES, AX CALL MPXXXXIT ; Exit to DOS