大多數(shù)匯編語言指令的要求,要被處理的操作數(shù)。提供一個操作數(shù)地址要被處理的數(shù)據(jù)被存儲的位置。某些指令不需要??操作數(shù),而其他一些指令可能需要一個,兩個或三個操作數(shù)。
當一個指令需要兩個操作數(shù),第一個操作數(shù)是一般的目的,其中包含在一個寄存器或內(nèi)存位置和第二個操作數(shù)源數(shù)據(jù)。源碼包含要傳送的數(shù)據(jù)(立即尋址)或(寄存器或存儲器)中的數(shù)據(jù)的地址。一般來說,操作后的源數(shù)據(jù)將保持不變。
解決的三種基本模式是:
寄存器尋址
立即尋址
存儲器尋址
在這種尋址方式中,寄存器包含操作數(shù)。根據(jù)不同的指令,寄存器可能是第一個操作數(shù),第二個操作數(shù)或兩者兼而有之。
例如,
MOV DX, TAX_RATE ; Register in first operand MOV COUNT, CX ; Register in second operand MOV EAX, EBX ; Both the operands are in registers
隨著處理數(shù)據(jù)寄存器之間不涉及內(nèi)存,它提供數(shù)據(jù)的處理速度是最快的。
立即數(shù)有一個恒定的值或表達式。當一個指令有兩個操作數(shù)使用立即尋址,第一個操作數(shù)是寄存器或內(nèi)存中的位置,和第二個操作數(shù)是立即數(shù)。第一個操作數(shù)定義的數(shù)據(jù)的長度。
例如,
BYTE_VALUE DB 150 ; A byte value is defined WORD_VALUE DW 300 ; A word value is defined ADD BYTE_VALUE, 65 ; An immediate operand 65 is added MOV AX, 45H ; Immediate constant 45H is transferred to AX
當操作數(shù)指定內(nèi)存尋址模式,直接訪問主存儲器的數(shù)據(jù)段,通常是必需的。這種方式處理的數(shù)據(jù)的處理速度較慢的結果。為了找到確切的位置在內(nèi)存中的數(shù)據(jù),我們需要段的起始地址,這是通常出現(xiàn)在DS寄存器和偏移值。這個偏移值也被稱為有效的地址。
在直接尋址方式,是直接指定的偏移值作為指令的一部分,通常由變量名表示。匯編程序計算的偏移值,并維護一個符號表,它存儲在程序中使用的所有變量的偏移值。
在直接存儲器尋址,其中一個操作數(shù)是指一個內(nèi)存位置和另一個操作數(shù)引用一個寄存器。
例如,
ADD BYTE_VALUE, DL ; Adds the register in the memory location MOV BX, WORD_VALUE ; Operand from the memory is added to register
這種尋址模式使用算術運算符修改一個地址。例如,看看下面的定義來定義數(shù)據(jù)表:
BYTE_TABLE DB 14, 15, 22, 45 ; Tables of bytes WORD_TABLE DW 134, 345, 564, 123 ; Tables of words
可以進行以下操作:從存儲器到寄存器中的表訪問數(shù)據(jù):
MOV CL, BYTE_TABLE[2] ; Gets the 3rd element of the BYTE_TABLE MOV CL, BYTE_TABLE + 2 ; Gets the 3rd element of the BYTE_TABLE MOV CX, WORD_TABLE[3] ; Gets the 4th element of the WORD_TABLE MOV CX, WORD_TABLE + 3 ; Gets the 4th element of the WORD_TABLE
這種尋址模式利用計算機的能力分部:偏移尋址。一般基寄存器EBX,EBP(BX,BP)和索引寄存器(DI,SI),編碼的方括號內(nèi)的內(nèi)存引用,用于此目的。
通常用于含有幾個元素的類似,數(shù)組變量間接尋址。存儲在數(shù)組的起始地址是EBX寄存器。
下面的代碼片段顯示了如何訪問不同元素的變量。
MY_TABLE TIMES 10 DW 0 ; Allocates 10 words (2 bytes) each initialized to 0 MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX MOV [EBX], 110 ; MY_TABLE[0] = 110 ADD EBX, 2 ; EBX = EBX +2 MOV [EBX], 123 ; MY_TABLE[1] = 123
我們已經(jīng)使用MOV指令是用于將數(shù)據(jù)從一個存儲空間移動到另一個。 MOV指令需要??兩個操作數(shù)。
MOV指令的語法是:
MOV destination, source
MOV指令可以具有以下五種形式之一:
MOV register, register MOV register, immediate MOV memory, immediate MOV register, memory MOV memory, register
請注意:
MOV操作操作數(shù)應該是同樣大小
源操作數(shù)的值保持不變
MOV指令產(chǎn)生引起歧義次數(shù)。例如,下面語句:
MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX MOV [EBX], 110 ; MY_TABLE[0] = 110
目前尚不清楚是否要移動相當于一個字節(jié)或字相當于數(shù)字110。在這種情況下,比較好的做法是使用類型說明符。
下表列出了一些常見的類型說明符:
Type Specifier | Bytes addressed |
---|---|
BYTE | 1 |
WORD | 2 |
DWORD | 4 |
QWORD | 8 |
TBYTE | 10 |
下面的程序說明,上面討論的一些概念。它存儲的名稱'Zara Ali'在數(shù)據(jù)段的內(nèi)存。然后其值更改為另一個名字''Nuha Ali'編程和顯示名稱。
section .text global _start ;must be declared for linker (ld) _start: ;tell linker entry yiibai ;writing the name 'Zara Ali' mov edx,9 ;message length mov ecx, name ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov [name], dword 'Nuha' ; Changed the name to Nuha Ali ;writing the name 'Nuha Ali' mov edx,8 ;message length mov ecx,name ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data name db 'Zara Ali '
上面的代碼編譯和執(zhí)行時,它會產(chǎn)生以下結果:
Zara Ali Nuha Ali