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顯式說明其型別屬性...