mov ax,bx ;
是把bx
暫存器「裡」
的值賦予
ax,由於二者都是
word
型,所以沒有必要加
「word」
mov ax,word ptr [bx];
是把記憶體位址等於
「bx暫存器的值
」的地方所存放的資料,賦予
ax。由於只是給出乙個記憶體位址,不知道希望賦予
ax的,是
byte
還是word
,所以需要用
word
明確指出!
所以,當兩個運算元的寬度不一樣時,就要用到ptr。
也就是說
*p 用彙編表示就是:dword ptr [p]
*p是取p所指記憶體位址處的值。
在沒有暫存器名存在的情況下,既都是在記憶體,得用操作符 x ptr 指明記憶體單元的長度,x在彙編指令中可以為byte,word或者dword。要不然記憶體是片連續的區域,操作就亂了。
在沒有暫存器參與的記憶體單元訪問指令中,用word prt 或byte ptr 顯性地指明所要訪問的記憶體單元的長度是很必要的。否則,cpu無法得知所要訪問的單元,還是位元組單元。
不管用在什麼位置,ptr的作用就是臨時指定型別 可以放在ptr前面的型別有byte(位元組)、word(字)、dword(雙字)、qword(四字)、tbyte(十字節)、far(遠型別)和near(近型別)
[cpp]view plain
copy
intn = 100;
int*p = &n;
assert(*p == 100);
*p == 100 為true
dword ptr [ebp-xx]是很常見的用法,常常用來獲取區域性變數:
隨便寫一段**
[cpp]view plain
copy
base *p =
newderive;
base *d = p;
d->f();
反彙編**如下:
[cpp]view plain
copy
31: base *d = p;
00401469 mov eax,dword ptr [ebp-18h]
0040146c mov dword ptr [ebp-1ch],eax
32: d->f();
0040146f mov ecx,dword ptr [ebp-1ch]
00401472 mov edx,dword ptr [ecx]//得到虛函式表指標
00401474 mov esi,esp
00401476 mov ecx,dword ptr [ebp-1ch]//ecx即為this指標
00401479 call dword ptr [edx]//呼叫第乙個虛函式,這裡就是f
0040147b cmp esi,esp
0040147d call __chkesp (00402750)
再來看看c中的取位址符&如何處理的
[cpp]view plain
copy
27:
intn;
28: int
*pp = &n;
0040141d lea eax,[ebp-10h]
00401420 mov dword ptr [ebp-14h],eax
lea指令我看到看雪論壇有人如此說:
lea是intel頗為得意的一條指令(雖然大多數程式設計師並不以為然)。在intel optimization referfence manual中,特別提到了這條指令的好處。
0.lea指令具有單時鐘週期,執行效率很高。1.
lea 不在 alu 裡執行,而是在 agu (address generation unit) 裡執行
alu 與 agu 是並行的整數運算單元,將巧妙地 lea 與 add 分開並行執行,很大程度提高吞吐量。
2.intel指令集中不存在很多risc機器所具有的三運算元算術運算指令,比如像arm的"add r0,r1,r2",而lea指令恰好提供了同樣的功能,以模擬「三元算術邏輯指令」。
舉個例子,要計算兩個暫存器的和,但又不想破壞原來的值,那麼可以執行lea ebx ,[eax+edx], 這條指令,執行的就是 ebx = eax + edx 這條加法運算。如果用add指令,則不可能一條指令內完成。
3.在組合語言程式設計中,在需要取得乙個變數位址時,使用lea是很方便的。而mov指令則常常出錯,因為在微軟masm彙編語法中,label和variable是不同的。
看來可以多用lea。
總結一下:
取值:mov eax ,[ebp-18h] mov [ebp-1ch],eax 相當於 : int a= b;
務必牢記。
組合語言中PTR的含義及作用
組合語言中ptr的含義及作用 mov ax,bx 是把bx暫存器 裡 的值賦予ax,由於二者都是word型,所以沒有必要加 word mov ax,word ptr bx 是把記憶體位址等於 bx暫存器的值 的地方所存放的資料,賦予ax。由於只是給出乙個記憶體位址,不知道希望賦予ax的,是byte還...
組合語言中PTR的含義
組合語言中ptr的含義 mov ax,bx 是把bx暫存器 裡 的值賦予ax,由於二者都是word型,所以沒有必要加 word mov ax,word ptr bx 是把記憶體位址等於 bx暫存器的值 的地方所存放的資料,賦予ax。由於只是給出乙個記憶體位址,不知道希望賦予ax的,是byte還是wo...
組合語言中暫存器的作用
對於8086的系統 1.暫存器按照功能的不同可分為通用暫存器 ax,bx,cx,dx,sp,bp,si,di。其中的前四個暫存器可分別分成ah,al bh,bl ch,cl dh,dl的八位暫存器 指令指標暫存器 ip 標誌暫存器 flags 段暫存器 cs,ds,es,ss 它們的區別和聯絡體現在...