汇编--学习笔记(二)-寻址方式

来源:互联网 发布:刘雨晴淘宝卖假货 编辑:程序博客网 时间:2024/05/21 08:52

一、指令系统

 一组指令的集合

二、寻址方式

 取得操作数地址的方式

三、指令格式

1、形式
[标号] 操作码 [目标操作数] [,源操作数] [;注释]

  • 标号 :是一个符号
  • 操作码:是一个操作码助记符,它可以是指令、伪操作或宏指令名。它是汇编指令的关键字,指出该指令做什么。
  • 目标操作数:指出指令的处理结果置于何处。
  • 源操作数:指出指令的处理对象来源何处。它绝不存放结果。
  • 注释:注释用于说明程序或语句的功能。
  • 指令结束:用回车表示。

操作数

1、立即数(数学中的常数)

  • (1)作为代码指令的一部分出现在双操作数指令中;
  • (2)除了乘法、除法和字符串指令外,立即数均可作为源操作数;
  • (4)书写可以为2、8、10、16进制
  • (5)用16进制书写时,若第一个字符非数字0-9,则前面一定补一个0.

2、寄存器

  • (1)寄存器操作数是指寄存器的内容参加运算,或用寄存器存放结果;
  • (2)段寄存器:CS、DS、SS、ES指出当前4个段的地址,故不能用一般指令将立即数送入。
    • 应先将立即数值送到AX,再用AX送入DS、SS、ES。
    • CS一般不需要人工干预,因为与地址有关。
  • (3)FLAG标志寄存器
    • 一般不能作为操作数,但可以用标志指令如INC、DEC、MUL、ADD等处理。
  • (4)通用、指针和变址寄存器
    • AX、BX、CX、DX、BP、SI、DI等均可参加算术和逻辑运算;
    • 虽然经常用AX作为累加器(AX的速度快一些),但实际上所有通用寄存器均可;
  • (5)寄存器作为隐含操作数
    • 某些指令虽然没有显式地写有寄存器,但它隐含使用某寄存器;例如:AAA,隐含AL

3、内存

  • (1)是把内存某地址的字节、字或双字作为操作数;
  • (2)要求使用前必须指出其所在段和相对段首的位移;
  • (3)内存操作数所在段的段寄存器的名字,在汇编指令中一般是不写的。它遵循着下面的隐含原则:
存储器操作的类型 正常使用的段 可以使用的其它段 相对位移 取指令 CS(取指令只能在CS段里面) 无 IP 堆栈操作 SS 无 SP 变量(以下情况除外) DS CS、ES、SS 有效地址EA 源数据串 DS CS、ES、SS SI 目标数据串 ES(字符串只能在ES里面) 无 DI 基地址指针用BP的变量 SS CS、DS、ES 有效地址EA

4、寻址规则
分为4大类(固定、立即、直接、间接)9小类:

  • 1、固定寻址
  • 2、立即数寻址
  • 3、寄存器直接寻址
  • 4、寄存器间接寻址
  • 5、存储器直接寻址
  • 6、变址寻址
  • 7、基地址加变址寻址
  • 8、数据串操作数的寻址
  • 9、I/O端口寻址

1、固定寻址

 隐含对固定目标的寻址。例如:AAA ;加法的ASCII码调整
隐含使用AL寄存器,即采用对AL寄存器进行固定寻址,被调整的数位于AL中。这一类指令多为对应的单字节指令。

2、立即数寻址

 操作数是一个数。可为2、8、10、16进制。例如:MOV AX,0ABH ;送数值到寄存器(16进制若首位是字母,则加0)
说明:(1)立即数可以是字节或字、常数。
(2)只能作为源操作数

3、寄存器直接寻址

 寄存器的内容就是操作数。使用时只需要写上寄存器的名字。
例如:

MOV AX,0ABH ;送数值到寄存器ADD AX,BX  ;寄存器加运算PUSH DS    ;数据段寄存器入栈

说明:(1)通用寄存器、指针及变址寄存器均可作为源、目标操作数,用于寄存器直接寻址;
(2)虽然任何数据寄存器均可参加算术及逻辑运算,但建议尽量使用AX寄存器,因为AX作为累加器存放其结果,则指令码最短。

4、寄存器间接寻址

  • (1)寄存器的内容是操作数的地址;
  • (2)寄存器只可以是:SI、DI、BX、BP中的其中一个。
  • (3)书写及使用时相应寄存器名字用“[ ]”括起来,表示该寄存器的内容为EA。例如:MOV AX,[BX] ;BX内容为操作数的地址
  • (4)地址的形成:(段寄存器)*10H+(寄存器)
    • SI、DI、BX:默认段寄存器为DS
    • BP:默认寄存器为SS
      引用上例:(DS)*10H + (BX)

5、存储器直接寻址

 就像高级语言中的“变量”。

(1)是指有效地址EA直接可用代码指令中某一字段得到,它可以是以字节或字表示的位移。用disp表示。

MOVVA DB 20H ;定义一个字节变量;VA 就是一个变量名;DB 中的B代表这是一个字节类型的变量;DW 代表一个字类型的变量;DD 代表双字类型的变量MOV AL,VA ;送内存数到寄存器。其中VA--位移

(2)书写形式类似于立即数寻址。必须从整个程序上下文分析才能得出正确结论。
(3)物理地址构成:(DS)*10H+disp—–其中disp表示位移量
(4)段超越
 可以不使用数据段寄存器DS,但需在disp前写上寄存器名字,然后加一冒号(:),以代替隐含的段寄存器。例如:

MOV AX,ES:[BX]  ;ES叫做段前缀操作,段基由ES给,BX就是间接寻址的道理

6、变址寻址

(1)定义:是指使用SI、DI、BX、BP与直接位移量disp构成的存储器寻址方式。
(2)地址形成:
  (段寄存器)*10H+(寄存器)+disp
  即寄存器间接寻址计算出的EA后再加上disp
(3)书写形式
[BX] + disp
disp[BX]
[BX + disp]
 三者含义相同,其中BX可以是SI、DI、BX和BP
例如:

MOV AX,[DX+A1]  ;送数至寄存器EA形成:(DS)*10H + (DI) + A1

7、基址加变址寻址

(1)定义:以BX和BP为基址寄存器,而以SI和DI为变址寄存器,形成的存储器寻址方式。
(2)有效地址形成:
 EA = (基址寄存器) + (变址寄存器)[+ disp]
(3)操作数形式

例如:
  [BX +SI]+disp
  disp[BX][SI]
   [BX+SI+disp]
  三者含义相同

  [BX+DI] +disp
  [BP + SI] +disp ;各种寻址方式,只要有BP,通常是指对堆栈段操作
  [BP + DI] +disp

MOV AX,[BX+DI+A1] ;送数至寄存器EA形成:(DS)*10H+(BX)+(DI)+A1

8、数据串操作数的寻址

(1)串操作指令不同于其它指令,它使用隐含的变址寄存器来寻址,且操作过程中自动修改寄存器内容以指向下一步操作的地址。
(2)修改分两种:自动增或自动减。
  取决于FLAG的标志DF:
  DF = 1:自动减
  DF = 0:自动增
(3)有效地址形成:
  对源操作串:EA = (SI),段的基地址由DS指定
  对目标串: EA = (DI),段的基地址由ES指定

9、I/O端口寻址

 对分配在I/O空间中的端口有2种寻址方式:
(1)直接端口寻址
  端口号可以是8位的立即数(0~255)
(2)简介端口寻址
  端口号必须事先存放在寄存器DX中,可以是16位数(0~65525)。
例如:

OUT 21H,AL ;AX内容送21H号端口MOV DX,1250 OUT DX,AL  ;AL内容送1250H号端口

输出Hello World字符串汇编代码!

DATAS  SEGMENT     STRING  DB  'hello yuanlifu!!','$';显示字符串DATAS  ENDSCODES  SEGMENT     ASSUME    CS:CODES,DS:DATASSTART:     MOV  AX,DATAS     MOV  DS,AX     LEA  DX,STRING     MOV  AH,9     INT  21H     MOV  AH,4CH     INT  21HCODES  ENDS    END   START

输出字符串的另外一个方法

DATA SEGMENT    HM DB 'hello liefyuan!',0DH,0AH,'$';显示字符串DATA ENDSCODE SEGMENT    ASSUME CS:CODE,DS:DATAGO  PROC FAR    PUSH DS    MOV AX,0    PUSH AX    MOV AX,DATA    MOV DS,AX    MOV DX,OFFSET HM    MOV AH,9    INT 21H    RETGO  ENDPCODE ENDS    END GO