寄存器/内存存储属性及汇编MOV指令多场景执行逻辑咨询
关于寄存器、内存寻址与MOV指令的清晰解释
我太懂这种本来有点基础结果越学越乱的挫败感了!咱们把这几个问题拆开来,一个个讲清楚:
问题1:存储在寄存器或内存中的值是地址还是内容?
寄存器和内存本质上都是存储容器,里面存的东西到底是地址还是普通数据,完全取决于你怎么用它:
- 比如你定义了一个普通整数变量
int num = 100,内存里存的就是数值100(内容); - 如果你定义了一个指针
int* p = &num,内存里存的就是num的内存地址; - 寄存器也是同理:比如
eax可以用来存计算结果(普通数值),也可以用来存函数返回的内存地址(比如C语言里malloc返回的指针就存在eax里)。
简单说:容器本身不区分存的是啥,是你的代码逻辑赋予了存储值的意义。
问题2:指令mov eax, 23h的作用是什么?
你猜的完全没错!这个指令是把十六进制数值23直接存入eax寄存器里。
这里的23h是汇编里的立即数——就是直接写死的数值,不是地址。如果要把某个内存地址存入eax,你得用专门的语法(比如MASM里的offset关键字,或者直接写地址常量mov eax, 0x12345678)。
问题3:若.data段中定义了value Word 230,指令mov ax, value会执行什么操作?
这个要看你用的汇编器语法,主流的MASM/TASM里,这个指令是把value对应的内存单元里的数值230加载到ax寄存器中。
这里要注意:在MASM这类汇编器里,直接写变量名value,默认就代表“去这个变量的内存地址里取内容”。如果想把value的内存地址存入ax,你得写mov ax, offset value。
问题4:指令mov ax, [value]的作用是什么?
这个是明确的内存间接寻址操作:它会先找到value对应的内存地址,然后从这个地址里取出存储的数值(也就是230),再把这个数值存入ax寄存器。
补充个小细节:在NASM汇编器里,语法和MASM不一样——NASM里mov ax, value是把value的内存地址存入ax,而mov ax, [value]才是取内存里的内容。所以如果是用NASM,这个指令的作用和MASM里的mov ax, value是完全一致的。
内容的提问来源于stack exchange,提问作者Awais Korai




