組合語言中ptr的含義及作用
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所指記憶體位址處的值。
[cpp]view plain
copy
int n = 100;
int *p = &n;
assert(*p == 100);
*p == 100 為true
dword ptr [ebp-xx]是很常見的用法,常常用來獲取區域性變數:
隨便寫一段**
[cpp]view plain
copy
base *p =
new derive;
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:
int n;
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.它是cpu位址生成單元參與運算的,而不是alu參與運算的,所以在流水線上不會與上下文的算術邏輯指令產生流水相關;
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;
務必牢記。
8086cpu的指令,可以處理兩種尺寸的資料,byte和word。所以在機器指令中要指明,指令進行的是字操作還是位元組操作。對於這個問題,
組合語言中用一下方法處理。
(1)通過暫存器名指明要處理的資料的尺寸。
例如:下面的指令中,暫存器指明了指令進行的是字操作是字操作:
mov ax,1
mov bx,ds:[0]
mov ds,ax
mov ds:[0],ax
inc ax
add ax,1000
下面的指令中,暫存器指明了指令進行的是位元組操作:
mov al,1
mov al,bl
mov al,ds:[0]
mov ds:[0],al
inc al
add al,100
(2)在沒有暫存器名存在的情況下,用操作符 x
ptr指明記憶體單元的長度,x在
彙編指令中可以為word或byte。
例如:下面的指令中,用word
ptr指明了指令訪問的記憶體單元是乙個字單元:
mov word
ptrds:[0],1
inc word
ptr[bx]
inc word
ptrds:[0]
add word
ptr[bx],2
下面的指令中,用byte
ptr指明了指令訪問的記憶體單元是乙個字單元:
mov byte
ptrds:[0],1
inc byte
ptr[bx]
inc byte
ptrds:[0]
add byte
ptr[bx],2
在沒有暫存器參與的記憶體單元訪問指令中,用word prt 或byte
ptr顯性地指明所要訪問的記憶體單元的長度是很必要的。否則,cpu無法得知所要訪問的單元,還是位元組單元。假如我們用debug檢視記憶體的結果如下:
2000:1000 ff ff ff ff ff ff ......
那麼指令:
mov ax,2000h
mov ds,ax
mov byte
ptr[1000h],1
將使記憶體中的內容變為:
2000: 1000 01 ff ff ff ff ff ......
而指令:
mov ax,2000h
mov ds,ax
mov word
ptr[1000h],1
將使記憶體中的內容變為:
2000:1000 01 00 ff ff ff ff ......
這是因為 mov byte
ptr[1000h],1訪問的是位址為 ds:1000h 的位元組單元,修改的是ds:1000h 單元的內容;而mov word
ptr[1000h],1 訪問的是位址為 ds:1000h 的字單元,修改的是 ds:1000h 和 ds:1001h 兩個單元的內容。
(3) 其他方法
有些指令預設了訪問的是字單元還是位元組單元,比如:push [1000h] 就不用指明訪問的是字單元還是位元組單元,因為push指令只進行字操作。
組合語言中PTR的含義及作用
mov ax,bx 是把bx 暫存器 裡 的值賦予 ax,由於二者都是 word 型,所以沒有必要加 word mov ax,word ptr bx 是把記憶體位址等於 bx暫存器的值 的地方所存放的資料,賦予 ax。由於只是給出乙個記憶體位址,不知道希望賦予 ax的,是 byte 還是word 所...
組合語言中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 它們的區別和聯絡體現在...