I'm receiving Block nesting error if I try to use invoke inside (.init) segment.
I'm missing something? Linux x86-64.
;Example of constructor, destructor, signal handling.
;uasm -elf64 cd_signal.asm
;gcc cd_signal.o -o cd_signal -no-pie -fno-pie -lc
;rm cd_signal.o
.X64
option casemap:none
exit proto systemv status:dword
printf proto systemv pformat:PTR, arg:VARARG
signal proto s:dword,handler:ptr
SIGINT equ 2
_fini segment alias(".fini")
mov rax,0
lea rdi,dtor
call printf
_fini ends
_init segment alias(".init")
;invoke printf,CSTR("alo mundo",10) ;<---this line ;cd_signal.asm(27) : Error A2080: Block nesting error: _init
;invoke printf,CStr("alo mundo",10) ;<---or this line
mov rax,0
lea rdi,ctor
call printf
_init ends
_DATA segment public use64 'DATA'
align 16
ctor db "constructor",10,0
align 16
dtor db "destructor",10,0
_DATA ends
.data?
.data
.code
main proc uses rbx r12 r13 r14 r15 _argc:dword,_argv:ptr
local argc:dword
local argv:qword
mov argc,_argc
mov argv,_argv
invoke signal,SIGINT,addr controlc ;control+c procedure
invoke printf,CStr("main loop, hit control + c",10)
mov rcx,-1
.while rcx != 0
dec rcx
.endw
ret
main endp
align 16
controlc proc
invoke printf,CStr(13,"Pressed control + c, exiting",10)
invoke exit,1
ret
controlc endp
end main
./cd_signal
constructor
main loop, hit control + c
Pressed control + c, exiting
destructor