這是間接尋址的格式:
example:
| Base | Index * Scale | Discplacement |
|------|-----------------|------------------|
| EAX | EBX * 2 |8-Bit Displacement|
但是還有一些我還不明白的地方:
如果我們有一個地址
EAX并添加,EBX*2這是否會將位于中的地址/值EBX*2添加到中的值/地址中EAX?位移到底是什么,為什么可能有 8 位、32 位或無位移,而不是說 4 位或 2 位位移?
如果我們有每個 4 位元組大的值 - 在
EAX暫存器中,我們將進行乘法,EAX*4但為什么這種乘法與位元組值(我知道每個單元格有 1 個位元組)。這是否意味著它會自動將位元組轉換為位?
uj5u.com熱心網友回復:
完整的公式類似于“ address = (base index << scale displacement) & mask”。
注 1:“比例”是移位計數,沒有乘法。它只是為了人類方便而被描述為乘法。
注 2:“掩碼”用于表示對目標大小的包裝/截斷。例如,如果base index << scale displacement結果為 0x0000000212345678,但 CPU 需要 32 位地址,則掩碼將為 0x00000000FFFFFFFF,實際結果將為 0x12345678。
如果我們有一個地址
EAX并添加,EBX*2這是否會將位于中的地址/值EBX*2添加到 EAX 中的值/地址?
是的。例如,如果 EAX = 3 且 EBX = 10,則 EAX EBX*2 將是 23。
位移到底是什么,為什么可能有 8 位、32 位或無位移,而不是說 4 位或 2 位位移?
位移只是添加到其余部分的數字。用于記憶體訪問;它通常用于訪問結構欄位(例如“結構地址 結構中第 n 個欄位的偏移量”)和堆疊位置(例如“堆疊頂部 - 從堆疊頂部偏移”)。
CPU 大多只是讀取一個數字序列;然后需要能夠解碼數字以找出指令是什么以及它的運算元是什么(并且一旦數字被解碼,它就會執行相應的指令)。更多的可能性使解碼變得更加困難,這需要通過實用性來證明。2 位和 4 位位移可以簡單地四舍五入到 8 位,因此很難證明解碼中額外的復雜性是合理的。
只有 2 位(ModRM 位元組中的模式欄位)來表示暫存器與沒有顯示的記憶體、具有 8 位顯示的記憶體或具有 32 位顯示的記憶體。有更多的選擇會從其他東西中帶走更多的東西;該DISP是一個簡單的二進制值(即獲得符號擴展),它不本身使用一個可變長度編碼。(幸運的是,否則指令長度解碼將不得不查看它,而不僅僅是前綴 操作碼 ModRM 位元組。)
如果我們有每個 4 位元組大的值 - 在 EAX 暫存器中,我們將乘以 EAX*4 但為什么乘以位元組值(我知道每個單元格有 1 個位元組)。這是否意味著它會自動將位元組轉換為位?
“EAX * 4”實際上是“EAX << 2”。小移位計數非常常見(例如shl eax,cl),因為“移位計數太大”(例如,在 32 位計算中大于 32)與對目標大小的屏蔽相結合使其毫無意義。例如,考慮一個虛構的“address = (EAX << 32) & 0xFFFFFFFF”(這是沒有意義的,因為它可以被替換為“address = 0”)。
本質上,對于 32 位地址計算,從 0 到 31 的移位計數可能有用,而較小的移位計數(從 0 到 3)最有用。此時我們可以回到“更多的可能性使解碼變得更難,這需要用有用性來證明”來理解為什么 80x86 只支持從 0 到 3(或乘法器 1、2、4 和 8)的移位計數;即使其他班次計數(例如“EAX << 4”或“EAX*16”)可能偶爾有用。
2、4 和 8 是陣列的常見元素大小,因此這種 2 位移位計數使得索引雙字陣列成為可能,例如使用保存元素編號而不是位元組偏移量的暫存器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/357360.html
