匯編中中括號[]作用及lea和mov指令的區別
現在總結一下:其中牽扯到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來說當第二個操作數是寄存器的時候如果加上[]就是尋址了....
ps:匯編中中括號的作用[]
在匯編中[]的作用不是單純的c語言中指針類似,可以分為兩種情況,對于變量來說[var]和var作用是一樣的
但是對于寄存器來說就有區別了,[eax]是eax的地址(這里是c語言中的指針) 而不加中括號的eax就是c語言中的變量值了,理解有謬誤之處望指正
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
.data
buffer byte "%d",0
num dword 12
.data?
lpszSize db 50 dup(?)
.CODE
START:
lea ebx,[num]
mov eax,[ebx]
mov eax,num
mov eax,[num]
invoke wsprintf,offset lpszSize,offset buffer,eax
invoke MessageBox,NULL, offset lpszSize, offset lpszSize,MB_OK
invoke ExitProcess,0
end START
總結
以上所述是小編給大家介紹的匯編語言中中括號[]作用及lea和mov指令的區別,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對html5模板網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!