文章目录
8088/8086的寻址方式
1、指令
1.1 指令的组成
- 指令由操作码和操作数两部分组成。
- 操作码说明计算机要执行哪种操作。
- 操作数:指令执行的参与者,即各种操作的对象。
1.2操作数的寻址方式
- 定义:寻找操作数的方式(操作数的存在方式)
分类:
- 立即数寻址方式:操作数存放在操作码之后。
- 寄存器寻址方式:操作数存放于CPU内部的寄存器中。
- 存储器寻址方式:操作数存放于存储器中。
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、存储器寻址方式
- 存储器寻址分类:
- 直接寻址方式
- 寄存器间接寻址方式
- 寄存器相对寻址方式
- 基址变址寻址方式
- 相对基址变址寻址方式
3.1直接寻址方式
- 直接寻址方式的有效地址在指令中直接给出
- 默认的段地址在DS段寄存器,可使用段超越前缀改变
- 用中括号包含有效地址,表达存储单元的内容
举例:
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寄存器间接寻址方式
- 有效地址存放在基址寄存器BX或变址寄存器SI、DI中
- 默认的段地址在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,XCHG和XLAT
1、MOV指令
- 意义:该指令把一个字节或字的操作数从源地址传送至目的地址。
- 说明:源操作数(src) 可以是立即数、寄存器或主存单元;目的操作数(dest) 可以是寄存器或主存单元,不能是立即数;
- 格式:
MOV dest,src
- MOV指令的传送方式:
- 立即数到寄存器的传送
- 立即数到主存的传送
- 寄存器与寄存器之间的传送
- 寄存器与主存之间的传送
- 寄存器与段寄存器之间的传送
- 主存与段寄存器之间的传送
**注意:**在汇编语言中,以字母开头的十六进制数应该增加一个前导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(字类型)
- 两个操作数都是存储器
8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数)
MOV buf2, buf1 ;非法指令, ;假设buf2和buf1是两个字变量 ;修正: mov ax,buf1 ; mov buf2,ax ;假设buf2和buf1是两个字节变量 ;mov al,buf1 ;mov buf2,al
- 段寄存器的操作有一些限制
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表示字节表格的变量名。这样变量名前加上段超越前缀即可
觉得有用点赞?关注?啊~