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
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...
deleted
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
Yes, in x64 you need to use lea rax, somevar
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
Try with the name of a variable, not with a segment name.
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)
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