I have such code:
mov eax, 0
mov [left], eax
mov eax, [len]
dec eax
mov [right], eax
I need to get 0 in left and len - 1 in right. But somehow left gets 0 and after line gets len - 1 too. I try to use another register for right, but result same.
mov eax, 0
mov [left], eax
mov ebx, [len]
dec ebx
mov [right], ebx
So, it gives same result.
Full code:
section .data
len dd 10
section .bss
left resd 0
right resd 0
section .text
global main
push rbp
mov rbp, rsp
mov eax, 0
mov [left], eax
mov eax, [len]
dec eax
mov [right], eax
and at this line I already have a problem
CodePudding user response:
From the nasm manual:
RESB, RESW, RESD, RESQ, REST, RESO, RESY and RESZ are designed to be used in the BSS section of a module: they declare uninitialized storage space. Each takes a single operand, which is the number of bytes, words, doublewords or whatever to reserve.
So your
left resd 0
right resd 0
reserves 0 dwords for left and right, i.e. no memory at all. Thus they end up at the same address, and you observe that writing to one also seems to write the other.
You probably wanted left resd 1, etc.
You may have been thinking of 0 as the value to initialize with, like dd, but the whole point of resd is that you don't get to specify the initial value; in the .bss section it's automatically zero.
