920 likes | 1.06k Views
第三章 微型计算机的指令系统 § 1 指令的构成和操作数的类型 一、指令构成 一条指令由操怍码字段和操作数字段构成。 1 、操作码字段 操作码字段表明指令执行何种性质的操作。 2 、操作数字段 操作数字段是指明指令执行的操作所需要的操作数 . 该字段中,可以是操作数本身或是操作数地址。. 二、操作数类型 操作数有以下三种类型:立即数操作数、寄存器操 作数和存储器操作数。 1 、立即数操作数
E N D
第三章 微型计算机的指令系统 §1 指令的构成和操作数的类型 一、指令构成 一条指令由操怍码字段和操作数字段构成。 1、操作码字段 操作码字段表明指令执行何种性质的操作。 2、操作数字段 操作数字段是指明指令执行的操作所需要的操作数. 该字段中,可以是操作数本身或是操作数地址。
二、操作数类型 操作数有以下三种类型:立即数操作数、寄存器操 作数和存储器操作数。 1、立即数操作数 立即数只能作为源操作数,而不能作为目标操作 数。立即数可以是8位和16位带符号数或者无符号 数,并只能是整数,不能是小数。 2、寄存器操作数 寄存器操作数可以存放于CPU内部寄存器中,即通 用寄存器、地址指针寄存器、变址寄存器、段寄存 器。所有的通用寄存器和地址指针寄存器既可以用 作源操作数,又可以用作目标操作数。 3、存储器操作数 存储器操作数的数据可能是8位、16位和32位的二进 制数。在指令中,存储器操作数可以分别作为源操 作数和目标操作数,但是不允许二者同时都为存储 器操作数。
§2 8086的寻址方式 一、立即寻址 操作数包含在指令中,此操作数又称为立即数,(立 即数只能作源操作数)立即数可为8位,也可为16 位,它用来给寄存器存贮器赋初值。 二、寄存器寻址 操作数在某一寄存器中。一条指令中,可以对源 操作数采用寄存器寻址,也可对目的操作数采用 寄存器寻址,还可两者都用寄存器寻址。 寄存器可为:AX,BX,CX,DX,SI,DI,SP,BP AH,AL,BH,BL,CH,CL,DH,DL。
三、直接寻址 操作数的地址包含在指令中。 (注意:此地址为16位偏移地址) 通常操作数一般在数据段区域中,如果要对其他段 寄存器所指出的存贮区进行寻址(所谓段超越), 则在本条指令中,须用前缀指出段寄存器名。
四、寄存器间接寻址 操作数的地址在某寄存器中, 这些寄存器可以为:BX,BP,SI,DI之一。 有效地址: EA=[BX或BP或SI或DI] 注:如果指令前没有用前缀指明具体的段寄存器,则 寻址时默认为DS/SS。 采用寄存器间址允许在指令中指定一个位移量(8位 或16位)。其有效地址EA为寄存器内容加上此位移 量。(称寄存器相对寻址) 有效地址: EA=[( BX或BP或SI或DI )+位移量(带符号数)]
1、数据段基址寻址 用BX寄存器进行间接寻址 。 2、堆栈段基址寻址 用BP寄存器进行间接寻址。 3、变址寻址 用SI,DI寄存器进行间接寻址。 4、基址加变址寻址 用BX、BP和SI、DI寄存器组合起来进行间接寻址。 有效地址EA=[(BX或BP)+(SI或DI)] 注:只要用上BP寄存器,那么默认的段寄存器就是SS, 在其他情况,则为DS。否则应用前缀指出相应段 寄存器名。
附:几种常见的书写形式 MOV AX,VALUE → MOV AX,[VALUE] (VALUE为符号地址) MOV AX,ES:VALUE → MOV AX,ES:[VALUE] MOV AX,COUNT[SI]→ MOV AX,[COUNT+SI] (COUNT为位移量的符号地址) MOV AX,[BX][DI] → MOV AX,[BX+DI] MOV AX,MASK[BX][SI] → MOV AX,MASK[BX+SI] → MOV AX,[MASK+BX+SI]
5、例1:DS=2000H, ES=2100H, SS=1500H, SI=00A0H, BX=0100H, BP=0010H, VAL=0050H, 请指出下列的源操作数字段是什么寻址方式? 它的物理地址是多少? A、MOV AX,OABH B、MOV AX,BX C、MOV AX,[VAL+100H] D、MOV AX,[BX] E、MOV AX,ES:[BX] F、MOV AX,[BP] G、MOV AX,[SI] H、MOV AX,[VAL+BX+SI]
例2:根据以下要求写出相应的汇编语言指令 A、把数OB5H与(AL)相加,结果送回AL中。 B、把BX和DX内容相加,结果存入DX中。 C、用位移量0524H的直接寻址方式把存贮器中一个字 与数2A59相加,结果送回存贮单元中。 D、用BX和SI的基址变址寻址方式,把存贮器中一个字 节与AL 内容相加,结果存入AL中。 E、用BX和位移量OB2H 的寄存器相对寻址方式把存贮 器中一个字和CX相加,结果存入内存单元中。
§3 8086/8088CPU 指令系统 一、数据传送指令 1、通用数据传送指令 <1> MOV传送指令 格式: MOV DST, SRC DST:目的操作 操作: DST SRC SRC:源操 A、立即数到寄存器存贮器 reg , data 注:不包括段寄 mem , data
B、从寄存器到寄存器 reg , reg 从存贮器到寄存器 mem , reg 从寄存器到存贮器 reg , mem 注:不包括段寄
C、从存贮器/寄存器到段寄存器 (mem/reg,segreg) 注:不能往CS中传送数据. D、从段寄存器到存贮器/寄存器 (segreg,mem/reg)
注:1,不影响标志 2,不允许两操作数都使用存储器 3,不允许往CS中送数 4,8位传送/16位传送决定于指令中寄存器及立 即数形式 5,凡给SS赋值时,系统会自动禁止中断,等下 条指令执行完后才会恢复 E、例:一批数的传送
<2> PUSH进栈与POP出栈指令 A、堆栈 堆栈是以“后进先出”方式工作的一个存贮区。它存 在于堆栈段中.堆栈在计算机工作中起着重要作用, 它在子程序结构的程序以及中断程序中是不可少 的。堆栈指针寄存器SP用来指示堆栈在那里。它始 终指向当前堆栈的栈顶。 注:在8086中堆栈的存取是以字为单位进行的 B、PUSH/POP指令格式与操作 格式:PUSH SRC 操作:1,SP-1 SP 2,高字节 (SP) 3,SP-1 SP 4,低字节 (SP) 格式:POP DST 操作:1,低字节 弹出 2,SP+1 SP 3,高字节 弹出 4,SP+1 SP
C、注:PUSH/POP指令可使用除立即数以外的所有寻址 方式。指令也可以指定段寄为操作数,但POP指 令不允许用CS寄存器。 所有标志不受影响。 D、例1:两寄存器内容交换 分析下面程序段: 设SP=2000H,SS=1000H ST:PUSH BX PUSH CX POP BX POP CX
例2 :设BX=2A0CH, CX=A530H, SS=2000H 程序执行后, BX= AX= CX= SP= ST:MOV SP, 1000H PUSH BX PUSH CX MOV AX, 62CEH ADD AX, SP POP BX HLT 例3 :分析下面程序: ST:MOV CX,5 POP CX L1:PUSH CX DEC CX MOV CX,10 JNZ L1 L2:DEC CX HLT JNZ L2
<3> XCHG指令(交换) A、XCHG指令格式与操作 XCHG OPR1, OPR2 OPR1←→OPR2 B、XCHG指令可以在寄存器之间或寄存器与存贮器之 间交换信息。 C、例 注:不允许使用段寄。 该指令不影响标志位。
2、累加器专用传送指令 <1> IN/OUT输入输出指令 A、指令的格式与操作 长格式:IN AL, PORT AL ←(PORT) IN AX, PORT AX ← (PORT+1,PORT) OUT PORT,AL (PORT)← AL OUT PORT,AX (PORT+1,PORT)← AX 短格式:IN AL,DX AL ← (DX) IN AX,DX AX ←(DX+1,DX) OUT DX,AL (DX)← AL OUT DX,AX (DX+1,DX)←AX 注:I/O指令中只能用AX/AL与DX和8位的端口地址。
B、 用长格式时可以在指令中直接指定端口号,但只限 于外设的前256个端口,当端口号≥256时,只能使 用短格式,(间接),必须注意端口号即为外设地 址,它与段寄无关。I/O指令不影响标志位。 C、 例1: D、 例2: OUT DX, AL
<2> XLAT换码指令 A、指令格式与操作 XLAT OPR 或 XLAT AL ←[ BX + AL ] B、注:使用XLAT指令,应先建立一个表格。 表格首址存入BX中,需转换的代码应是相对于 表格首址的位移量(即项号)也提前放入AL 中。 表格的内容(即项值)则是所要换取的代码 它将存入AL中。 指令格式中的OPR为表格首址(符号地址)。 所有标志不受影响。
C、例 设:BX=0040H, AL=02H, DS=F000H 项号 项值 表格: 0 (F0040H)=11H (0040H为表格首址) 1 (F0041H)=22H 2 (F0042H)=33H 3 (F0043H)=44H 4 (F0044H)=55H 5 (F0045H)=66H 则:执行XLAT后, AL=
3、地址传送指令 A、指令格式与操作 偏移地址送寄存器 LEA REG REG SRC 把源操作数的偏移地址送寄存器。 指针送寄存器和DS LDS REG,SRC REG (SRC) DS (SRC+2) 把源操作数提供的32位数送寄存器与段寄DS 指针送寄存器和ES LES REG,SRC REG (SRC) ES (SRC+2) 把源操作数提供的32位数送寄存器与段寄ES 注:所有标志不受影响 REG必须为16位通用寄存器SRC为内存单元地址。
B、例 LEA BX,[BX+SI] 执行前:BX=0400H SI=003CH 执行后:BX= LDS SI,[10H] 执行前:DS=C000H, (C0010H)=0180H (0012H)=2000H 执行后:SI= DS= LES DI,[BX] 执行前:DS=B000H, BX=080AH (B080AH)=05AEH, (B080CH)=4000H 执行后:DI= ES=
4、标志寄存器传送指令 标志送AH: LAHF AH← PSW的低字节 AH送标寄: SAHF PSW的低字节← AH 标志进栈: PUSHF SP←SP-2; (SP+1,SP)← PSW 标志出栈: POPF PSW←(SP+1,SP) SP← SP+2 PSW 15 8 7 0 AH
三、算术运算指令 1、加法指令 加: ADD DST,SRC DST←SRC+DST reg,reg; reg,mem; mem,reg reg,data; mem,data; ac,data 带进位加:ADC DST,SRC (DST)← (SRC)+(DST)+CF reg,reg; reg,mem; mem,reg reg,data; mem,data; ac,data 加1: INC OPR (OPR)←─ (OPR)+1 (reg;mem) 注:INC指令不影响CF标志
2、减法指令 减: SUB DST,SRC DST←DST-SRC 带借位减:SBB DST,SRC OST←DST-SRC-CF 减1: DEC OPR OPR←OPR-1 求补: NEG OPR OPR←0-DPR 比较: CMP OPR1,OPR2 OPR1 - OPR2 注:CMP指令执行减操作,但它不保存结果,只是 根据操作结果设置条件标志位。CMP指令后 往往跟着一条条件快移指令,实现程序分支。 DEC指令不影响CF标志。
3、乘法指令 格式:无符号数乘 MUL SRC (reg/mem) 带符号数乘 IMVL SRC 操作:字节操作 AL*(SRC) AX 字操作 AX*(SRC) DX,AX 注:执行前,必须将被乘数送入AX/AL中。 MUL:当积的高位为0,则CF=0,OF=0 否则均为1。 IMVL:当积的高一半是低一半的符号扩展则 CF=OF=0,否则为1。 例:设 AL=04H BH=02H AH=E5H 则 执行 MUL BH 后 AX=
4、除法指令 格式:无符号数除 DIV SRC (reg/mem) 带符号数除 IDIV SRC 操作:字节操作: AX÷(SRC)→商AL,余AH 字操作: DX,AX÷(SRC)→商AX,余DX 注:IDIV、DIV执行前,必须将被除数送入指定寄存器 AX,DX中。 用除法指令时,必须注意它要求商为8位(字节)/ 16位(字),如果被除数的高8位(字节)或16位 (字)大于除数的绝对值,商就会产生溢出,此时 会作除数为0的情况来处理。 例:设 AX=0009H BH=02H 则 执行 DIV BH 后 AL= AH=
D、字节转换为字指令: 格式:CBW操作:AL的内容符号扩展到AH。 字转换为双字指令: 格式:CWD操作:AX的内容符号扩展到DX。 注:CBW,CWD指令不影响条件码。 例:设有两个16位数存于AX,BX中,求Z=AX/BX 5、十进制调整指令 A、压缩的BCD码:用4位2进制表示一个十进制数位。 如502D─→0101,0000,0010B 非压缩的BCD码:以8位为一组表示一个十进制数 位,其中低4位为BCD码,高4位没 有意义 如: 502D─→00110101,00110000,0011,0010B。 注: ASCII码是一种非压缩的BCD码。
B、压缩的BCD码调正指令 DAA: 条件:用ADD或ADC将两个压缩BCD码 相加,和存于AL中。 操作:将和AL调正到压缩的BCD格式存入 AL中。 DAS: 条件:用SUB或SBB将两个压缩BCD码 相减,差存于AL中。 操作:将AL中的差调正到压缩的BCD格 式存入AL中。 注:DAA/DAS对OF标志无定义对其他标志有影响。
例1: 设: AL=28H, BL=68H 执行: ADD AL,BL DAA 指令后: AL= CF= AF= 例2: 设: AL=86H, BL=07H 执行: SUB AL,BL DAS 指令后: AL= CF= AF=
C、非压缩的BCD码调整指令 AAA:加法的ASCII调正指令 条件:用ADD/ADC将2个非压缩BCD码相加, 和存于AL中。 操作:将AL中和调正到非压缩的BCD格式。将 调正产生的进位值加到AH中。 AAS:减法的ASCII调正指令 条件:用SUB/SBB将2个非压缩BCD码相减, 差存于AL中。 操作:将AL中差调正到非压缩BCD格式,其调 正产生的借位从AH中减去。
AAM:乘法的ASCII调正指令。(对结果调正) 条件: 用MUL将2个非压缩BCD码相乘(要求高4 位为0), 结果存于AL中。 操作: 将AL内容除以OAH,其商存于AH中,余 数存于AL中。 AAD:除法的ASCII调整指令(对被除数必须进行调整) 操作:AH*10+AL→AL;0→AH 将AX中的被除数(非压缩BCD码,高4位为0)调 整成二进制数 例:a、设: AX=0505H , BL=09H 执行: ADD AL,BL AAA 后:AX= b、设: AL=07H, BL=09H 执行: MUL AL,BL AAM 后:AH= AL= c、设: AX=0604H 执行: AAD 后:AX=
6、编程举例: A、试编一程序计算一批数中,0的个数。
C、 试分析下面程序功能:ST: LEA SI,DATA1 LEA DI,DATA2 MOV CX,5 CLC L1: MOV AL,[SI] MOV BL,[DI] ADC AL, BL DAA MOV [SI],AL INC SI INC DI LOOP L1 MOV AL, 0 ADC AL, 0 MOV [SI], AL HLT
四、逻辑运算和移位指令 1、逻辑运算指令(按位操作) 逻辑与:AND DST,SRC DST← DST∧SRC reg,reg reg,mem mem,reg reg,data mem,data 逻辑或:OR DST,SRC DST← DST∨URC 逻辑非:NOT OPR OPR ← OPR 异或: XOR DST,SRC DST←DST V SRC 测试: TEST OPR1,OPR2 OPR1∧OPR2 注:NOT不影响标志位,其余4条将使CF=OF=0,AF无 定义, 对SF,ZF,PF有影响。 逻辑运算指令对处理操作数的某些位很有用。它可 屏蔽某些位,可使某些位置“1”,可测试某些位等.
2、移位指令 逻辑左移: SHL OPR,CNT 逻辑右移: SHR OPR,CNT 算术左移: SAL OPR,CNT 算术右移: SAR OPR,CNT
循环左移: ROL OPR,CNT 循环右移: ROR OPR,CNT 带进位循环左移: RCL OPR,CNT 带进位循环右移: RCR OPR,CNT 其中: OPR:reg;mem CNT:1或CL
注:移位指令:OF位当CNT=1有效,在移位后D7值发 生变化时1→OF,否则为o。 它影响SF,ZF,PF,对AF无定义。 循环指令:不影响除OF,CF以外的其它条件标志。 OF影响同移位指令 例:a、设:SI=1450H 则:执行 MOV CL,2 SHL SI,CL 后, SI= CF= b、计算 BX*6 c、计算 AX/256,结果存于AL中
五、串处理指令 串处理指令是指用一条指令实现对一串字符或数据 的操作。 8086的串处理指令有如下几个特点: a、通过加重复前缀(REP REPNZ等)实现串操作。 b、可以对字节/字串进行操作 c、用SI对源操作数进行间接寻址(在DS段中),用DI对 目的操作数进行间接寻址(在ES段中)。 d、串操作时,地址的修改与方向标志DF有关,当DF=1 时,SI/DI作自动减量修改,当DF=0时,SI/DI作 自动增量修改。 e、在执行串操作指令过程中,IP保持指向重复前缀 (前缀本身也是一条指令)的偏移地址。
1、字符串传送指令与重复前缀指令 A、REP CX←CX-1,当CX=0退出重复,否则 执行其后的串指令。 B、MOVSB (DI)←─(SI) MOVSW SI←SI±1或2 DI←DI±1或2。 (DF=0为"+"; DF=1为"-") 注:MOVSB(字节)/MOVSW(字)指令前通常加REP, 该指令不影响F标志。
C、例:一批数的传送 (1)
(2) (3)
例:数0的个数存于CH中 2、取字符串指令 LODSB AC←(SI) LODSW SI←SI±1减2 (DF=0为"+"; DF=1为"-") 注:此指令前,通常不加REP,它不影响F标志。
3、存字符串指令 STOSB (DI)←AC STOSW DI←DI±1或2. DF=0为"+"; DF=1为"-" 注:该指令前加REP后,可以使一批内存单元,填满 相同的数。 该指令不影响F标志。 例:使0400H开始的256个单元清0
4、 字符串比较指令与相等/不相等,为0/不为0,重 复前缀指令 A、REPE CX←CX-1,当CX=0或ZF=0 REPZ 退出重复,否则执行其后的串指令 B、REPNE CX←CX-1,当CX=0或ZF=1 REPNZ 退出重复,否则执行其后的串指令 C、CMPSB (SI)-(DI) CMPSW SI←SI±1或2; DI←DI±1或2。 DF=0为“+”; DF=1为“-”
5、字符串检索指令 按累加器中给出的字节/字对ES:DI所指的字节/字 串进行检索,建立相应标志。 A、SCASB AC -(DI) SCASW DI←DI±1或±2 B、例:100个字符存于以TAB为首址单元中,试检索 A字符的位置,位置值存于DX中,若无A字使A=-1
六、控制转移指令 1、转移指令 <1> 段内与段间:段内转移:在同一段内进行的转移 段间转移:段与段之间进行的转移 <2> 转移指令的寻址方式 A、段内直接寻址 它是一种相对寻址,其转移的有效地址为IP的当 前值与位移量8位/16位(带符号数)之和,其中条 件转移指令只能采用这种寻址方式,位移量为8位. B、段内间接寻址: (只适用于无条件转移指令) 段内间接寻址的转移有效地址为寄存器的内容或 存贮单元的内容。它可以用数据寻址方式中除立即 数以外的任一种寻址方式取得。