Terence wrote:
> An interesting point in Frank Kotler's posting, is who gets to clean
> up the stack.
> Here Frank is doing it in the main program (obviously because the
> called rountines don't do this for him).
> But I was "brought up" on the Microsoft standard of the CALLED
> subprogram doing a RET N operation to clear the stack. All my hand-
> wriiten subroutine include this, beuase my main program is a Microsoft
> Fortran program which folows my description of the stack
> responsibility.
>
> So I assume Miscroft chnaged it's mind at some point in time, because
> obvious again, the referred called services aboove are Microsoft-
> written Windows service.
[followups trimmed to asm groups... pearls before swine y'know]
Yeah... it's different in Windows. A "hello world in a window" is as
complicated as the X version, or worse. Something simpler will suffice.
I can't find a Windows example that's "right" - "push -11" is *not*
right, we're supposed to push -11 and call GetStandardHandle and use the
return from *that* as a handle. This worked anyway, in win98, IIRC.
It'll do...
; link /entry:start /subsystem:console hwin32.obj <wherever>\kernel32.lib
; you want this clutter in an include file, probably...
%define WriteFile _WriteFile@[EMAIL PROTECTED]
ExitProcess _ExitProcess@[EMAIL PROTECTED]
extern WriteFile
extern ExitProcess
global _start
section .text
; can put routines here, if you want
_start:
push dword 0 ; ??? unicode flag???
push dword num_chars ; return value
push dword MSGLEN
push dword msg
push dword -11 ; can this be right???
call WriteFile
; callee "cleans up stack" - removes all those
; parameters we pushed, via "ret N"
exit_ok:
push dword 0
exit:
call ExitProcess
section .bss
num_chars resd 1
section .rodata
msg db 'Hello, Console.', 13, 10
MSGLEN equ $ - msg
;----------------------------------
An approximate equivalent for Linux - this calls the kernel via the C
calling convention, instead of the int 80h interface - but winds up
executing exactly the same code, unless I'm mistaken...
; nasm -f elf hwcw.asm
; gcc hwcw.o -o hwcw
; ./hwcw
global main
extern write
section .data
msg db 'Hello, World!', 10
msg_len equ $ - msg
section .text
main:
push msg_len
push msg
push 1 ; stdout
call write
add esp, 12
; here we *do* have to "clean up stack"
; callee just ends in "ret"
ret
Note that besides the different stack handling, Windows takes a
parameter for the "return place" to return number of characters written,
while Linux returns it in eax... When it comes to GUI apps, the Xwindows
server is an app of its own - not part of the kernel at all. "I don't
think we're in Kansas anymore, Toto!" :)
Best,
Frank


|