我正在学习汇编编程的基础知识。我正在慢慢地完成Assembly Language Step-by-Step: Programming with Linux。
我正在使用NASM处理64位Slackware机器(x86-x64)。
我对增加地址的含义感到有些困惑。在我的bss
部分中,我有一个Buffer resb 4096
缓冲区。在text
部分,我将地址分配给esi
:
mov esi, Buffer
稍后,我inc esi
。这似乎将esi
推进到下一个字节偏移量。我有点惊讶 - 我期待esi
提前4个字节,因为它是一个32位寄存器。
我可以假设递增一个地址总是一次移动一个字节吗?我会使用add esi, 4
来推进32位吗?
当我想填充32位寄存器时,是否必须明确要求4个字节?像mov eax, DWORD [esi]
?
答案 0 :(得分:3)
%esi是一个注册。它可以包含地址,您的银行帐户余额或其他任何内容。 cpu无法知道它包含什么样的值。 inc
只是一个算术指令,它将存储在寄存器中的值递增1。
所以是的,如果你想把它增加32位,你必须加4。
当您加载和存储时,它会有所不同,您选择的寄存器(例如%al或%eax)将指示加载/存储的大小。如果有任何歧义或者您想要更改加载/存储的大小,则需要使用大小限定符(word / dword等)