x86汇编中方括号的含义及相关指令差异咨询
嘿,刚入门汇编确实容易被方括号搞懵,我来给你掰扯清楚这几条指令的区别,尤其是你纠结的第一条!
先把最常见的四条mov指令拆解开讲:
mov ebx, eax:这是最直接的寄存器间赋值,完全不碰内存。就是把eax寄存器里存的数值原封不动复制到ebx里。比如eax里是0x1234,执行完这条,ebx里也会是0x1234。mov ebx, [eax]:这就是你疑惑的核心!方括号在这里的作用是解引用内存地址——简单说,CPU会把eax里的内容当成一个内存地址,然后去这个地址里取出存储的值,再把这个值放到ebx里。举个例子:如果eax里存的是0x0012FF7C(某个有效的内存地址),而这个地址里存的是0x5678,那执行完这条指令后,ebx里会是0x5678,而不是eax里的0x0012FF7C。这就是方括号的意义:它告诉CPU“别用eax里的数值本身,用这个数值指向的内存里的内容”。你之前误以为是把eax的值移到ebx,那是把这条和上面的mov ebx, eax搞混啦。mov [ebx], eax:这条是内存写入操作。它会把eax里的数值,写入到ebx里的数值所指向的内存地址中。比如ebx里是0x0012FF7C,eax里是0xABCD,执行后,内存地址0x0012FF7C里的内容就会变成0xABCD。mov eax, [ebx]:和第一条带方括号的指令方向相反——把ebx所指向的内存地址里存储的值,读取出来放到eax寄存器中。
总结一下:带方括号的指令都会涉及内存的读写,方括号里的寄存器存的是内存地址;不带方括号的就是寄存器之间直接传递数值,完全和内存无关。
内容的提问来源于stack exchange,提问作者ineedahero

