Here is some example code I am trying to understand.

`` 1: TITLE  Parameter passing via the stack      PROCEX3.ASM 2: COMMENT | 3:    Objective:      To show parameter passing via the stack 4:    Input:             Requests two integers from the user. 5: | Output:          Outputs the sum of the input integers 			          via register  AX.  6:  .MODEL SMALL 7:  .STACK 100H 8:    .DATA 9:     prompt_msg1  DB      ’input first number: ’,0 10:   prompt_msg2  DB      ’input second number: ’,0 11: sum_msg           DB       ’The sum is ’,0 12:  13: .CODE 14:  INCLUDE io.mac 15:  16: main PROC 17:        .STARTUP 18:        PutStr  prompt_msg1    		; request first number 19:        GetInt  CX 				; CX := first number 20:        nwln 21:        PutStr  prompt_msg2    		; get second number 22:        GetInt  DX 				; DX := second number 23:        nwln  24:        push  CX 			   ; put first number on stack 25:        push  DX 			   ; put second number on stack 26:        call  sum 			   ; returns sum in AX 27:        PutStr  sum_msg        	   ; display sum 28:        PutInt  AX 29:        nwln 30: done: 31:        .EXIT 32: main ENDP 35:  ;Procedure sum receives two integers via the stack. 36:  ; The sum of the two integers is returned in AX. 37:  ;----------------------------------------------------------­ 38: 	    sum PROC 39:         push  BP                             ; we use BP, so save it 40:         mov BP,SP 41:         mov     AX,             ; sum := 1st number 42:         add     AX,              ; sum := sum + 2nd number 43:         pop BP                                ; restore BP 44:         ret 4                               ; return and clear parameters 45:         sum ENDP 46:         END main  ``

My questions deal with the sum procedure. I don't see why we do

push BP
mov BP, SP

What is the point of doing this?
Posted on 2009-10-23 23:28:03 by dre
no point really since no local variables are declared, you could just use sp to access the 2 parameters if you want
Posted on 2009-10-23 23:51:58 by lone_samurai5
Why do we need to use SP to access the parameters, that is why is SP needed at all?
Posted on 2009-10-23 23:56:44 by dre
This is to create a Stack Frame for the procedure.
If you describe the proc's input params better, the assembler will generate that for you.

I am not sure this will work on MASM, since I think MASM generally likes dword-aligned parameters, but try anyway.

Try this:
``sum PROC val1:word, val2:word         mov     AX,val1            ; sum := 1st number         add     AX,val2             ; sum := sum + 2nd number         retsum ENDP``

If that seems to assemble and work as expected, disassemble your EXE and have a look at what the assembler actually generated :)

And as a hint to help you disassemble it, make the first line of code inside the procedure this:
``int 3      ;BREAKPOINT for debugger``

Rebuild your executable, and execute it inside a debugger (eg OllyDBG).
You should now find yourself staring at the INT 3 instruction, and you will see that the assember has generated some junk just before and after your procedure's contents.
The extra junk is making space on the Stack for your input parameters, and cleaning up when ready to RET.
The junk is also known as a "PROLOGUE and EPILOGUE".

You can do all that junk yourself, or you can be lazy and let the assembler generate it for you.
But if you do it yourself, do not mention the parameters in the procedure's definition.

Posted on 2009-10-24 00:00:44 by Homer

Why do we need to use SP to access the parameters, that is why is SP needed at all?

Because you push 2 parameters onto the stack before the call and sp points to the top of the stack.. the computer organization book explains this in the same chapter the code is from..
Posted on 2009-10-24 00:14:33 by lone_samurai5

Why do we need to use SP to access the parameters, that is why is SP needed at all?

Because you push 2 parameters onto the stack before the call and sp points to the top of the stack.. the computer organization book explains this in the same chapter the code is from..

Do we always need to work with SP when dealing with the stack?
Posted on 2009-10-24 00:34:44 by dre
Whoa!!!

Youse guys have been doing 32-bit code too long! "" is not a valid effective address in 16-bit code! bx is your "base register", si and di are your "index registers", bp is your "base pointer"(?). (normal calling convention specifies that we should preserve these registers across a call - so we have to "push bp"!) An effective address (in 16-bit code) consists of an optional offset, plus an optional base register, plus an optional index register. Period. (you could use "" in 16-bit code... the upper word of esp is "probably" clear... you want code that "probably" works?)

It is worth mentioning that bx, si, and di default to ds:??, bp defaults to ss:bp (these defaults can be overridden... "", for example... "es:" for Masm, I guess). All x86 addresses involve a segment and an offset - even in 32-bit mode! The "flat memory model" (all segment descriptors start from offset zero) allows us to forget about this fact - thank goodness!!! (you're gonna like 32-bit code, when you "graduate" to it!)

So... we:

push dx
push cx
call sum

I hope you know that "call" uses the stack to store the return address. So our stack looks like

???
parameter 2
parameter 1

Now we hit "sum:", and "push bp". Stack looks like:

???
parameter 2
parameter 1
caller's bp <- ss:sp

Then we do "mov bp, sp", so bp is pointed at "caller's bp". It isn't used in this routine, but commonly something is subtracted from bp at this point to make space on the stack for "local variables", aka "stack variables". C call's 'em "automatic" variables, because the memory (on the stack) is automatically freed when the function exits. But we don't need local variables, we only need to access our parameters...

???
parameter 2 <-
parameter 1 <-
caller's bp <-

(the "ss" is default, and you probably shouldn't write it that way - Masm will "optimize it away" - I think - but Nasm will emit the "segment override" byte - which we don't need!)

Does that clear up why we do it that way?

(all of this cruft should be in your book!!!)

Best,
Frank

Posted on 2009-10-24 09:12:25 by fbkotler

(all of this cruft should be in your book!!!)

There's plenty that needs to be in there!

If you wish to assist, you should have edit privileges in the Book.
Posted on 2009-10-24 13:11:57 by SpooK
Sorry guys these are my class notes, no book was required for this course so I am unable to refer to the text for questions that would likely be answered in there. Thank you for the help though, the stack is a clear to me now.
Posted on 2009-10-24 13:17:20 by dre