匯編中中括號[]作用以及lea和mov指令的區別
阿新 • • 發佈:2018-08-02
article truct err csdn 指針 valid tail 支持 art
二.mov指令:
對於變量來說
num dword 2
mov eax,2
mov ebx,num
mov ecx,[num];執行完ebx==ecx==2
對寄存器
mov ebx,eax;ebx==2
mov ecx,[eax];可能會報錯,因為這裏翻譯成匯編是mov ecx,DS:[eax]
總的說來加不加中括號[]的區別就是:
lea對變量沒有影響是取地址,對寄存器來說加[]時取值,第二操作數不加[]非法
現在總結一下:其中牽扯到lea指令,mov指令,[]
一.lea指令:
對於寄存器來說:第二個操作數是寄存器必須要加[],不然報錯,這裏lea就是取[寄存器]的值,如:
mov eax,2
lea ebx,[eax];執行後ebx=2
mov ebx,eax;等同於上句
lea ebx,eax;編譯器報錯: error A2070: invalid instruction operands
對於變量來說加不加[]都是一樣的效果,都是取變量的地址,相當於指針
如:
num dword 2
lea ebx,num
lea eax,[num]; eax為num的地址,如eax=4206598,隨程序不同不同,這時ebx==eax
二.mov指令:
對於變量來說
num dword 2
mov eax,2
mov ebx,num
mov ecx,[num];執行完ebx==ecx==2
對寄存器
mov ebx,eax;ebx==2
mov ecx,[eax];可能會報錯,因為這裏翻譯成匯編是mov ecx,DS:[eax]
總的說來加不加中括號[]的區別就是:
lea對變量沒有影響是取地址,對寄存器來說加[]時取值,第二操作數不加[]非法
mov對變量來說沒有影響是取值,對寄存器來說是加[]時取地址,第二操作數不加[]是取值
還有一點這裏順便說下,看有的教程說mov指令不支持mov ebx,[eax+2*eax......什麽亂七八糟的表達式]歸根結底就是對於mov來說當第二個操作數是寄存器的時候如果加上[]就是尋址了....
https://blog.csdn.net/spygg/article/details/8760310
匯編中中括號[]作用以及lea和mov指令的區別