Hi guys,
I have a question. Does displaying stack is wrong? Can it cause any problems? Here is the sample
code:
.386
.model flat, stdcall
option casemap:none
include /masm32/include/masm32rt.inc
.data?
stop db ?
.data
.code
start:
call writeA
push 1
push offset stop
call StdIn
push 0
call ExitProcess
writeA proc
LOCAL Buff0:DWORD
LOCAL Buff1:DWORD
mov Buff0, "!K"
mov Buff1, "CATS"
lea eax, Buff1
push eax
call StdOut
ret
writeA endp
end start
with a little modification, i had no problems
.386
.model flat, stdcall
option casemap:none
include /masm32/include/masm32rt.inc
you can get rid of the first 3 lines, as the masm32rt.inc file takes care of those
and - i use "\" instead of "/"
the program seems to run, although it isn't pretty :P
so - what is the question ?
I'm only worried about: does it is safe.
it is reasonably safe
when you create local variables, the assembler creates them in the order listed
(the first one listed is at the higher stack address)
you can also do it this way
writeA PROC
push "!K"
push "CATS"
push esp
call StdOut
add esp,8
ret
writeA ENDP
or this way
writeA PROC
push "!K"
push "CATS"
INVOKE StdOut,esp
add esp,8
ret
writeA ENDP
Thanks for help dedndave.
i didn't mention it, but we would normally put the string in the initialized data section
.data
szString db 'STACK!',0
then, eliminate the writeA proc and replace the call with
INVOKE StdOut,offset szString
you see, even though you can create the string on the stack,
it takes more bytes of code than it does for the string, itself
now, if the string is variable (different strings at different times),
we might create it on the stack and display it from there
Hi kejt,
welcome to the forum. :t
Gunther
Quote from: kejt on January 27, 2013, 03:20:53 AM
I'm only worried about: does it is safe.
Absolutely safe. The stack is a memory area that all your proggies are using all the time, so you can do with it what you want. Here is a variant of your prog. Launch Olly to compare it to your version.
writeA proc
push "!e"
push "fas "
push "si K"
push "CATS"
push " ehT"
invoke StdOut, esp
add esp, 5*DWORD
ret
writeA endp
I was gone for a while. I know that there are other more efficient methods of displaying strings, but I need to do it this way. I have a proc which returns string result to local variables. I have needed to save some bytes. Just wanted to know: does it is safe. Thanks all for answers.
here's an example of when to use the stack :P
EDIT: oops - forgot to preserve EBX
updated version attached
Quote from: kejt on January 27, 2013, 05:51:24 AM
I was gone for a while. I know that there are other more efficient methods of displaying strings, but I need to do it this way. I have a proc which returns string result to local variables. I have needed to save some bytes. Just wanted to know: does it is safe. Thanks all for answers.
It's safe to use the stack, as long as you only use 'your' space (local variables or stack frame) and don't overwrite outside of that. You can pass data on the stack to other functions that you have called, but you shouldn't return data on the stack to functions that called yours.
Hi kejt,
Another quick example :
include \masm32\include\masm32rt.inc
.data
format1 db 'Stack = %X , Value = %u',0
.data?
buffer db 64 dup(?)
.code
start:
push 1000
mov edx,esp
invoke wsprintf,ADDR buffer,ADDR format1,edx,DWORD PTR [edx]
invoke StdOut,ADDR buffer
pop eax
invoke ExitProcess,0
END start