組合語言PTR運算子 重寫運算元的大小型別

2021-09-24 17:17:30 字數 1375 閱讀 9094

ptr 運算子可以用來重寫乙個已經被宣告過的運算元的大小型別。只要試圖用不同於彙編器設定的大小屬性來訪問運算元,那麼這個運算子就是必需的。

例如,假設想要將乙個雙字變數 mydouble 的低 16 位傳送給 axo 由於運算元大小不匹配,因此,彙編器不會允許這種操作:

.data  mydouble dword 12345678h  .code  mov ax,mydouble
但是,使用 word ptr 運算子就能將低位字(5678h)送入 ax:

mov ax,word ptr mydouble
為什麼送入 ax 的不是 1234h ?因為,x86 處理器採用的是小端儲存格式,即低位位元組存放於變數的起始位址。如下圖所示,用三種方式表示 mydouble 的記憶體布局:第一列是乙個雙字,第二列是兩個字(5678h、1234h),第三列是四個位元組(78h、56h、34h、12h)。

不論該變數是如何定義的,都可以用三種方法中的任何一種來訪問記憶體。比如,如果 mydouble 的偏移量為 0000,則以這個偏移量為首位址存放的 16 位值是 5678h。同時也可以檢索到 1234h,其字位址為 mydouble+2,指令如下:

mov ax,word ptr [mydouble+2]     ; 1234h
同樣,用 byte ptr 運算子能夠把 mydouble 的單個位元組傳送到 bl:

mov b1,byte ptr mydouble       ; 78h
注意,ptr 必須與乙個標準彙編資料型別一起使用,這些型別包括:byte、seyte、word、sword、dword、sdword、fword、qword 或 tbyte。

將較小的值送入較大的目的運算元

程式可能需要將兩個較小的值送入乙個較大的目的運算元。如下例所示,第乙個字複製到 eax 的低半部分,第二個字複製到高半部分。而 dword ptr 運算子能實現這種操作:

.data  wordlist word 5678h,1234h  .code  mov eax, dword ptr wordlist      ; eax = 12345
組合語言過程

5.1 組合語言堆疊簡介

5.2組合語言執行時堆疊

5.3 push和pop指令

5.4 proc和endp偽指令

5.5 call和ret指令

5.6 過程呼叫巢狀

5.7示例:整數陣列求和

5.8 uses運算子

5.9鏈結庫簡介

5.10irvine32鏈結庫

5.11irvine32鏈結庫過程詳細說明

5.12irvine64鏈結庫

組合語言中PTR的含義

組合語言中ptr的含義 mov ax,bx 是把bx暫存器 裡 的值賦予ax,由於二者都是word型,所以沒有必要加 word mov ax,word ptr bx 是把記憶體位址等於 bx暫存器的值 的地方所存放的資料,賦予ax。由於只是給出乙個記憶體位址,不知道希望賦予ax的,是byte還是wo...

使用PTR運算子的情況

一 雙運算元指令中 如mov,add,sub等指令 源運算元為立即數,目標運算元為直接定址的儲存器運算元,當兩者型別屬性不一致時,儲存器運算元必須用ptr臨時修改其屬性,使源運算元和目標運算元型別一致。源運算元為立即數,目標運算元為間址,變址,基址或基址加變址定址的儲存器運算元,無論兩者型別屬性是否...

使用PTR運算子的情況

源運算元為立即數,目標運算元為直接定址的儲存器運算元,當兩者型別屬性不一致時,儲存器運算元必須用ptr臨時修改其屬性,使源運算元和目標運算元型別一致。源運算元為立即數,目標運算元為間址,變址,基址或基址加變址定址的儲存器運算元,無論兩者型別屬性是否已經一致,儲存器運算元必須用ptr顯式說明其型別屬性...