(此操作数称为立即数) 立即寻址只能用于源操作数 例:
MOV AX, 1C8FH MOV BYTE PTR[2A00H], 8FH 错误例:
× MOV 2A00H,AX ; 错误! 指令操作例:MOV AX,3102H; AX3102H
执行后,(AH) = 31H,(AL) = 02H
2、寄存器寻址
(1)操作数放在某个寄存器中
(2)源操作数与目的操作数字长要相同 (3)寄存器寻址与段地址无关 例:
MOV AX, BX
MOV [3F00H], AX MOV CL, AL 错误例:
× MOV AX,BL ; 字长不同
× MOV ES:AX,DX ; 寄存器与段无关 3、直接寻址
(1)指令中直接给出操作数的16位偏移地址 偏移地址也称为有效地址(EA, Effective Address)
(2)默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀 (3)偏移地址也可用符号地址来表示,如ADDR、VAR 例:
MOV AX ,[2A00H] MOV DX ,ES:[2A00H] MOV SI,TABLE_PTR
4、间接寻址
操作数的偏移地址(有效地址EA)放在寄存器中 只有SI、DI、BX和BP可作间址寄存器 例: MOV AX,[BX] MOV CL,CS:[DI]
错误例 :× MOV AX, [DX]
× MOV CL, [AX]
5、寄存器相对寻址
EA=间址寄存器的内容加上一个8/16位的位移量 例: MOV AX, [BX+8]
MOV CX, TABLE[SI]
MOV AX, [BP]; 默认段寄存器为SS 指令操作例:MOV AX,DATA[BX]
若(DS)=6000H, (BX)=1000H, DATA=2A00H, (63A00H)=66H, (63A01H)=55H
则物理地址 = 60000H + 1000H + 2A00H = 63A00H
指令执行后:(AX)=5566H
6、基址变址寻址
若操作数的偏移地址:
由基址寄存器(BX或BP)给出 —— 基址寻址方式 由变址寄存器(SI或DI)给出 —— 变址寻址方式
由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。
EA=(BX)+(SI)或(DI); EA=(BP)+(SI)或(DI)
同一组内的寄存器不能同时出现。
注意:除了有段跨越前缀的情况外,当基址寄存器为BX时,操作数应该存放在数据段DS中,当基址寄存器为BP时,操作数应放在堆栈段SS中。例: MOV AX, [BX] [SI] MOV AX, [BX+SI]
MOV AX, DS: [BP] [DI] 错误例:
× MOV AX, [BX] [BP] × MOV AX, [DI] [SI]
指令操作例:MOV AX,[BX][SI]
假定:(DS)=8000H, (BX)=2000H, SI=1000H 则物理地址 = 80000H + 2000H + 1000H = 83000H 指令执行后: (AL)=[83000H]
(AH)=[83001H]
7、相对基址变址寻址
在基址-变址寻址的基础上再加上一个相对位移量
EA=(BX)+(SI)或(DI)+8位或16位位移量; EA=(BP)+(SI)或(DI)+8位或16位位移量
指令操作例:MOV AX,DATA[DI][BX]
若(DS)=8000H, (BX)=2000H, (DI)=1000H, DATA=200H 则指令执行后(AH)=[83021H], (AL)=[83020H]
寄存器间接、寄存器相对、基址变址、相对基址变址四种寻址方式的比较: 寻址方式 指令操作数形式
寄存器间接 只有一个寄存器(BX/BP/SI/DI之一) 寄存器相对 一个寄存器加上位移量
基址—变址 两个不同类别的寄存器
相对基址-变址 两个不同类别的寄存器加上位移量
二、地址寻址方式(了解有4类,能判断) 简要判断依据(指令中间的单词): 段内直接 short,near 段内间接 word 段间直接 far 段间间接 dword
第二节 8086指令系统
一、数据传送指令
1、通用传送指令
(1) MOV dest,src; dest←src
传送的是字节还是字取决于指令中涉及的寄存器是8位还是16位。 具体来说可实现:
① MOV mem/reg1,mem/reg2
指令中两操作数中至少有一个为寄存器 ② MOV reg,data ;立即数送寄存器 ③ MOV mem,data ;立即数送存储单元 ④ MOV acc,mem ;存储单元送累加器 ⑤ MOV mem,acc ;累加器送存储单元
⑥ MOV segreg,mem/reg ;存储单元/寄存器送段寄存器 ⑦ MOV mem/reg,segreg ;段寄存器送存储单元/寄存器
MOV指令的使用规则 ①IP不能作目的寄存器 ②不允许mem←mem
③不允许segreg←segreg
④立即数不允许作为目的操作数 ⑤不允许segreg←立即数
⑥源操作数与目的操作数类型要一致
⑦当源操作数为单字节的立即数,而目的操作数为间址、变址、基址+变址的内存数时,必须用PTR说明数据类型。如:MOV [BX],12H 是错误的。
(2)、堆栈指令 什么是堆栈?
按“后进先出(LIFO)”方式工作的存储区域。堆栈以字为单位进行压入弹出操作。 规定由SS指示堆栈段的段基址,堆栈指针SP始终指向堆栈的顶部,SP的初值规定了所用堆栈区的大小。堆栈的最高地址叫栈底。
① 压栈指令PUSH
PUSH src ; src为16位操作数
例:PUSH AX ;将AX内容压栈 执行操作:(SP)-1←高字节AH
(SP)-2←低字节AL (SP)←(SP)- 2
注意进栈方向是高地址向低地址发展。`
② 弹出指令POP POP dest
例:POP BX ;将栈顶内容弹至BX
执行操作:(BL)←(SP) (BH)←(SP)+1 (SP)←(SP)+2
堆栈指令在使用时需注意的几点: ① 堆栈操作总是按字进行
② 不能从栈顶弹出一个字给CS
③ 堆栈指针为SS:SP,SP永远指向栈顶 ④SP自动进行增减量(-2,+2)
(3)、交换指令XCHG
格式:XCHG reg,mem/reg 功能:交换两操作数的内容。
要求:两操作数中必须有一个在寄存器中; 操作数不能为段寄存器和立即数; 源和目地操作数类型要一致。 举例: XCHG AX,BX
XCHG [2000],CL
(4)查表指令XLAT
执行的操作:AL←[(BX)+(AL)] 又叫查表转换指令,它可根据表项序号查出表中对应代码的内容。执行时先将表的首地址(偏移地址)送到BX中,表项序号存于AL中。
2、输入输出指令
只限于用累加器AL或AX来传送信息。 功能: (累加器)←→I/O端口 (1) 输入指令IN 格式:
IN acc,PORT ;PORT端口号0~255H IN acc,DX ;DX表示的端口范围达64K 例:IN AL,80H ;(AL)←(80H端口)