組合語言中PTR的含義及作用

2021-06-18 20:41:45 字數 3899 閱讀 2421

組合語言中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 它們的區別和聯絡體現在...