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
I've not tried using anything but the simplified directives with linux, I will have to investigate this.
have you tried setting up the segment without the alias? and possibly try adding some other directives like use64 etc.
Thanks for answering sir johnsa.
Yes, I tried that but no luck.
The segment name should start with a dot.
If I use code below, program works, but when I try to use invoke in that segment so the message of Block nesting error appear.
option dotname
.fini segment
.fini ends
I tried the assume directive to set the segment registers, without success. I tried to set the use of segments before their use, but without success.
I tried to not use CStr, and invoke works fine.
So, sounds that it's CStr my problem. It's just for convenience, no need to worry.