8088(8086)的寻址方式以及数据传送类指令

8088/8086的寻址方式

在这里插入图片描述

1、指令

1.1 指令的组成
  • 指令由操作码操作数两部分组成。
  • 操作码说明计算机要执行哪种操作。
  • 操作数:指令执行的参与者,即各种操作的对象。
1.2操作数的寻址方式
  • 定义:寻找操作数的方式(操作数的存在方式)

分类:

  1. 立即数寻址方式:操作数存放在操作码之后。
  2. 寄存器寻址方式:操作数存放于CPU内部的寄存器中。
  3. 存储器寻址方式:操作数存放于存储器中。

2、立即数寻址方式

定义: 指令中的操作数直接存放在机器代码中,紧跟在操作码之后

操作数:
操作数是指令的一部分,这种操作数被称为立即数imm

操作数形式:
可以是8位数值i8(00H~FFH)
也可以是16位数值i16(0000H~FFFFH)

MOV AX, 0102H	;AX←0102H

2、寄存器寻址方式

  • 定义:简单的说,该寻址方式中的操作数存放在寄存器中。
  • 操作指令:
MOV AX,BX;两个操作数均为寄存器寻址:将BX中的内容转到AX中
  • 寄存器总结

8位寄存器r8:

AH、AL、BH、BL、CH、CL、DH、DL

16位寄存器r16:
AX、BX、CX、DX、SI、DI、BP、SP

4个段寄存器seg:
CS、DS、SS、ES

3、存储器寻址方式

  • 存储器寻址分类:
  1. 直接寻址方式
  2. 寄存器间接寻址方式
  3. 寄存器相对寻址方式
  4. 基址变址寻址方式
  5. 相对基址变址寻址方式
3.1直接寻址方式
  1. 直接寻址方式的有效地址在指令中直接给出
  2. 默认的段地址在DS段寄存器,可使用段超越前缀改变
  3. 用中括号包含有效地址,表达存储单元的内容

举例:

MOV AX, [2000H]	;AX←DS:[2000H]
MOV AX, ES: [2000H]	;AX←ES:[2000H]
3.2寄存器相对寻址方式

1、***有效地址***定义:是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI。

有效地址=BX/BP/SI/DI+8/16位位移量。

2、段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变

MOV AX, [SI+06H]	;AX←DS:[SI+06H]

相当于:

MOV AX, 06H[SI]	;AX←DS:[SI+06H]

相对寻址方式中,变量名表示其偏移地址,相当于位移量

MOV AX, [DI+WVAR]
;等同于  MOV AX,[DI+0010H]
3.3寄存器间接寻址方式
  1. 有效地址存放在基址寄存器BX或变址寄存器SI、DI中
  2. 默认的段地址在DS段寄存器,可使用段超越前缀改变
MOV AX, [BX]	;AX←DS:[BX]
3.4基址变址寻址方式

1、***本寻址方式***中有效地址
有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:

有效地址=BX/BP+SI/DI

段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变
e.g:

MOV AX, [BX+SI]	;AX←DS:[BX+SI]

相等于

MOV AX, [BX][SI]	;AX←DS:[BX+SI]
3.5相对基址变址寻址方式

有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和:
有效地址=BX/BP+SI/DI+8/16位位移量

段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变

MOV AX, [BX+DI+6];AX←DS:[BX+DI+6]

相当于

MOV AX, 6[BX+DI]

数据传送类指令

数据传送指令功能

注意:该类指令除标志操作指令外,其余均不影响标志位。

通用传送指令

该组指令是MOV,XCHGXLAT

1、MOV指令
  • 意义:该指令把一个字节或字的操作数从源地址传送至目的地址。
  • 说明源操作数(src) 可以是立即数、寄存器或主存单元;目的操作数(dest) 可以是寄存器或主存单元,不能是立即数
  • 格式:
MOV dest,src
  • MOV指令的传送方式
  1. 立即数到寄存器的传送
  2. 立即数到主存的传送
  3. 寄存器与寄存器之间的传送
  4. 寄存器与主存之间的传送
  5. 寄存器与段寄存器之间的传送
  6. 主存与段寄存器之间的传送

**注意:**在汇编语言中,以字母开头的十六进制数应该增加一个前导0,以便与标识符区别。

1.1 立即数的传送
  • 相关语句
mov cl,4	;cl←4,字节传送
mov dx,0ffh	;dx←00ffh,字传送
mov si,200h	;si←0200h,字传送
mov bvar,0ah;字节传送 ;假设bvar是一个字节变量,定义如下:bvar  db 0
mov wvar,0bh;字传送;假设wvar是一个字变量,定义如下:wvar  dw 0

注:明确指令操作是字节操作还是字操作。

1.2寄存器传送
  • 相关语句
mov ah,al	;ah←al,字节传送
mov bvar,ch	;bvar←ch ,字节传送
mov ax,bx	;ax←bx,字传送
mov ds,ax	;ds←ax,字传送
mov [bx],al	;[bx]←al,字节传送

注:寄存器具有明确的字节或字类型。

1.3 存储器传送
  • 相关语句
mov al,[bx]		;al←ds:[bx]
mov dx,[bp]		;dx←ss:[bp+0]
mov dx,[bp+4]	;dx←ss:[bp+4]
mov es,[si]		;es←ds:[si]

注: 不存在存储器向存储器的传送指令(串操作指令除外)

1.4 非法指令

非法指令的主要现象:

1.两个操作数的类型不一致

在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令

2.无法确定是字节量还是字量操作

当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明:byte ptr(字节类型),word ptr(字类型)

  1. 两个操作数都是存储器

8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数)

MOV buf2, buf1	;非法指令,
	;假设buf2和buf1是两个字变量
	;修正: mov ax,buf1
	;            mov buf2,ax
	;假设buf2和buf1是两个字节变量
	;mov al,buf1
	;mov buf2,al

  1. 段寄存器的操作有一些限制

8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活。

	MOV DS, ES	;非法指令,
		;修正: mov ax,es
		;mov ds,ax
	MOV DS, 100H	;非法指令,
		;修正: mov ax,100h
		;mov ds,ax
	 MOV CS, [SI]	;非法指令
2、XCHG指令
  • 意义:把两个地方的数据进行交换。
2.1 交换数据方式
  • 寄存器与寄存器之间交换数据

例如:
如下语句实现了,寄存器与寄存器之间的数据交换。

mov ax,1199h	;ax=1199h
xchg ah,al	;ax=9911h
  • 寄存器与存储器之间交换数据

例如:
如下语句实现了寄存器与存储器之间的数据交换。

mov wvar,5566h	;wvar是一个字量变量
xchg ax,wvar 	;ax=5566h,wvar=9911h
;等同于 xchg wvar,ax 

  • 不能在++存储器++与++存储器++之间交换数据。

以及mov语句也不能将数据从一个存储器移动到另一个存储器中。

3、换码指令XLAT
  • 意义: 用于将一种代码转换为另一种代码
  • 换码指令用于将BX指定的缓冲区中的AL指定的位移处的数据取出赋给AL,如下:
XLAT   ; al←ds:[bx+al]
  • 换码执行过程

换码指令执行前:
在主存建立一个字节表格,内含要转换成的目的代码
表格首地址存放于BX,AL存放相对表格首地址的位移量

换码指令执行后:
将AL寄存器的内容转换为目标代码

  • 例题

将首地址为400H的表格中的3号数据(假设为46H)取出:

mov bx,400h   ;将400H存入到bx寄存器中
mov al,03h   ;将03H存入到al寄存器中
xlat    
;进行了换码操作,将bx指定的缓冲区(首地址为400H)中的al指定的位移处(03H)中的数据46H取出。
  • 疑惑
    在开始的时候,心中有这样的疑惑:
    XLAT为什么没有操作数?
    它是怎么进行数据的操作的?它怎么就将指定位置的数据取出了?
    一脸三个问号,翻出查找后,答案如下:

1、XLAT指令是***隐含寻址方式***。

2、XLAT指令默认的是BX和AL寄存器(BX基址寄存器、AL累加器(8位))。

3、XLAT指定了从BX中的缓冲区取出AL指定的位移量。

4、XLAT指定的默认缓冲区在数据段DS,但可以进行段超越。如下:

XLAT table;仍是al←ds:[bx+al]
;table表示字节表格的变量名。这样变量名前加上段超越前缀即可

觉得有用点赞?关注?啊~

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下次一定少写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值