The MASM Forum

General => The Campus => Topic started by: mabdelouahab on August 01, 2016, 04:31:34 PM

Title: segment size
Post by: mabdelouahab on August 01, 2016, 04:31:34 PM

MysSgment segment public 
Var01 dd 00
MysSgment ends
...
MysSgment segment public 
Var022 dd 03
MysSgment ends


How can I get the size of  MysSgment  at executing (not at assembling), Or at least, how can I limit the size of MysSgment 
Title: Re: segment size
Post by: jj2007 on August 01, 2016, 05:04:18 PM
mov eax, offset var1  ; in segment 1
sub eax, offset var2  ; in segment 2

Have a look at it in the debugger, though. Normal segment size is 4096 512 bytes, but linkers can merge segments. Depends on what you really want to achieve...
Title: Re: segment size
Post by: nidud on August 01, 2016, 08:23:57 PM
deleted
Title: Re: segment size
Post by: mabdelouahab on August 02, 2016, 02:45:05 AM
Thank you jj2007, nidud
And these two code (X86 and X64) .
But the 64 version does not accept "OFFSET _INIT",also does not accept "SUB RAX,OFFSET __Var_INIT ", Also you should add ".Code" if you are in the CODE Segment
32 bit code:
Quoteinclude masm32rt.inc
   _INIT      SEGMENT DWORD ALIAS('MySegment')
      __Var_INIT db 'Hi Is '
   _INIT      ENDS
   _INITEND   SEGMENT DWORD ALIAS('MySegment') 
      __Var_INITEND   db 0,'signature'
   _INITEND   ENDS
   _INIT      SEGMENT  DWORD ALIAS('MySegment')
      db 'Me'
   _INIT      SEGMENT 

.code
Start:

   printf("[%s] \n",offset __Var_INIT)

   mov eax,OFFSET _INITEND
   sub eax,OFFSET _INIT
   printf("[%d] \n",eax)

   mov eax,OFFSET __Var_INITEND
   sub eax,OFFSET __Var_INIT
   printf("[%d] \n",eax)

   _INIT      SEGMENT  DWORD ALIAS('MySegment')
      db ' Masm32.'
   _INIT      SEGMENT 

   inkey
   exit
end Start
Quote[Hi Is Me Masm32.]
[18]
[16]
Press any key to continue ...


X64 code:

Quote
include \masm64\include\masm64rt.inc

   _INIT      SEGMENT DWORD ALIAS('MySegment')
      __Var_INIT db 'Hi Is '
   _INIT      ENDS
   _INITEND   SEGMENT DWORD ALIAS('MySegment') 
      __Var_INITEND   db 0,'signature'
   _INITEND   ENDS
   _INIT      SEGMENT  DWORD ALIAS('MySegment')
      db 'Me'
   _INIT      SEGMENT 

.data
      cfmstr   db   '[%s] \n',0
      cfmdwd   db   '[%d] \n',0
.code

main proc <4>
   sub rsp,40
   invoke _cprintf ,&cfmstr,offset __Var_INIT

;   mov rax,OFFSET _INITEND ;------------> error A2148:invalid symbol type in expression : _INITEND
;   mov rcx,OFFSET _INIT  ;------------> error A2148:invalid symbol type in expression : _INIT 
;   sub rax,rcx
;   invoke _cprintf ,&cfmdwd,rax

   mov rax,OFFSET __Var_INITEND
   mov rcx,OFFSET __Var_INIT
   sub rax,rcx
   invoke _cprintf ,&cfmdwd,rax

   invoke ExitProcess,0
   _INIT      SEGMENT  DWORD ALIAS('MySegment')
      db ' Masm64.'
   _INIT      SEGMENT 

   .code
main endp
end

Quote[Hi Is Me Masm64.] \n[16] \n
Title: Re: segment size
Post by: jj2007 on August 02, 2016, 04:03:12 AM
Yes, in x64 you need to use lea rax, somevar
Title: Re: segment size
Post by: mabdelouahab on August 02, 2016, 06:50:19 AM
Quote from: jj2007 on August 02, 2016, 04:03:12 AM
Yes, in x64 you need to use lea rax, somevar
The same thing
Quote
   lea rax, _INITEND ; ---- error A2148:invalid symbol type in expression : _INIT
Title: Re: segment size
Post by: jj2007 on August 02, 2016, 07:44:57 AM
Try with the name of a variable, not with a segment name.
Title: Re: segment size
Post by: mabdelouahab on August 02, 2016, 08:00:34 AM
Quote from: jj2007 on August 02, 2016, 07:44:57 AM
Try with the name of a variable, not with a segment name.
I did that in X64 code (http://masm32.com/board/index.php?topic=5558.msg59330#msg59330)
Title: Re: segment size
Post by: mineiro on August 02, 2016, 10:01:59 AM
I think you can find some conflits but you can do that using labels.
To ml you need insert '.386' on first line and 'end start' at end of file to assemble fine.
to ml64  you need insert 'end' at end of file.

MyDataSegment segment para public "DATA"
datastart label dword
;datastart:
      __Var_INIT db 'Hi Is '
MyDataSegment ends
MyInitSegment segment para public "INIT"
      __Var_INITEND   db 0,'signature'
MyInitSegment ends
MyDataSegment segment para public "DATA"
      db 'Me'
MyDataSegment ends

codeSegment segment para public "CODE"
Start:
   mov eax,OFFSET __Var_INITEND
   sub eax,OFFSET __Var_INIT

MyDataSegment segment para public "DATA"
      db ' Masm32.'
dataend label dword
;dataend:
MyDataSegment ends
mov eax,offset dataend
sub eax,offset datastart
mov ecx,dataend-datastart
cmp eax,ecx
codeSegment ends