8086汇编(3)

来源:互联网 发布:qt软件开发 编辑:程序博客网 时间:2024/05/22 13:16
寻址方式

立即寻址
    操作数放在指令中,这种数叫立即数。可以是8位也可以是16位。
    例如:MOV AX , 1234H

直接寻址
    在直接寻址的方式下,操作数存放在存储单元中,该存储单元的16位段内偏移地址(即有效地址)紧跟在操作码之后,直接包含在指令中,存放在代码段内区域内。
    操作数的物理地址 = 16D * [DS] + 有效地址
    例如:MOV AL , DS : [1234H]
          MOV AX , DS : [1234H]
          MOV AX , ES : [2000H]
          MOV AX , VALUE
          MOV AX , [VALUE]

寄存器寻址
   在寄存器间寻址,操作数存放在存储单元中。操作数的有效地址存放在寄存器BX,BP,SI和DI之中。
   如果指令中未指定段跨越前缀,则寻址时,对于BX,SI,DI寄存器,默认操作数在数据段中。
   操作数的物理地址=16D*[DS]+[BX]|[SI]|[DI]
   对于BP寄存器,默认的段寄存器为SS,操作数地址为=16D*[SS] + [BP]
   例如:MOV AX , [SI]
         MOV AX , ES : [BX]

寄存器相对寻址(或称直接变址寻址)
   操作数存放在存储单元中,其有效地址由一个基址或变址寄存器的内容加上指令中的指定一个8位或16位的偏移地址来得到。
   即            [BX]
                 [BP]
   有效地址 EA = [SI] + (8位或16位偏移量)
                 [DI]
   如果指令中未指定段跨越前缀,则寻址时,对于BX , SI , DI寄存器,段寄存器使用DS,
   操作数的物理地址位 = 16D*[DS] + [BX]|[SI]|[DI] + (8位或16位偏移量)
   例如:MOV AX , COUNT[SI]
         MOV AX ,[COUNT + SI]
         MOV AH , ES : STR[DI]

基址加变址寻址
   操作数存放在存储单元中,其有效地址为一个基址寄存器的内容加上一个变址寄存器的内容,这两个寄存器均有指令指定。
   有效地址EA = [BX] + [SI]|[DI]或
           EA = [BP] + [SI]|[DI]
   如果无段跨越前缀,对于基址寄存器BX,则默认的段寄存器位DS
   物理地址 = 16D * [DS] + [BX] + [SI]|[DI]
   如果基址寄存器使用的BP,则默认寄存器为SS
   物理地址 = 16D * [SS] + [BP] + [SI]|[DI]
   例如:MOV AX , [BX][SI]
         MOV AX , [BX+SI]
         MOX AX , ES : [BX][SI]

相对的基址加变址寻址
   操作数存放在存储单元中,其有效地址为一个基址寄存器的内容加上一个变址寄存器的内容,再加上一个8位或16位的偏移量。
   有效地址 EA = [BX] + [SI]|[DI] + (8位或16位偏移量)或
            EA = [BP] + [SI]|[DI] + (8位或16位偏移量)
   对于基址寄存器BX,则默认的段寄存器位DS
   物理地址 = 16D * [DS] + [BX] + [SI]|[DI] + (8位或16位偏移量)
   如果基址寄存器使用的BP,则默认寄存器为SS
   物理地址 = 16D * [SS] + [BP] + [SI]|[DI] + (8位或16位偏移量)
   例如:MOV AX , COUNT[BX][SI]
         MOV AX , [COUNT+BX+SI]

汇编的指令系统
   指令语句
   [标号:] 指令助记符 [操作数] [;注释]
    A001:  MOV         AX , 1234H     ; 将1234H传送给AX寄存器
   伪指令语句
   [名字] 伪指令命令 [操作数] [;注释]
    NUM    DW         1234H    ; 定义一个字变量,其值为1234H

常用伪指令

段定义伪指令
   8086/8088的存储器是分段得,因此使用段定义伪指令来组织程序和利用存储器。
   8086/8088程序由一个或多个段组成,多数程序采用一个代码段,一个数据段,一个堆栈段。
   段定义伪指令格式
   段名 SEGMENT [对齐属性][组合属性]['类别']
     。。。
   段名 ENDS

   例如
   DATASG SEGMENT
     V DB 10
   DATASG ENDS
 
子程序定义伪指令
   段名 SEGMENT [对齐属性][组合属性]['类别']
   子程序名 PROC FAR
     。。。
   子程序名 ENDP
   段名 ENDS

ASSUME伪指令
   ASSUME伪指令讲程序中定义的各个段的目的告知汇编程序。
   ASSUME伪指令的一般格式为:
     ASSUME 段寄存器:段名,段寄存器:段名,。。。
 
   CS只能与有指令的序列的段相对应,SS只能与堆栈的段相对应。

结束伪指令
   结束伪指令表示汇编语言源程序到此结束,结束伪指令之后的语句不在进行汇编。
   结束伪指令的一般格式为:
     END [过程名或标号]

   过程名或标号:指示程序第一条要执行的指令的地址。

变量的定义
   变量定义伪指令可以用来为数据段分配内存空间,并且设置相应的内存单元的初始值
   变量定义伪指令的一般格式:
      [变量名]  变量定义符 表达式

    变量定义符 DB 表示定义字节数据存储区 DW表示定义字数据存储区

   例如:
     COUNT DB 100H
     ARRAYT DW -1,1234H,3456H
     BIG  DW ?   ; ?表示无初值
     STR  DB 'HELLO'
     ARRA DB 100 DUP(0) ; 定义一个数据ARRA,占100字节且初始化为0
     ARRB DB 100 DUP(?) ; 定义一个数据ARRB,占100字节且未初始化


原创粉丝点击