The MASM Forum

64 bit assembler => UASM Assembler Development => Topic started by: mineiro on January 24, 2023, 11:59:23 AM

Title: Block nesting error
Post by: mineiro on January 24, 2023, 11:59:23 AM
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
Title: Re: Block nesting error
Post by: johnsa on January 24, 2023, 07:53:24 PM
I've not tried using anything but the simplified directives with linux, I will have to investigate this.
Title: Re: Block nesting error
Post by: johnsa on January 25, 2023, 12:22:59 AM
have you tried setting up the segment without the alias? and possibly try adding some other directives like use64 etc.
Title: Re: Block nesting error
Post by: mineiro on January 25, 2023, 12:44:19 AM
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.