分类:
定义: 指令中的操作数直接存放在机器代码中,紧跟在操作码之后
操作数:
操作数是指令的一部分,这种操作数被称为立即数imm。
操作数形式:
可以是8位数值i8(00H~FFH)
也可以是16位数值i16(0000H~FFFFH)
MOV AX, 0102H ;AX←0102H
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
举例:
MOV AX, [2000H] ;AX←DS:[2000H]
MOV AX, ES: [2000H] ;AX←ES:[2000H]
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]
MOV AX, [BX] ;AX←DS:[BX]
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]
有效地址是基址寄存器(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
MOV dest,src
- 立即数到寄存器的传送
- 立即数到主存的传送
- 寄存器与寄存器之间的传送
- 寄存器与主存之间的传送
- 寄存器与段寄存器之间的传送
- 主存与段寄存器之间的传送
**注意:**在汇编语言中,以字母开头的十六进制数应该增加一个前导0,以便与标识符区别。
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
注:明确指令操作是字节操作还是字操作。
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,字节传送
注:寄存器具有明确的字节或字类型。
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.两个操作数的类型不一致
在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令
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] ;非法指令
例如:
如下语句实现了,寄存器与寄存器之间的数据交换。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语句也不能将数据从一个存储器移动到另一个存储器中。
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取出。
1、XLAT指令是***隐含寻址方式***。
2、XLAT指令默认的是BX和AL寄存器(BX基址寄存器、AL累加器(8位))。
3、XLAT指定了从BX中的缓冲区取出AL指定的位移量。
4、XLAT指定的默认缓冲区在数据段DS,但可以进行段超越。如下:
XLAT table;仍是al←ds:[bx+al] ;table表示字节表格的变量名。这样变量名前加上段超越前缀即可
觉得有用点赞?关注?啊~