NASM說明書(v2.14.02)翻譯-3.3 有效地址

Copyright 1996−2017 the NASM Authors – All rights reserved.Redistribution and use in source and binary forms, with or without modification, are permittedprovided that the following conditions are met:
• Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
• Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

有效地址(Effective Address)是操作數的一種,表示指令引用的內存。NASM中表示有效地址的語法非常簡單。NASM使用一個被中括號括起來的表達式來表示有效地址。如:

wordvar dw      123 
        mov     ax,[wordvar] 
        mov     ax,[wordvar+1] 
        mov     ax,[es:wordvar+bx]

任何不符合以上格式的,在NASM中都不是合法的內存引用,如:es:wordvar[bx]
表達式還可以更復雜,比如涉及多個寄存器。

        mov     eax,[ebx*2+ecx+offset] 
        mov     ax,[bp+di+8]

NASM有能力對表達式進行代數運算,因此下面這些看起來不那麼合法表達其實是完全正確的

	mov     eax,[ebx*5]             ; assembles as [ebx*4+ebx] 
	mov     eax,[label1*2-label2]   ; ie [label1+(label1-label2)]

一些有效地址的表達式可以會變成多種格式;在多數情況下,NASM會盡量生成最短的格式。比如,對於32-bit的有效地址[eax*2+0][eax+eax],NASM會生成後者,因爲前者需要額外的4個字節來保存偏移量0。

NASM有一個內在機制,它會導致[eax+ebx][ebx+eax]生成不同的操作碼;這在某些情況下是有用的,因爲[esi+ebp][ebp+esi]默認的段寄存器是不同的。

儘管如此,還是可以通過使用 BYTE、WORD和 NOSPLIT 關鍵字來強制NASM生成特定格式的有效地址。默認情況下[eax+3]中的偏移地址3表示的偏移量是三個Byte。如果想讓3表示三個DOUBLE,可以使用[dword eax+3]。特殊情況,需要使用[eax+0]來表示偏移量是0。正常格式[eax]表示沒有偏移量。

上述格式也可以用來實現在16-bit模式下訪問32-bit的segment。更多的信息請參見10.2節。這是因爲如果在16-bit模式下,不指定偏移量是dword類型,NASM會丟棄偏移量中高位的兩個字節。

同樣的,NASM會將[eax * 2]分割成[eax + eax]以省下偏移量佔用的空間;實際上[eax*2 + offset]同樣會被分割成[eax + eax + offset]。可以使用nosplit關鍵字來使NASM不進行分割,而是按照代碼原本的樣子進行彙編,如[nosplit eax2]會生成[eax * 2 + 0]的有效地址。[nosplit eax*1]也會產生同樣的效果。另一方面[0, eax2]這種被分割的有效地址格式也可以被使用。

另一種新的被分割的有效地址語法也被支持。這種語法主要用於MPX指令使用的mib操作數,但同樣也可以用在其他場景。這種格式的基本概念是將有效地址分割成baseindex

mov eax,[ebx+8,ecx*4]   ; ebx=base, ecx=index, 4=scale, 8=disp

對於mib操作數,取決於工具的不同,有幾種方式來編寫有效地址。NASM支持所有目前可能的mib語法:

     ; bndstx 
     ; next 5 lines are parsed same 
     ; base=rax, index=rbx, scale=1, displacement=3 
     bndstx [rax+0x3,rbx], bnd0      ; NASM - split EA 
     bndstx [rbx*1+rax+0x3], bnd0    ; GAS - '*1' indecates an index reg 
     bndstx [rax+rbx+3], bnd0        ; GAS - without hints 
     bndstx [rax+0x3], bnd0, rbx     ; ICC-1 
     bndstx [rax+0x3], rbx, bnd0     ; ICC-2

下面看不懂,暫不翻譯。

When broadcasting decorator is used, the opsize keyword should match the
size of each element.
VDIVPS zmm4, zmm5, dword [rbx]{1to16} ; single-precision float
VDIVPS zmm4, zmm5, zword [rbx] ; packed 512 bit memory

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章