开发手册 欢迎您!
软件开发者资料库

汇编 - 寻址模式

汇编寻址模式 - 从基本概念到高级概念,从简单和简单的步骤学习汇编编程,包括简介,环境设置,基本语法,存储器段,状态寄存器,系统调用,寻址模式,变量,常量,算术,条件执行,循环,逻辑,字符串处理,递归,数组,中断,过程,常量,宏,文件,内存管理。

大多数汇编语言指令都需要处理操作数.操作数地址提供存储要处理的数据的位置.某些指令不需要操作数,而其他一些指令可能需要一个,两个或三个操作数.

当一条指令需要两个操作数时,第一个操作数通常是目标,其中包含寄存器或存储器位置中的数据和第二个操作数是源.源包含要传递的数据(立即寻址)或数据的地址(寄存器或存储器).通常,操作后源数据保持不变.

三种基本寻址模式是 :

  • 注册寻址

  • 立即寻址

  • 内存寻址

寄存器寻址

在此寻址模式下,寄存器包含操作数.根据指令,寄存器可以是第一个操作数,第二个操作数或两者.

例如,

MOV DX, TAX_RATE   ; Register in first operandMOV COUNT, CX   ; Register in second operandMOV EAX, EBX   ; Both the operands are in registers

由于寄存器之间的处理数据不涉及内存,因此它提供了最快的数据处理.

立即寻址

立即数操作数具有常量值或表达式.当具有两个操作数的指令使用立即寻址时,第一个操作数可以是寄存器或存储器位置,第二个操作数是立即数.第一个操作数定义数据的长度.

例如,

BYTE_VALUE  DB  150    ; A byte value is definedWORD_VALUE  DW  300    ; A word value is definedADD  BYTE_VALUE, 65    ; An immediate operand 65 is addedMOV  AX, 45H           ; Immediate constant 45H is transferred to AX

直接内存寻址

在内存寻址模式中指定操作数时,直接访问通常到数据段的主存储器是必需的.这种寻址方式导致数据处理速度变慢.为了找到存储器中数据的确切位置,我们需要段起始地址,它通常在DS寄存器中找到,并且是一个偏移值.此偏移值也称为有效地址.

在直接寻址模式下,偏移值直接指定为指令的一部分,通常由变量名称表示.汇编程序计算偏移值并维护一个符号表,该表存储程序中使用的所有变量的偏移值.

在直接内存寻址中,其中一个操作数指的是内存位置和另一个操作数引用寄存器.

例如,

ADDBYTE_VALUE, DL; Adds the register in the memory locationMOVBX, WORD_VALUE; Operand from the memory is added to register

直接偏移量寻址

此寻址模式使用算术运算符进行修改一个地址.例如,查看定义数据表的以下定义 :

BYTE_TABLE DB  14, 15, 22, 45      ; Tables of bytesWORD_TABLE DW  134, 345, 564, 123  ; Tables of words

以下操作将数据从内存中的表访问到寄存器 :

MOV CL, BYTE_TABLE[2]; Gets the 3rd element of the BYTE_TABLEMOV CL, BYTE_TABLE + 2; Gets the 3rd element of the BYTE_TABLEMOV CX, WORD_TABLE[3]; Gets the 4th element of the WORD_TABLEMOV CX, WORD_TABLE + 3; Gets the 4th element of the WORD_TABLE

间接内存寻址

此寻址模式利用计算机的能力段:偏移寻址.通常,基址寄存器EBX,EBP(或BX,BP)和索引寄存器(DI,SI)在方括号内用于存储器引用,用于此目的.

间接寻址通常用于包含多个元素(如数组)的变量.数组的起始地址存储在EBX寄存器中.

以下代码片段显示了如何访问变量的不同元素.

MY_TABLE TIMES 10 DW 0  ; Allocates 10 words (2 bytes) each initialized to 0MOV EBX, [MY_TABLE]     ; Effective Address of MY_TABLE in EBXMOV [EBX], 110          ; MY_TABLE[0] = 110ADD EBX, 2              ; EBX = EBX +2MOV [EBX], 123          ; MY_TABLE[1] = 123

MOV指令

我们已经使用了用于移动的MOV指令数据从一个存储空间到另一个存储空MOV指令有两个操作数.

语法

MOV指令的语法是 :

MOV  destination, source

MOV指令可能具有以下五种形式之一 :

MOV  register, registerMOV  register, immediateMOV  memory, immediateMOV  register, memoryMOV  memory, register

请注意 :

  • 两者都是MOV操作中的操作数应该是相同的大小

  • 源操作数的值保持不变

MOV指令导致有时模棱两可.例如,查看语句 :

MOV  EBX, [MY_TABLE]  ; Effective Address of MY_TABLE in EBXMOV  [EBX], 110      ; MY_TABLE[0] = 110

目前尚不清楚是否要移动数字等效的字节或等效数字110.在这种情况下,它是明智地使用类型说明符.

下表显示了一些常见的类型说明符 :

Type Specifier字节地址
BYTE1
WORD2
DWORD4
QWORD8
TBYTE10

示例

以下程序说明了上面讨论的一些概念.它在内存的数据部分存储名称'Zara Ali',然后以编程方式将其值更改为另一个名称'Nuha Ali'并显示两个名称.

section.text   global_start     ;must be declared for linker (ld)_start:             ;tell linker entry point   ;writing the name 'Zara Ali'   movedx,9       ;message length   movecx, name   ;message to write   movebx,1       ;file descriptor (stdout)   moveax,4       ;system call number (sys_write)   int0x80        ;call kernel   mov[name],  dword 'Nuha'    ; Changed the name to Nuha Ali   ;writing the name 'Nuha Ali'   movedx,8       ;message length   movecx,name    ;message to write   movebx,1       ;file descriptor (stdout)   moveax,4       ;system call number (sys_write)   int0x80        ;call kernel   moveax,1       ;system call number (sys_exit)   int0x80        ;call kernelsection.dataname db 'Zara Ali '

当编译并执行上面的代码时,它产生以下结果 :

  Zara Ali Nuha Ali