在线二区人妖系列_国产亚洲欧美日韩在线一区_国产一级婬片视频免费看_精品少妇一区二区三区在线

鍍金池/ 教程/ Java/ Assembly 尋址模式和MOV指令
Assembly 變量聲明
Assembly匯編 STOS指令
Assembly 條件
Assembly 尋址模式和MOV指令
Assembly匯編教程
Assembly - 什么是匯編語言
Assembly 循環(huán)
Assembly 內(nèi)存段
Assembly匯編 宏
Assembly 寄存器
Assembly匯編 遞歸
Assembly匯編 CMPS指令
Assembly匯編 內(nèi)存管理
Assembly匯編 LODS指令
Assembly 基本語法
Assembly匯編 過程
Assembly匯編 文件管理
Assembly匯編 數(shù)組
Assembly匯編 SCAS指令
Assembly 算術指令
Assembly 環(huán)境設置
Assembly匯編 字符串處理
Assembly 數(shù)字
Assembly 常量
Assembly匯編 MOVS指令
Assembly 邏輯指令
Assembly 系統(tǒng)調(diào)用

Assembly 尋址模式和MOV指令

大多數(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

MOV指令

我們已經(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