第三章第三章 微型计算机的指令系统微型计算机的指令系统 §11 指令的构成和操作数的类型指令的构成和操作数的类型 一、指令构成一、指令构成 一条指令由操怍码字段和操作数字段构成一条指令由操怍码字段和操作数字段构成 1 1、操作码字段、操作码字段 操作码字段表明指令执行何种性质的操作操作码字段表明指令执行何种性质的操作 2 2、操作数字段、操作数字段 操作数字段是指明指令执行的操作所需要的操作数操作数字段是指明指令执行的操作所需要的操作数. . 该字段中,可以是操作数本身或是操作数地址该字段中,可以是操作数本身或是操作数地址 二、操作数类型二、操作数类型 操作数有以下三种类型:立即数操作数、寄存器操操作数有以下三种类型:立即数操作数、寄存器操 作数和存储器操作数作数和存储器操作数 1 1、立即数操作数、立即数操作数 立即数只能作为源操作数,而不能作为目标操作立即数只能作为源操作数,而不能作为目标操作数。
立即数可以是数立即数可以是8 8位和位和1616位带符号数或者无符号位带符号数或者无符号数,并只能是整数,不能是小数数,并只能是整数,不能是小数 2 2、寄存器操作数、寄存器操作数 寄存器操作数可以存放于寄存器操作数可以存放于CPUCPU内部寄存器中,即通内部寄存器中,即通用寄存器、地址指针寄存器、变址寄存器、段寄存用寄存器、地址指针寄存器、变址寄存器、段寄存器所有的通用寄存器和地址指针寄存器既可以用器所有的通用寄存器和地址指针寄存器既可以用作源操作数,又可以用作目标操作数作源操作数,又可以用作目标操作数 3 3、存储器操作数、存储器操作数 存储器操作数的数据可能是存储器操作数的数据可能是8 8位、位、1616位和位和3232位的二进位的二进制数在指令中,存储器操作数可以分别作为源操制数在指令中,存储器操作数可以分别作为源操作数和目标操作数,但是不允许二者同时都为存储作数和目标操作数,但是不允许二者同时都为存储器操作数器操作数 §§2 2 8086 8086的寻址方式的寻址方式 一、立即寻址一、立即寻址 操作数包含在指令中操作数包含在指令中, ,此操作数又称为立即数,此操作数又称为立即数,( (立立 即数只能作源操作数即数只能作源操作数) )立即数可为立即数可为8 8位,也可为位,也可为1616 位,它用来给寄存器存贮器赋初值。
位,它用来给寄存器存贮器赋初值 二、寄存器寻址二、寄存器寻址 操作数在某一寄存器中一条指令中,可以对源操作数在某一寄存器中一条指令中,可以对源 操作数采用寄存器寻址,也可对目的操作数采用操作数采用寄存器寻址,也可对目的操作数采用 寄存器寻址,还可两者都用寄存器寻址寄存器寻址,还可两者都用寄存器寻址 寄存器可为:寄存器可为:AX,BX,CX,DX,SI,DI,SP,BPAX,BX,CX,DX,SI,DI,SP,BP AH,AL,BH,BL,CH,CL,DH,DL AH,AL,BH,BL,CH,CL,DH,DL 三、直接寻址三、直接寻址 操作数的地址包含在指令中操作数的地址包含在指令中 (注意:此地址为注意:此地址为1616位偏移地址位偏移地址) ) 通常操作数一般在数据段区域中,如果要对其他段通常操作数一般在数据段区域中,如果要对其他段 寄存器所指出的存贮区进行寻址寄存器所指出的存贮区进行寻址( (所谓段超越),所谓段超越), 则在本条指令中,须用前缀指出段寄存器名。
则在本条指令中,须用前缀指出段寄存器名 四、寄存器间接寻址四、寄存器间接寻址 操作数的地址在某寄存器中,操作数的地址在某寄存器中, 这些寄存器可以为:这些寄存器可以为:BX,BP,SI,DIBX,BP,SI,DI之一 有效地址:有效地址: EA=[BXEA=[BX或或BPBP或或SISI或或DI]DI] 注:如果指令前没有用前缀指明具体的段寄存器,注:如果指令前没有用前缀指明具体的段寄存器, 则则 寻址时默认为寻址时默认为DS/SSDS/SS 采用寄存器间址允许在指令中指定一个位移量采用寄存器间址允许在指令中指定一个位移量(8(8位位 或或1616位位) )其有效地址其有效地址EAEA为寄存器内容加上此位移为寄存器内容加上此位移 量 (称寄存器相对寻址称寄存器相对寻址) ) 有效地址:有效地址: EA=[EA=[(( BXBX或或BPBP或或SISI或或DI DI )+位移量)+位移量( (带符号数带符号数)])] 1、数据段基址寻址1、数据段基址寻址 用用BXBX寄存器进行间接寻址寄存器进行间接寻址 。
22、、堆栈段基址寻址堆栈段基址寻址 用用BPBP寄存器进行间接寻址寄存器进行间接寻址 33、、变址寻址变址寻址 用用SI,DISI,DI寄存器进行间接寻址寄存器进行间接寻址 44、、基址加变址寻址基址加变址寻址 用用BXBX、、BPBP和和SISI、、DIDI寄存器组合起来进行间接寻址寄存器组合起来进行间接寻址 有效地址有效地址EA=[EA=[((BXBX或或BPBP)+()+(SISI或或DIDI))] ] 注:只要用上注:只要用上BPBP寄存器,那么默认的段寄存器就是寄存器,那么默认的段寄存器就是SS,SS, 在其他情况,则为在其他情况,则为DSDS否则应用前缀指出相应段否则应用前缀指出相应段 寄存器名寄存器名 附:几种常见的书写形式附:几种常见的书写形式 MOV AX,VALUE → MOV AX,[VALUE] MOV AX,VALUE → MOV AX,[VALUE] (VALUE (VALUE为符号地址为符号地址) ) MOV AX,ES:VALUE → MOV AX,ES:[VALUE] MOV AX,ES:VALUE → MOV AX,ES:[VALUE] MOV AX,COUNT[SI]→ MOV AX,[COUNT+SI] MOV AX,COUNT[SI]→ MOV AX,[COUNT+SI] (COUNT (COUNT为位移量的符号地址为位移量的符号地址) ) MOV AX,[BX][DI] → MOV AX,[BX+DI] MOV AX,[BX][DI] → MOV AX,[BX+DI] MOV AX,MASK[BX][SI] → MOV AX,MASK[BX+SI] MOV AX,MASK[BX][SI] → MOV AX,MASK[BX+SI] → MOV AX,[MASK+BX+SI] → MOV AX,[MASK+BX+SI] 5、例5、例1 1::DS=2000H, ES=2100H, SS=1500H,DS=2000H, ES=2100H, SS=1500H, SI=00A0H, BX=0100H, BP=0010H SI=00A0H, BX=0100H, BP=0010H,, VAL=0050HVAL=0050H,, 请指出下列的源操作数字段请指出下列的源操作数字段是什么寻址方式?是什么寻址方式? 它的物理地址是多少?它的物理地址是多少? A、A、MOV AX,OABH MOV AX,OABH B B、、MOV AX,BX MOV AX,BX C、C、MOV AX,[VAL+100H] MOV AX,[VAL+100H] D D、、MOV AX,[BX] MOV AX,[BX] E E、、MOV AX,ES:[BX] MOV AX,ES:[BX] F F、、MOV AX,[BP] MOV AX,[BP] G G、、MOV AX,[SI] MOV AX,[SI] H H、、MOV AX,[VAL+BX+SI] MOV AX,[VAL+BX+SI] 例2:根据以下要求写出相应的汇编语言指令例2:根据以下要求写出相应的汇编语言指令 A、把数A、把数OB5HOB5H与与(AL)(AL)相加,结果送回相加,结果送回ALAL中。
中 B、把B、把BXBX和和DXDX内容相加,结果存入内容相加,结果存入DXDX中 C、用位移量C、用位移量0524H0524H的直接寻址方式把存贮器中一个字的直接寻址方式把存贮器中一个字 与数与数2A592A59相加相加, ,结果送回存贮单元中结果送回存贮单元中 D、用D、用BXBX和和SISI的基址变址寻址方式的基址变址寻址方式, ,把存贮器中一个字把存贮器中一个字 节与节与AL AL 内容相加内容相加, ,结果存入结果存入ALAL中 E、用E、用BXBX和位移量和位移量OB2H OB2H 的寄存器相对寻址方式把存贮的寄存器相对寻址方式把存贮 器中一个字和器中一个字和CXCX相加,结果存入内存单元中相加,结果存入内存单元中 §§33 8086/8088CPU 8086/8088CPU 指令系统指令系统 一、数据传送指令一、数据传送指令 1、通用数据传送指令1、通用数据传送指令 <1> MOV<1> MOV传送指令传送指令 格式:格式: MOV DST, SRC MOV DST, SRC DSTDST::目的操作目的操作 操作操作:: DST SRC DST SRC SRCSRC::源操源操 A、立即数到寄存器存贮器A、立即数到寄存器存贮器 regreg , data , data 注:不包括段寄注:不包括段寄 memmem , data , data B B、从寄存器到寄存器、从寄存器到寄存器 regreg , , regreg 从存贮器到寄存器从存贮器到寄存器 memmem , , regreg 从寄存器到存贮器从寄存器到存贮器 regreg , , memmem 注:不包括段寄注:不包括段寄 C、从存贮器/寄存器到段寄存器C、从存贮器/寄存器到段寄存器 ( (mem/reg,segregmem/reg,segreg) ) 注注: :不能往不能往CSCS中传送数据中传送数据. . D、从段寄存器到存贮器/寄存器D、从段寄存器到存贮器/寄存器 ( (segreg,mem/regsegreg,mem/reg) ) 注:注: 1,1,不影响标志不影响标志 2,2,不允许两操作数都使用存储器不允许两操作数都使用存储器 3,3,不允许往不允许往CSCS中送数中送数 4,84,8位传送/位传送/1616位传送决定于指令中寄存器及立位传送决定于指令中寄存器及立 即数形式即数形式 5,5,凡给凡给SSSS赋值时,系统会自动禁止中断,等下赋值时,系统会自动禁止中断,等下 条指令执行完后才会恢复条指令执行完后才会恢复 E E、例:一批数的传送、例:一批数的传送 <2> PUSH<2> PUSH进栈与进栈与POPPOP出栈指令出栈指令 A、堆栈A、堆栈 堆栈是以堆栈是以““后进先出后进先出””方式工作的一个存贮区。
它方式工作的一个存贮区它存存 在于堆栈段中在于堆栈段中. .堆栈在计算机工作中起着重要作用,堆栈在计算机工作中起着重要作用,它在子程序结构的程序以及中断程序中是不可少它在子程序结构的程序以及中断程序中是不可少的堆栈指针寄存器的堆栈指针寄存器SPSP用来指示堆栈在那里它始用来指示堆栈在那里它始终指向当前堆栈的栈顶终指向当前堆栈的栈顶 注:在注:在80868086中堆栈的存取是以字为单位进行的中堆栈的存取是以字为单位进行的 B、B、PUSH/POPPUSH/POP指令格式与操作指令格式与操作 格式:格式:PUSH SRCPUSH SRC 操作:操作:1,SP-1 SP 2,1,SP-1 SP 2,高字节高字节 (SP)(SP) 3,SP-1 SP 4, 3,SP-1 SP 4,低字节低字节 (SP) (SP) 格式:格式:POP DSTPOP DST 操作:操作:1,1,低字节低字节 弹出弹出 2,SP+1 SP2,SP+1 SP 3, 3,高字节高字节 弹出弹出 4,SP+1 SP4,SP+1 SP C C、注:、注:PUSH/POPPUSH/POP指令可使用除立即数以外的所有寻址指令可使用除立即数以外的所有寻址 方式。
指令也可以指定段寄为操作数,但方式指令也可以指定段寄为操作数,但POPPOP指指 令不允许用令不允许用CSCS寄存器 所有标志不受影响所有标志不受影响 D D、、例例1 1:两寄存器内容交换:两寄存器内容交换 分析下面程序段:分析下面程序段: 设设SP=2000H,SS=1000H ST ST::PUSH BX PUSH BX PUSH CX PUSH CX POP BX POP BX POP CX POP CX 例例2 2 :设:设BX=2A0CH, CX=A530H, SS=2000HBX=2A0CH, CX=A530H, SS=2000H 程序执行后,程序执行后, BX= AX= CX= SP=BX= AX= CX= SP= ST ST::MOV SP, 1000HMOV SP, 1000H PUSH BX PUSH BX PUSH CX PUSH CX MOV AX, 62CEH MOV AX, 62CEH ADD AX, SP ADD AX, SP POP BX POP BX HLT HLT 例例3 3 :分析下面程序::分析下面程序: STST::MOV CXMOV CX,,5 5 POP CX POP CX L1 L1::PUSH CXPUSH CX DEC CX DEC CX MOV CX MOV CX,,10 JNZ L110 JNZ L1 L2 L2::DEC CX HLTDEC CX HLT JNZ L2 JNZ L2 <3> XCHG<3> XCHG指令指令( (交换交换) ) A、A、XCHGXCHG指令格式与操作指令格式与操作 XCHG OPR1, OPR2 XCHG OPR1, OPR2 OPR1←→OPR2 OPR1←→OPR2 B、B、XCHGXCHG指令可以在寄存器之间或寄存器与存贮器之指令可以在寄存器之间或寄存器与存贮器之 间交换信息。
间交换信息 C C、、例例 注:不允许使用段寄注:不允许使用段寄该指令不影响标志位该指令不影响标志位 2、累加器专用传送指令2、累加器专用传送指令 <1> IN/OUT<1> IN/OUT输入输出指令输入输出指令 A、指令的格式与操作A、指令的格式与操作 长格式:长格式:IN AL, PORT AL ←(PORT) IN AL, PORT AL ←(PORT) IN AX, PORT AX ← (PORT+1,PORT) IN AX, PORT AX ← (PORT+1,PORT) OUT PORT,AL (PORT)← AL OUT PORT,AL (PORT)← AL OUT PORT,AX (PORT+1,PORT)← AX OUT PORT,AX (PORT+1,PORT)← AX 短格式:短格式:IN AL,DX AL ← (DX) IN AL,DX AL ← (DX) IN AX,DX AX ← IN AX,DX AX ←((DX+1,DXDX+1,DX)) OUT DX,AL (DXOUT DX,AL (DX))← ← AL AL OUT DX,AX (DX+1,DX)←AX OUT DX,AX (DX+1,DX)←AX 注:注:I/OI/O指令中只能用指令中只能用AX/ALAX/AL与与DXDX和和8 8位的端口地址。
位的端口地址 B B、、 用长格式时可以在指令中直接指定端口号用长格式时可以在指令中直接指定端口号, ,但只限但只限 于外设的前于外设的前256256个端口,当端口号个端口,当端口号≥≥256256时,只能使时,只能使 用短格式,用短格式,( (间接间接) ),必须注意端口号即为外设地,必须注意端口号即为外设地 址,它与段寄无关址,它与段寄无关 I/OI/O指令不影响标志位指令不影响标志位 C C、、 例例1 1:: D D、、 例例2 2:: OUT DX, ALOUT DX, AL <2> XLAT<2> XLAT换码指令换码指令 A、指令格式与操作A、指令格式与操作 XLAT OPR XLAT OPR 或或 XLAT XLAT AL ←[ BX + AL ] AL ←[ BX + AL ] B、注:使用B、注:使用XLATXLAT指令,应先建立一个表格。
指令,应先建立一个表格 表格首址存入表格首址存入BXBX中,需转换的代码应是相对于中,需转换的代码应是相对于 表格首址的位移量(即项号)也提前放入表格首址的位移量(即项号)也提前放入AL AL 中 表格的内容(即项值)则是所要换取的代码表格的内容(即项值)则是所要换取的代码它将存入它将存入ALAL中 指令格式中的指令格式中的OPROPR为表格首址(符号地址)为表格首址(符号地址) 所有标志不受影响所有标志不受影响 C、例C、例 设:设:BX=0040H, AL=02HBX=0040H, AL=02H,, DS=F000HDS=F000H 项号项号项值项值 表格:表格: 0 (F0040H)=11H 0 (F0040H)=11H ((0040H0040H为表格首址)为表格首址) 1 (F0041H)=22H 1 (F0041H)=22H 2 (F0042H)=33H 2 (F0042H)=33H 3 (F0043H)=44H 3 (F0043H)=44H 4 (F0044H)=55H 4 (F0044H)=55H 5 (F0045H)=66H 5 (F0045H)=66H 则:执行则:执行XLATXLAT后,后, AL= AL= 3、地址传送指令3、地址传送指令 A、指令格式与操作A、指令格式与操作 偏移地址送寄存器偏移地址送寄存器 LEA REGLEA REG REGREG SRC SRC 把源操作数的偏移地址送寄存器把源操作数的偏移地址送寄存器。
指针送寄存器和指针送寄存器和DS LDS REG,SRCDS LDS REG,SRC REG (SRC) REG (SRC) DS (SRC+2) DS (SRC+2) 把源操作数提供的把源操作数提供的3232位数送寄存器与段寄位数送寄存器与段寄DS DS 指针送寄存器和指针送寄存器和ES LES REG,SRCES LES REG,SRC REG (SRC) REG (SRC) ES (SRC+2) ES (SRC+2) 把源操作数提供的把源操作数提供的3232位数送寄存器与段寄位数送寄存器与段寄ESES 注:所有标志不受影响注:所有标志不受影响 REGREG必须为必须为1616位通用寄存器位通用寄存器SRCSRC为内存单元地址。
为内存单元地址 B、例B、例LEA BX,[BX+SI]LEA BX,[BX+SI] 执行前:执行前:BX=0400H SI=003CHBX=0400H SI=003CH执行后:执行后:BX= BX= LDS SI,[10H]LDS SI,[10H] 执行前:执行前:DS=C000H, (C0010H)=0180HDS=C000H, (C0010H)=0180H (0012H)=2000H (0012H)=2000H执行后:执行后:SI= DS=SI= DS=LES DI,[BX]LES DI,[BX] 执行前:执行前:DS=B000H, BX=080AHDS=B000H, BX=080AH (B080AH)=05AEH, (B080CH)=4000H (B080AH)=05AEH, (B080CH)=4000H执行后:执行后:DI= ES=DI= ES=4、标志寄存器传送指令4、标志寄存器传送指令 标志送标志送AHAH:: LAHF AH← PSWLAHF AH← PSW的低字节的低字节 AHAH送标寄:送标寄: SAHF PSWSAHF PSW的低字节的低字节← ← AH AH 标志进栈:标志进栈: PUSHF SP←SP-2;PUSHF SP←SP-2; ((SP+1,SPSP+1,SP))← ← PSWPSW 标志出栈:标志出栈: POPF PSW←POPF PSW←((SP+1,SPSP+1,SP)) SP← SP+2 SP← SP+2 PSW PSW 15 8 7 0 15 8 7 0 AH AH / / / /OFDFIFTFSFZF /AF /PF /CF / / / 三、算术运算指令三、算术运算指令 1、加法指令1、加法指令 加:加: ADD DST,SRCADD DST,SRC DST←SRC+DST DST←SRC+DST reg,regreg,reg; ; reg,memreg,mem; ; mem,regmem,reg reg,datareg,data; ; mem,datamem,data; ac,data; ac,data带进位加:带进位加:ADC DST,SRCADC DST,SRC (DST)← (SRC)+(DST)+CF (DST)← (SRC)+(DST)+CF reg,regreg,reg; ; reg,memreg,mem; ; mem,regmem,reg reg,datareg,data; ; mem,datamem,data; ac,data; ac,data加加1 1:: INC OPRINC OPR (OPR)←─ (OPR)+1 ( (OPR)←─ (OPR)+1 (reg;memreg;mem) )注:注:INCINC指令不影响指令不影响CFCF标志标志 2、减法指令2、减法指令 减:减: SUB DST,SRCSUB DST,SRC DST←DST-SRC DST←DST-SRC 带借位减:带借位减:SBB DST,SRCSBB DST,SRC OST←DST-SRC-CF OST←DST-SRC-CF 减1:减1: DEC OPRDEC OPR OPR←OPR-1 OPR←OPR-1 求补:求补: NEG OPRNEG OPR OPR←0-DPR OPR←0-DPR 比较:比较: CMP OPR1,OPR2CMP OPR1,OPR2OPR1 - OPR2 OPR1 - OPR2 注:注:CMPCMP指令执行减操作,但它不保存结果指令执行减操作,但它不保存结果, ,只是只是 根据操作结果设置条件标志位。
根据操作结果设置条件标志位CMPCMP指令后指令后 往往跟着一条条件快移指令,实现程序分支往往跟着一条条件快移指令,实现程序分支 DECDEC指令不影响指令不影响CFCF标志 3、乘法指令3、乘法指令 格式:格式:无符号数乘无符号数乘 MUL SRCMUL SRC ( (reg/memreg/mem) ) 带符号数乘带符号数乘 IMVL SRCIMVL SRC 操作:字节操作操作:字节操作 AL*(SRC) AXAL*(SRC) AX 字操作字操作 AX*(SRC) DX,AXAX*(SRC) DX,AX 注:注:执行前执行前, ,必须将被乘数送入必须将被乘数送入AX/ALAX/AL中 MULMUL::当积的高位为当积的高位为0 0,则,则CF=0,OF=0 CF=0,OF=0 否则均为否则均为1 1 IMVLIMVL::当积的高一半是低一半的符号扩展则当积的高一半是低一半的符号扩展则 CF=OF=0CF=OF=0,,否则为否则为1 1。
例:例:设设 AL=04H BH=02H AH=E5HAL=04H BH=02H AH=E5H 则则 执行执行 MUL BH MUL BH 后后 AX=AX= 4、除法指令4、除法指令 格式:格式:无符号数除无符号数除 DIV SRCDIV SRC( (reg/memreg/mem) ) 带符号数除带符号数除 IDIV SRCIDIV SRC 操作:字节操作:操作:字节操作: AX÷(SRC)→AX÷(SRC)→商商ALAL,余,余AHAH 字操作:字操作: DX,AX÷(SRC)→DX,AX÷(SRC)→商商AXAX,余,余DXDX 注:注:IDIVIDIV、、DIVDIV执行前执行前, ,必须将被除数送入指定寄存器必须将被除数送入指定寄存器 AX,DXAX,DX中 用除法指令时,必须注意它要求商为用除法指令时,必须注意它要求商为8 8位位( (字节字节) )// 1616位位( (字字) ),如果被除数的高,如果被除数的高8 8位位( (字节字节) )或或1616位位 ( (字字) )大于除数的绝对值,商就会产生溢出,此时大于除数的绝对值,商就会产生溢出,此时 会作除数为会作除数为0 0的情况来处理。
的情况来处理 例:设例:设 AX=0009H BH=02H AX=0009H BH=02H 则则 执行执行 DIV BH DIV BH 后后 AL= AH=AL= AH= D D、、字节转换为字指令:字节转换为字指令: 格式:格式:CBWCBW 操作:操作:ALAL的内容符号扩展到的内容符号扩展到AHAH 字转换为双字指令:字转换为双字指令: 格式:格式:CWDCWD 操作:操作:AXAX的内容符号扩展到的内容符号扩展到DXDX 注:注:CBW,CWDCBW,CWD指令不影响条件码指令不影响条件码 例:例:设有两个设有两个1616位数存于位数存于AX,BXAX,BX中,求中,求Z=AX/BX Z=AX/BX 55、、十进制调整指令十进制调整指令 A、压缩的A、压缩的BCDBCD码:码:用用4 4位位2 2进制表示一个十进制数位。
进制表示一个十进制数位 如如502D─→0101,0000,0010B 502D─→0101,0000,0010B 非压缩的非压缩的BCDBCD码:码:以以8 8位为一组表示一个十进制数位为一组表示一个十进制数 位,其中低位,其中低4 4位为位为BCDBCD码,高码,高4 4位没位没 有意义有意义 如:如: 502D─→00110101,00110000,0011,0010B502D─→00110101,00110000,0011,0010B 注:注: ASCIIASCII码是一种非压缩的码是一种非压缩的BCDBCD码 B、压缩的B、压缩的BCDBCD码调正指令码调正指令 DAADAA::条件:用条件:用ADDADD或或ADCADC将两个压缩将两个压缩BCDBCD码码 相加,和存于相加,和存于ALAL中。
中 操作:将和操作:将和ALAL调正到压缩的调正到压缩的BCDBCD格式存入格式存入 ALAL中 DASDAS::条件:用条件:用SUBSUB或或SBBSBB将两个压缩将两个压缩BCDBCD码码 相减,差存于相减,差存于ALAL中 操作:将操作:将ALAL中的差调正到压缩的中的差调正到压缩的BCDBCD格格 式存入式存入ALAL中 注:注:DAA/DASDAA/DAS对对OFOF标志无定义对其他标志有影响标志无定义对其他标志有影响 例例1 1:: 设:设: AL=28H, BL=68HAL=28H, BL=68H 执行:执行: ADD AL,BLADD AL,BL DAA DAA 指令后:指令后: AL= CF= AF=AL= CF= AF= 例例2 2:: 设:设: AL=86H, BL=07HAL=86H, BL=07H 执行:执行: SUB AL,BLSUB AL,BL DAS DAS 指令后:指令后: AL= CF= AF=AL= CF= AF= C、非压缩的C、非压缩的BCDBCD码调整指令码调整指令 AAAAAA::加法的加法的ASCIIASCII调正指令调正指令 条件:用条件:用ADD/ADCADD/ADC将将2 2个非压缩个非压缩BCDBCD码相加,码相加, 和存于和存于ALAL中。
中 操作:将操作:将ALAL中和调正到非压缩的中和调正到非压缩的BCDBCD格式将 调正产生的进位值加到调正产生的进位值加到AHAH中 AASAAS::减法的减法的ASCIIASCII调正指令调正指令 条件:用条件:用SUB/SBBSUB/SBB将将2 2个非压缩个非压缩BCDBCD码相减,码相减, 差存于差存于ALAL中 操作:将操作:将ALAL中差调正到非压缩中差调正到非压缩BCDBCD格式,其调格式,其调 正产生的借位从正产生的借位从AHAH中减去 AAMAAM::乘法的乘法的ASCIIASCII调正指令调正指令 (对结果调正对结果调正) ) 条件:条件: 用用MULMUL将将2 2个非压缩个非压缩BCDBCD码相乘码相乘( (要求高要求高4 4位为位为0)0),, 结果存于结果存于ALAL中 操作:操作: 将将ALAL内容除以内容除以OAHOAH,,其商存于其商存于AHAH中,余中,余 数存于数存于ALAL中。
中 AADAAD::除法的除法的ASCIIASCII调整指令调整指令( (对被除数必须进行调整对被除数必须进行调整) ) 操作:操作:AH*10+AL→ALAH*10+AL→AL;;0→AH0→AH 将将AXAX中的被除数中的被除数( (非压缩非压缩BCDBCD码,高码,高4 4位为位为0)0)调调 整成二进制数整成二进制数 例:例: a a、设:、设: AX=0505H , BL=09H AX=0505H , BL=09H 执行:执行: ADD AL,BL ADD AL,BL AAA AAA 后:后:AX=AX= b b、设:、设: AL=07H, BL=09HAL=07H, BL=09H 执行:执行: MUL AL,BL MUL AL,BL AAM AAM 后:后:AH= AL=AH= AL= c c、设:、设: AX=0604HAX=0604H 执行:执行: AAD AAD 后:后:AX=AX= 6 6、、编程编程举例:举例: A A、试编一程序计算一批数中,、试编一程序计算一批数中,0 0的个数。
的个数 B B、设有、设有100100个无符号字节数存于以个无符号字节数存于以TABTAB为首址的单元为首址的单元 中,试将其最大值存于中,试将其最大值存于ALAL中中. .最小值存于最小值存于BLBL中 C C、、 试分析下面程序功能:试分析下面程序功能: STST:: LEA SI,DATA1 LEA SI,DATA1 LEA DI,DATA2 LEA DI,DATA2 MOV CX,5 MOV CX,5 CLC CLC L1 L1:: MOV AL,[SI]MOV AL,[SI] MOV BL,[DI] MOV BL,[DI] ADC AL, BL ADC AL, BL DAA DAA MOV [SI],AL MOV [SI],AL INC SI INC SI INC DI INC DI LOOP L1 LOOP L1 MOV AL, 0 MOV AL, 0 ADC AL, 0 ADC AL, 0 MOV [SI], AL MOV [SI], AL HLT HLT 四、逻辑运算和移位指令四、逻辑运算和移位指令 1、逻辑运算指令1、逻辑运算指令( (按位操作按位操作) ) 逻辑与:逻辑与:AND DST,SRCAND DST,SRC DST← DST∧SRC DST← DST∧SRC reg,regreg,reg reg,memreg,mem mem,regmem,reg reg,datareg,data mem,datamem,data 逻辑或:逻辑或:OR DST,SRCOR DST,SRC DST← DST∨URC DST← DST∨URC 逻辑非:逻辑非:NOT OPRNOT OPR OPROPR ← OPR ← OPR 异或:异或: XOR DST,SRCXOR DST,SRC DST←DST V SRC DST←DST V SRC 测试:测试: TEST OPR1,OPR2TEST OPR1,OPR2 OPR1∧OPR2 OPR1∧OPR2 注:注:NOTNOT不影响标志位不影响标志位, ,其余其余4 4条将使条将使CF=OF=0CF=OF=0,,AFAF无无 定义定义, ,对对SF,ZF,PFSF,ZF,PF有影响。
有影响 逻辑运算指令对处理操作数的某些位很有用它可逻辑运算指令对处理操作数的某些位很有用它可 屏蔽某些位,可使某些位置屏蔽某些位,可使某些位置““11””,可测试某些位,可测试某些位等等. . 2、移位指令2、移位指令 逻辑左移:逻辑左移: SHL OPR,CNT SHL OPR,CNT 逻辑右移:逻辑右移: SHR OPR,CNT SHR OPR,CNT 算术左移:算术左移: SAL OPR,CNTSAL OPR,CNT 算术右移:算术右移: SAR OPR,CNTSAR OPR,CNT 循环左移:循环左移: ROL OPR,CNTROL OPR,CNT 循环右移:循环右移: ROR OPR,CNTROR OPR,CNT 带进位循环左移:带进位循环左移: RCL OPR,CNTRCL OPR,CNT 带进位循环右移:带进位循环右移: RCR OPR,CNT RCR OPR,CNT 其中其中: OPR: OPR::reg;memreg;mem CNT CNT::1 1或或CLCL 注:注:移位指令:移位指令:OFOF位当位当CNT=1CNT=1有效,在移位后有效,在移位后D7D7值发值发 生变化时生变化时1→OF,1→OF,否则为否则为o o。
它影响它影响SF,ZF,PF,SF,ZF,PF,对对AFAF无定义 循环指令:不影响除循环指令:不影响除OF,CFOF,CF以外的其它条件标志以外的其它条件标志 OFOF影响同移位指令影响同移位指令 例:例:a a、设:、设:SI=1450HSI=1450H 则:执行则:执行 MOV CL,2MOV CL,2 SHL SI,CL SHL SI,CL 后后, SI= CF=, SI= CF= b b、计算、计算 BX*6 BX*6 c c、计算、计算 AX/256,AX/256,结果存于结果存于ALAL中中 五、串处理指令五、串处理指令 串处理指令是指用一条指令实现对一串字符或数据串处理指令是指用一条指令实现对一串字符或数据 的操作。
的操作 80868086的串处理指令有如下几个特点:的串处理指令有如下几个特点: a a、、通过加重复前缀通过加重复前缀(REP REPNZ(REP REPNZ等等) )实现串操作实现串操作 b b、、可以对字节/字串进行操作可以对字节/字串进行操作 c c、用、用SISI对源操作数进行间接寻址对源操作数进行间接寻址( (在在DSDS段中段中),),用用DIDI对对 目的操作数进行间接寻址目的操作数进行间接寻址( (在在ESES段中段中) ) d d、、串操作时,地址的修改与方向标志串操作时,地址的修改与方向标志DFDF有关,当有关,当DF=1DF=1 时,时,SI/DISI/DI作自动减量修改,当作自动减量修改,当DF=0DF=0时,时,SI/DISI/DI作作 自动增量修改自动增量修改 e e、、在执行串操作指令过程中,在执行串操作指令过程中,IPIP保持指向重复前缀保持指向重复前缀( (前缀本身也是一条指令前缀本身也是一条指令) )的偏移地址的偏移地址 1、字符串传送指令与重复前缀指令1、字符串传送指令与重复前缀指令 A、A、REPREP CX←CX-1, CX←CX-1,当当CX=0CX=0退出重复退出重复, ,否则否则 执行其后的串指令。
执行其后的串指令 B、B、MOVSBMOVSB (DI)←─(SI) (DI)←─(SI) MOVSWMOVSW SI←SI±1 SI←SI±1或或2 2 DI←DI±1 DI←DI±1或或2 2 ((DF=0DF=0为为"+"; DF=1"+"; DF=1为为"-""-")) 注:注:MOVSB(MOVSB(字节字节)/MOVSW()/MOVSW(字字) )指令前通常加指令前通常加REP,REP, 该指令不影响该指令不影响F F标志标志 C、例:一批数的传送C、例:一批数的传送 ((1 1)) ((2 2)) ((3 3)) 2、取字符串指令2、取字符串指令 LODSBLODSB AC←(SI) AC←(SI) LODSW LODSW SI←SI±1 SI←SI±1减减2 2 ((DF=0DF=0为为"+"; DF=1"+"; DF=1为为"-""-")) 注:此指令前,通常不加注:此指令前,通常不加REPREP,,它不影响它不影响F F标志。
标志 例:数例:数0 0的个数存于的个数存于CHCH中中 3、存字符串指令3、存字符串指令 STOSBSTOSB (DI)←AC (DI)←AC STOSW STOSW DI←DI±1 DI←DI±1或或2. 2. DF=0 DF=0为为"+"; DF=1"+"; DF=1为为"-""-" 注:该指令前加注:该指令前加REPREP后,可以使一批内存单元,填满后,可以使一批内存单元,填满 相同的数相同的数 该指令不影响该指令不影响F F标志 例:使例:使0400H0400H开始的开始的256256个单元清个单元清0 0 4、4、 字符串比较指令与相等/不相等,为字符串比较指令与相等/不相等,为0 0/不为/不为0 0,重,重 复前缀指令复前缀指令 A、A、REPEREPE CX←CX-1, CX←CX-1,当当CX=0CX=0或或ZF=0 ZF=0 REPZ REPZ 退出重复退出重复, ,否则执行其后的串指令否则执行其后的串指令 B、B、REPNEREPNE CX←CX-1, CX←CX-1,当当CX=0CX=0或或ZF=1ZF=1 REPNZ REPNZ 退出重复退出重复, ,否则执行其后的串指令否则执行其后的串指令 CC、、CMPSBCMPSB (SI) (SI)--(DI)(DI) CMPSW CMPSW SI←SI±1 SI←SI±1或或2 2;; DI←DI±1DI←DI±1或或2 2。
DF=0DF=0为为““+”; DF=1+”; DF=1为为““-”-” D、例:判一批数是否与要求的数相同D、例:判一批数是否与要求的数相同 5、字符串检索指令5、字符串检索指令 按累加器中给出的字节/字对按累加器中给出的字节/字对ES:DIES:DI所指的字节/字所指的字节/字 串进行检索串进行检索, ,建立相应标志建立相应标志 A、A、SCASBSCASB AC -(DI) AC -(DI) SCASW SCASW DI←DI±1 DI←DI±1或或±2 ±2 B、例:B、例:100100个字符存于以个字符存于以TABTAB为首址单元中,试检索为首址单元中,试检索 A A字符的位置字符的位置, ,位置值存于位置值存于DXDX中中, ,若无若无A A字使字使A=-1A=-1 六、控制转移指令六、控制转移指令 1、转移指令1、转移指令 <1> <1> 段内与段间:段内与段间:段内转移段内转移: :在同一段内进行的转移在同一段内进行的转移 段间转移段间转移: :段与段之间进行的转移段与段之间进行的转移 <2> <2> 转移指令的寻址方式转移指令的寻址方式 A A、、段内直接寻址段内直接寻址 它是一种相对寻址它是一种相对寻址, ,其转移的有效地址为其转移的有效地址为 IPIP的当的当前值与位移量前值与位移量8 8位位/16/16位位( (带符号数带符号数) )之和,其中条之和,其中条件转移指令只能采用这种寻址方式,位移量为件转移指令只能采用这种寻址方式,位移量为8 8位位. . B B、、段内间接寻址:段内间接寻址: ( (只适用于无条件转移指令只适用于无条件转移指令) ) 段内间接寻址的转移有效地址为寄存器的内容或段内间接寻址的转移有效地址为寄存器的内容或 存贮单元的内容。
它可以用数据寻址方式中除存贮单元的内容它可以用数据寻址方式中除立即立即 数以外的任一种寻址方式取得数以外的任一种寻址方式取得 C C、、段间直接寻址:段间直接寻址: ( (只适用无条件转移指令只适用无条件转移指令) ) 段间直接寻址的转移地址的段值和偏移量直接由指段间直接寻址的转移地址的段值和偏移量直接由指令给出产生转移时令给出产生转移时, ,其段值送其段值送CS,CS,偏移量送偏移量送IPIP D D、、段间间接寻址:段间间接寻址: ( (只适用无条件转移指令只适用无条件转移指令) ) 段间间接寻址用存贮器中段间间接寻址用存贮器中2 2 个相继字的内容取代个相继字的内容取代IPIP与与CSCS内容,以达到段间转移之目的其中相继字的内容,以达到段间转移之目的其中相继字的存贮单元地址将由指令指定的除立即数/寄存器方存贮单元地址将由指令指定的除立即数/寄存器方式以外的任一种数据寻址方式取得式以外的任一种数据寻址方式取得 两个相继字中两个相继字中, ,前一个为偏移量前一个为偏移量, ,后一个为段值。
后一个为段值 <3> <3> 无条件转移指令无条件转移指令 JMP SHORT PTR OPRJMP SHORT PTR OPR IP←IP+8 IP←IP+8位位移量位位移量 段内直接短转移段内直接短转移 JMP NEAR PTR OPRJMP NEAR PTR OPR IP←IP+16 IP←IP+16位位移量位位移量 段内直接近转移段内直接近转移 JMP WORD PTR OPRJMP WORD PTR OPR IP←─(EA) IP←─(EA) 段内间接转移段内间接转移 JMP FAR PTR OPRJMP FAR PTR OPR IP←OPR( IP←OPR(偏移地址偏移地址) ) 段间直接转移段间直接转移 CS←OPR(CS←OPR(段地段地) ) JMP DWORD PTR OPRJMP DWORD PTR OPR IP←(EA) IP←(EA) 段间间接转移段间间接转移 CS←EA+2CS←EA+2 <4> <4> 条件转移指令条件转移指令 A、A、 JZ(JE) OPRJZ(JE) OPR 条件条件ZF=1 ZF=1 结果为零结果为零( (相等转相等转) ) JNZ(JNE) OPRJNZ(JNE) OPR ZF=0 ZF=0 结果不为零结果不为零( (不等转不等转) ) JS OPRJS OPR SF=1 SF=1 为负转为负转 JNS OPRJNS OPR SF=0 SF=0 为正转为正转 JO OPRJO OPR OF=1 OF=1 有溢出转有溢出转 JNO OPRJNO OPR OF=0 OF=0 无溢出转无溢出转 JP OPRJP OPR PF=1 PF=1 偶转偶转 JNP OPRJNP OPR PF=0 PF=0 奇转奇转 B、无符号数条件转移B、无符号数条件转移JB(JNAE,JC) OPRJB(JNAE,JC) OPR 条件:条件:CF=1 CF=1 小于转小于转 JNP(JAE,JNC)OPRJNP(JAE,JNC)OPR CF=0 CF=0 大于等于转大于等于转 JBE(JNA) OPRJBE(JNA) OPR CFVZF=1 CFVZF=1 小于等于转小于等于转 JNBE(JA) OPRJNBE(JA) OPR CFVZF=0 CFVZF=0 大于转大于转 C、带符号数条件转移C、带符号数条件转移JL(JNGE) OPRJL(JNGE) OPR 条件:条件:SF≯OF=1 SF≯OF=1 小于转小于转 JNL(JGE) OPRJNL(JGE) OPR SF≯OF=0 SF≯OF=0 大于等于转大于等于转 JLE(JNG) OPRJLE(JNG) OPR (SF≯OF)∨ZF=1 (SF≯OF)∨ZF=1 小于等于转小于等于转 JNLE(JG) OPRJNLE(JG) OPR (SF≯OF)∨ZF=0 (SF≯OF)∨ZF=0 大于转大于转 D、D、JCXZ OPRJCXZ OPR CX=0 CX=0 CX=0 CX=0转转 <5> <5> 例:例: A、A、设:设:DS=2600H, BX=1256H, SI=528FDS=2600H, BX=1256H, SI=528F TAB( TAB(位移量位移量)=20A1H PC)=20A1H PC当=当=2000H2000H [232F7H]=3280H, [264E5H]=2450H [232F7H]=3280H, [264E5H]=2450H 执行执行 JMP 1000H JMP 1000H 后后 IP=IP= JMP BX JMP BX 后后 IP=IP= JMP [BX+TAB] JMP [BX+TAB] 后后 IP=IP= JMP [BX+SI] JMP [BX+SI] 后后 IP=IP= JMP 2000H JMP 2000H ::1000H 1000H 后后 IP= CS=IP= CS= B、试分析下面程序B、试分析下面程序 STST::MOV AL, XMOV AL, X SHL AL,1 SHL AL,1 JC L2 JC L2 CMP AL,Y CMP AL,Y JNZ L1 JNZ L1 MOV Z,0 MOV Z,0 HLT HLT L1 L1::JB L3 JB L3 L2 L2::MOV Z,1MOV Z,1 HLT HLT L3 L3::MOV Z,-1 MOV Z,-1 HLT HLT 2、子程序调用和返回指令2、子程序调用和返回指令 A、调用指令:A、调用指令:把下一条指令的地址把下一条指令的地址(CS/IP(CS/IP即即断点)断点) 压栈,并实现转移(压栈,并实现转移(DSTDST送送IP/CS)IP/CS) CALL DSTCALL DST 段内直接段内直接 SP←SP-2 SP←SP-2 调用调用 [SP+1,SP]←IP / IP←IP+D16[SP+1,SP]←IP / IP←IP+D16 段内间接段内间接 SP←SP-2 SP←SP-2 调用调用 [SP+1,SP]←IP / IP←EA[SP+1,SP]←IP / IP←EA 段间直接段间直接 SP←SP-2 [SP+1,SP]←CSSP←SP-2 [SP+1,SP]←CS 调用调用 SP←SP-2 [SP+1,SP]←IPSP←SP-2 [SP+1,SP]←IP IP← IP←偏移地址偏移地址 CS←CS←段地址段地址 段间间接段间间接 SP←SP-2, [SP+1,SP]←CSSP←SP-2, [SP+1,SP]←CS 调用调用 SP←SP-2, [SP+1,SP]←IPSP←SP-2, [SP+1,SP]←IP IP←(EA) IP←(EA) CS←(EA+2) CS←(EA+2) B、返回指令B、返回指令 RETRET 段内返回段内返回 IP← [SP+1,SP]IP← [SP+1,SP] SP←SP+2 SP←SP+2 RET EXPRET EXP 段内带立即数返回段内带立即数返回 IP←[SP+1,SP]IP←[SP+1,SP] SP←SP+2 SP←SP+2 SP←SP+D16 ( SP←SP+D16 (出栈后修改出栈后修改SP) SP) RET RET IP←[SP+1,SP] IP←[SP+1,SP] 段间返回段间返回 SP←SP+2 SP←SP+2 CS←[SP+1,SP] CS←[SP+1,SP] SP←SP+2 SP←SP+2 RET EXPRET EXP IP←[SP+1,SP] IP←[SP+1,SP] 段间带立即数返回段间带立即数返回 SP←SP+2 SP←SP+2 CS←[SP+1,SP] CS←[SP+1,SP] SP←SP+D16 SP←SP+D16 注:注:EXPEXP是一个表达式,其值为是一个表达式,其值为D16(D16(位移量位移量) )。
它用来在它用来在 返回地址出栈后修改堆栈指针这便于调用程序在返回地址出栈后修改堆栈指针这便于调用程序在 用用CAILCAIL之前把子程序所需参数入栈,以便子程序使之前把子程序所需参数入栈,以便子程序使 用当子程序返回后,这些参数已不再有用,就可用当子程序返回后,这些参数已不再有用,就可 以修改栈指针使其指向参数入栈以前的值以修改栈指针使其指向参数入栈以前的值 C C 例:例: CALL 1000H CALL 1000H CALL AX CALL AX CALL 2500H:3600H CALL 2500H:3600H CALL DWORD PTR[DI] CALL DWORD PTR[DI] RET6 RET6 3、循环控制指令3、循环控制指令 LOOP OPRLOOP OPR CX←CX-1, CX←CX-1,当当CX≠0CX≠0时:时: 则:则: IP←IP+D8IP←IP+D8实现循环实现循环 否则:否则:IPIP值不变值不变, ,退出循环退出循环 LOOPZ(LOOPE) OPRLOOPZ(LOOPE) OPR CX←CX-1, CX←CX-1,当当CX≠0,ZF=1CX≠0,ZF=1时:时: 则:则: IP←IP+D8IP←IP+D8实现循环实现循环 否则:否则:IPIP值不变值不变, ,退出循环退出循环 LOOPNZ(LOOPNE) OPRLOOPNZ(LOOPNE) OPR CX←CX-1, CX←CX-1,当当CX≠0,ZF=0CX≠0,ZF=0时:时: 则:则: IP←IP+D8IP←IP+D8实现循环实现循环 否则:否则:IPIP值不变值不变, ,退出循环退出循环 注:循环控制指令不影响条件码。
注:循环控制指令不影响条件码 LOOPZ/LOOPNZLOOPZ/LOOPNZ提供了提前结束循环的可能性提供了提前结束循环的可能性 例:试分析下面程序例:试分析下面程序 STST::MOV CX, M MOV CX, M MOV AX, 0 MOV AX, 0 MOV SI, AX MOV SI, AX L1 L1::ADD AX,[ARRAY +SI] ADD AX,[ARRAY +SI] ADD SI, 2 ADD SI, 2 LOOP L1 LOOP L1 MOV [ TOTAL], AX MOV [ TOTAL], AX HLT HLT 4、中断指令和中断返回指令4、中断指令和中断返回指令 A、A、INTINT SP←SP-2;[SP+1,SP]←PSW SP←SP-2;[SP+1,SP]←PSW INT TYPEINT TYPE SP←SP-2;[SP+1,SP]←CS SP←SP-2;[SP+1,SP]←CS SP←SP-2;[SP+1,SP]←IP SP←SP-2;[SP+1,SP]←IP IP←(TYPE*4) IP←(TYPE*4) CS←(TYPE*4+2) CS←(TYPE*4+2) 注:注:TYPETYPE为类型号,其值为为类型号,其值为0 0~~255255。
TYPE(TYPE不能为不能为0)0) INT INT是一个字节的中断指令,它隐含的类型号为是一个字节的中断指令,它隐含的类型号为3 3 ( (断点中断断点中断) ) INT INT指令在执行完上述操作后,将指令在执行完上述操作后,将0→IF→TF0→IF→TF B、B、INTOINTO 若若OF=1OF=1则:则: SP←SP- 2;[SP+1,SP]←PSW,SP←SP- 2;[SP+1,SP]←PSW, SP←SP- 2;[SP+1,SP]←CS SP←SP- 2;[SP+1,SP]←CS SP←SP- 2;[SP+1,SP]←IP SP←SP- 2;[SP+1,SP]←IP IP←[00010H,00011H] IP←[00010H,00011H] CS←[00012H,00013H] CS←[00012H,00013H] 注:注:INTOINTO为若溢出则中断的指令。
为若溢出则中断的指令 (类型号为类型号为4)4) C、C、IRETIRET IP←[SP+1,SP] , SP←SP+2 IP←[SP+1,SP] , SP←SP+2 CS←[SP+1,SP] , SP←SP+2 CS←[SP+1,SP] , SP←SP+2 PSW←[SP+1,SP] , SP←SP+2 PSW←[SP+1,SP] , SP←SP+2 注:中断指令:保存现场:注:中断指令:保存现场: PSWPSW、、CSCS、、IPIP 实现转移:实现转移:[TYPE*4]→IP[TYPE*4]→IP [TYPE*4+2]→CS [TYPE*4+2]→CS 5、处理器控制指令5、处理器控制指令 A、A、CLCCLC 0→CF 0→CF 进位位置进位位置"0""0" CMC CMC CF→CF CF→CF 进位求反进位求反 STCSTC 1→CF 1→CF 进位置进位置"1""1" CLDCLD 0→DF 0→DF 方向标志置方向标志置"0""0" STD STD 1→DF 1→DF 方向标志置方向标志置"1""1" CLI CLI 0→IF 0→IF 中断标志置中断标志置"0""0" STI STI 1→IF 1→IF 中断标志置中断标志置"1""1" B、B、NOPNOP 无无( (空空) )操作操作 HLTHLT 停机停机 WAIT WAIT 等待等待 C、C、ESC ESC memmem 交权交权 ( (调用协处理器工作调用协处理器工作) ) ESC ESC 指令把指令把memmem存贮单元的内容送到存贮单元的内容送到 数据总线。
这条指令在使用协处理器数据总线这条指令在使用协处理器 执行某些操作时,可以从存贮器取得执行某些操作时,可以从存贮器取得 指令或操作数指令或操作数 D、D、LOCKLOCK 封锁封锁 该指令是一种前缀,它可以与其它指该指令是一种前缀,它可以与其它指 令联合,用来维持总线的锁存信号直令联合,用来维持总线的锁存信号直 到与其联合的指令执行完为止到与其联合的指令执行完为止 当当CPUCPU与其他处理机协同工作时,该与其他处理机协同工作时,该 指令可避免破坏有用信息指令可避免破坏有用信息 小小 结结 一、一、CPUCPU结构结构 1 1、、通用寄存器:通用寄存器:AX,BX,CX,DX/AH,AL,BH,BL,CH,AX,BX,CX,DX/AH,AL,BH,BL,CH, CL,DH,DL CL,DH,DL 专用寄存器:专用寄存器:SP,BP,SI,DISP,BP,SI,DI。
标志寄存器:标志寄存器:F,(AF,CF,OF,SF,PF,ZF//DF,IF,TF,)F,(AF,CF,OF,SF,PF,ZF//DF,IF,TF,) 段地址寄存器:段地址寄存器:CS,DS,ES,SSCS,DS,ES,SS 指针寄存器:指针寄存器: IPIP 2 2、、一一个个2020位位的的物物理理地地址址可可表表示示成成段段地地址址::偏偏移移地地址址,, 其计算方法如下:其计算方法如下: 物理地址=物理地址=( (段地址段地址X10H )X10H )++偏移地址偏移地址 二、寻址方式二、寻址方式 1 1、立即寻址:、立即寻址:操作数由指令给出操作数由指令给出 MOV DX,100H MOV DX,100H 2 2、、寄存器寻址:寄存器寻址:操作数在寄存器中操作数在寄存器中 ADD AX,BXADD AX,BX 3 3、直接寻址:、直接寻址:操作数有效地址由指令给出操作数有效地址由指令给出 MOV AX,[100] MOV AX,VARMOV AX,[100] MOV AX,VAR 4 4、、寄存器间接寻址:寄存器间接寻址: 操作数的地址在寄存器中,这些寄存器可以操作数的地址在寄存器中,这些寄存器可以 为为BX,BP;SI,DI.BX,BP;SI,DI.其操作数地址为:其操作数地址为: A A、、┌┌BX┐ (BX┐ (数据段基址寻址数据段基址寻址) ) │SI│ │SI│++位移量+位移量+[DS][DS]**16 (16 (变址寻址变址寻址) ) └DI┘ ( └DI┘ (变址寻址变址寻址) ) [BP] [BP]++位移量+位移量+[SS][SS]**16 (16 (堆栈段基址寻址堆栈段基址寻址) ) B B、、┌┌SI┐SI┐ │ │ │ │++[BX][BX]++位移量+位移量+[DS]*16 ([DS]*16 (基址加变址基址加变址) ) └DI┘ └DI┘ ┌SI┐ ┌SI┐ │ │ │ │++[BP][BP]++位移量+位移量+[SS]*16 ([SS]*16 (基址加变址基址加变址) ) └DI┘ └DI┘ 注:只要用上注:只要用上BPBP,,那就默认段寄为那就默认段寄为SSSS,,其他情况为其他情况为DSDS 5 5、、编写指令时应注意的几个问题编写指令时应注意的几个问题 A A、、注意区别立即寻址方式和直接寻址方式注意区别立即寻址方式和直接寻址方式 如如::MOV AX,126MOV AX,126与与MOV AX,[126] MOV AX,[126] B B、、使用寄存器间址时,应注意和寄存器寻址方式的使用寄存器间址时,应注意和寄存器寻址方式的 区别区别 如:如:MOV AX,BXMOV AX,BX与与MOV AX, [BX] MOV AX, [BX] C C、、在在双双操操作作数数指指令令中中, ,源源操操作作数数和和目目的的操操作作数数的的地地 址不能同时为存贮器地址。
址不能同时为存贮器地址 如:如: M1M1和和M2M2为两个存贮器变量,为两个存贮器变量, 则:则: ADD [M1], [M2] ADD [M1], [M2] 是错误指令是错误指令 D D、、代码段寄存器代码段寄存器CSCS不能用作指令的目的寄存器不能用作指令的目的寄存器 三、指令三、指令 1 1、数据传送指令、数据传送指令 A A、、MOV DST,SRC (DST:MOV DST,SRC (DST:目的操作数,目的操作数,SRCSRC源操作数源操作数) ) 指令的指令的7 7种格式与注意事项种格式与注意事项 PUSH SRC PUSH SRC 指令的操作过程,指令的操作过程,SPSP的变化情况的变化情况 POP DST POP DST 指令的操作过程,指令的操作过程,SPSP的变化情况的变化情况 XCHG OPR1 ,OPR2 (XCHG OPR1 ,OPR2 (交换交换) ) B B、、IN AC,PORT IN AC,PORT 只能用只能用AX/AL,DX//64KAX/AL,DX//64K空间空间 OUT PORT, ACOUT PORT, AC XLAT ( XLAT (换码换码) AL←[BX + AL] ) AL←[BX + AL] BX BX为表格首址,为表格首址,ALAL为项号为项号 C C、、LEA REG,SRC LEA REG,SRC 有效地址送寄存器有效地址送寄存器 REGREG为通用寄存器为通用寄存器 LDS REG,SRC LDS REG,SRC 指针送寄存器和指针送寄存器和DSDS LES REG,SRC LES REG,SRC 指针送寄存器和指针送寄存器和ESES D D、、LAHF LAHF 标志送标志送AHAH SAHF AH SAHF AH送标寄送标寄 2 2、算术运算指令、算术运算指令 A A、、ADD DST,SRCADD DST,SRC ADC DST,SRC ADC DST,SRC INC OPR INC INC OPR INC指令不影响指令不影响CFCF B B、、SUB DST,SRCSUB DST,SRC SBB DST,SRC SBB DST,SRC DEC OPR DEC DEC OPR DEC指令不影响指令不影响CFCF NEG OPR NEG OPR CMP OPR1 ,OPR1 CMP OPR1 ,OPR1 建立标志/后跟条转建立标志/后跟条转 C C、、MUL SRC MUL SRC 字节:字节: AL*(SRC)→AXAL*(SRC)→AX 字:字: AX*(SRC)→DX,AX AX*(SRC)→DX,AX IMUL SRC IMUL SRC (带符号)(带符号) DIV SRC DIV SRC 字节:字节: AX÷(SRC)→AL (AX÷(SRC)→AL (余在余在AH)AH) 字:字: DX,AX÷(SRC)→AX (DX,AX÷(SRC)→AX (余在余在DX)DX) IDIV SRC ( IDIV SRC (带符号带符号) ) D D、、CBW (CBW (字节转换为字字节转换为字) )//(AL(AL扩展到扩展到AH)AH) CWD ( CWD (字转换为双字字转换为双字) )//(AX(AX扩展到扩展到DX)DX) E E、、DAA (BCDDAA (BCD码加调正/压缩码码加调正/压缩码) ) DAS (BCD DAS (BCD码减调正/压缩码码减调正/压缩码) ) AAA ( AAA (非压缩非压缩BCDBCD码加调正码加调正) ) AAS ( AAS (非压缩非压缩BCDBCD码减调正码减调正) ) AAM AAM 非压缩非压缩BCDBCD码乘调正码乘调正 将将ALAL积除积除OA,OA,商存商存AH;AH;除数存除数存ALAL中。
中 AAD AAD 非压缩非压缩BCDBCD码除调正码除调正 将被除数将被除数AXAX调正为调正为2 2进制数进制数; ; H*10+AL→AL H*10+AL→AL 3 3、、逻辑运算和移位指令逻辑运算和移位指令 A A、、AND DST,SRCAND DST,SRC OR DST,SRC OR DST,SRC NOT OPR NOT OPR XOR DST,SRC XOR DST,SRC TEST OPR1 ,OPR2 (OPR1∧OPR2) TEST OPR1 ,OPR2 (OPR1∧OPR2) B B、、SHL OPR,CNT (CNTSHL OPR,CNT (CNT为为1 1或或CL)CL) SAL OPR,CNT SAL OPR,CNT 算术左移算术左移 SHR OPR,CNT SHR OPR,CNT 逻辑右移逻辑右移 SAR OPR,CNT SAR OPR,CNT 算术右移算术右移 ROL OPR,CNT ROL OPR,CNT 循环左移循环左移 ROR OPR,CNT ROR OPR,CNT 循环右移循环右移 RCL OPR,CNT RCL OPR,CNT 带进位循环左移带进位循环左移 RCR OPR,CNT RCR OPR,CNT 带进位循环右移带进位循环右移 4 4、串处理指令、串处理指令 ( (使用串指令的条件使用串指令的条件) ) A A、、REP REP 重复前缀重复前缀 CX≠0CX≠0重复重复 MOVSB MOVSB 字符串传送字符串传送 ((DIDI))←←((SISI)) MOVSW MOVSW 指针自动修改指针自动修改 条件:条件:SI,DI,CXSI,DI,CX及及DFDF赋值后赋值后 才可用才可用MOVSB/W)MOVSB/W) B B、、LODSB LODSB 取字符串取字符串 AC←(SI)AC←(SI) LODSW LODSW C C、、STOSB STOSB 存字符串存字符串 (DI)←AC(DI)←AC STOSW STOSW D D、、REPE/REPZ REPE/REPZ 重复前缀重复前缀 CX≠0,ZF=1CX≠0,ZF=1时重复时重复 REPNE/REPNZ REPNE/REPNZ 重复前缀重复前缀 CX≠0,ZF=0CX≠0,ZF=0时重复时重复 CMPSB CMPSB 字符串比较字符串比较 (SI)(SI)--(DI) (DI) CMPSW CMPSW 自动修改指针自动修改指针 E E、、SCASB SCASB 字符串捡索/字符串捡索/ACAC--(DI)(DI) SCASW SCASW 关键字要事先存入关键字要事先存入AL,AXAL,AX中中 5 5、控制转移指令、控制转移指令 A A、、JMP SHORT PTR OPR JMP SHORT PTR OPR 段内直接短转移段内直接短转移 JMP NEAR PTR OPR JMP NEAR PTR OPR 段内直接近转移段内直接近转移 JMP WORD PTR OPR JMP WORD PTR OPR 段内间接转移段内间接转移 JMP FAR PTR OPR JMP FAR PTR OPR 段间直接转移段间直接转移 JMP DWORD PRT OPR JMP DWORD PRT OPR 段间间接转移段间间接转移 B B、、JZ/JE OPR ZF=1JZ/JE OPR ZF=1 JNE/JNE OPR ZF=0 JNE/JNE OPR ZF=0 JS OPR SF=1 JS OPR SF=1 JNS OPR SF=0 JNS OPR SF=0 JO OPR OF=1JO OPR OF=1 JNO OPR OF=0 JNO OPR OF=0 JP OPR PF=1 JP OPR PF=1 JNP OPR PF=0 JNP OPR PF=0 JB/JNAE/JC OPR CF=1 JB/JNAE/JC OPR CF=1 无符号数小于转无符号数小于转 JNB/JAE/JNC OPR CF=0 JNB/JAE/JNC OPR CF=0 无符号数无符号数 大于等于转大于等于转 JBE/JNA OPR CF∨ZF=1 JBE/JNA OPR CF∨ZF=1 无符号数无符号数 小于等于转小于等于转 JNBE/JA OPR CF∨ZF=0 JNBE/JA OPR CF∨ZF=0 无符号数无符号数 大于转大于转 JL(JNGE) OPR SF≯OF=1 JL(JNGE) OPR SF≯OF=1 带符号数带符号数 小于转小于转 JNL(JGE) OPR SF≯OF=0 JNL(JGE) OPR SF≯OF=0 带符号数带符号数 大于等于转大于等于转 JLE/JNG OPR (SF≯OF)∨ZF=1 JLE/JNG OPR (SF≯OF)∨ZF=1 带符号数带符号数 小于等于转小于等于转 JNLE/JG OPR (SF≯OF)∨ZF=0 JNLE/JG OPR (SF≯OF)∨ZF=0 带符号数带符号数 大于转大于转 JCXZ OPR (CX)=0 CX=0JCXZ OPR (CX)=0 CX=0转转 C C、、CALL DST CALL DST 指令的操作过程指令的操作过程 RET (EXP) RET (EXP) 指令的操作过程指令的操作过程/EXP/EXP的含义的含义 D D、、LOOP OPR LOOP OPR 循环控制,循环控制, CX≠0CX≠0转移转移 LOOPZ/LOOPE OPR LOOPZ/LOOPE OPR 循环控制循环控制, , CX≠0;ZF=1 CX≠0;ZF=1则转移则转移 LOOPNZ/LOOPNE OPR LOOPNZ/LOOPNE OPR 循环控制,循环控制, CX≠0CX≠0;;ZF=0ZF=0则转移则转移 E E、、INT INT 指令操作过程指令操作过程 INT TYPEINT TYPE INTO INTO IRET IRET F F、、CLC CLC 进位位进位位(CF)(CF)置置"0""0" CMC CMC 进位位进位位(CF)(CF)求反求反 STC STC 进位位进位位(CF)(CF)置置"1""1" CLD CLD 方向标志置方向标志置"0" "0" STD STD 方向标志置方向标志置"1""1" CLI CLI 中断标志置中断标志置"0""0" STI STI 中断标志置中断标志置"1""1" NOP NOP HLT HLT WAIT WAIT 等待等待 ESC ESC memmem 交权交权 LOCK LOCK 封锁封锁/ /前缀前缀 6 6、使用指令时,应注意的几个问题、使用指令时,应注意的几个问题 A A、、指令对地址还是对地址中的内容进行操作,指令对地址还是对地址中的内容进行操作, 要严加区分。
要严加区分 如如::LEA BX,MESS MESSLEA BX,MESS MESS的偏移地址的偏移地址→→BXBX B B、、使用指令时,要清楚指令隐含的操作寄存器使用指令时,要清楚指令隐含的操作寄存器 如:乘法隐含的目的操作数如:乘法隐含的目的操作数: AX/AL: AX/AL 除法隐含的目的操作数除法隐含的目的操作数: DX,AX/AL: DX,AX/AL 串指令隐含的操作数为:串指令隐含的操作数为: SI,DISI,DI与与ALAL等 重复前缀重复前缀: CX: CX 十进制调正指令隐含地使用了十进制调正指令隐含地使用了ALAL 换码指令换码指令:XLAT [BX+AL]→AL:XLAT [BX+AL]→AL 循环指令循环指令: CX: CX 输入、输出指令输入、输出指令: AX/AL, DX: AX/AL, DX C C、、对带符号数和无符号数的操作应正确选择相应的条对带符号数和无符号数的操作应正确选择相应的条 件转移指令。
件转移指令 D D、、用用移移位位指指令令来来倍倍增增或或倍倍减减一一个个值值时时,,要要注注意意对对 带符号数和无符号数所使用的指令应是不同的带符号数和无符号数所使用的指令应是不同的 如:如: AX=8520H AX=8520H 当当AXAX为无符号数时为无符号数时,AX/2,AX/2可用可用 SHR AX,1 SHR AX,1 结果为结果为4290H 4290H ;; 当当AXAX为带符号数时,为带符号数时,AX/2AX/2应用应用 SAR AX,1 SAR AX,1 结果为结果为C290H C290H E E、、标号是程序中指令的符号地址,要注意和变量标号是程序中指令的符号地址,要注意和变量 ( (数据符号数据符号) )的区别 如:定义如:定义VARVAR为一变量,为一变量,LABLAB为一标号为一标号 JMP LABJMP LAB指令的转移地址为指令的转移地址为LABLAB JMP VAR JMP VAR为一非法指令。
为一非法指令 四、举例四、举例 1 1、指出下列指令的错误、指出下列指令的错误 A A、、MOV AH,BX MOV AH,BX B B、、MOV [BX],[SI] MOV [BX],[SI] C C、、MOV AX,[SI][DI] MOV AX,[SI][DI] D D、、MOV [BX][SI],ES:AX MOV [BX][SI],ES:AX E E、、MOV BYTE PTR[BX],1000HMOV BYTE PTR[BX],1000H F F、、MOV CS,AX MOV CS,AX G G、、MOV DS,BP MOV DS,BP H H、、INC [AX] INC [AX] 2 2、求双字长数、求双字长数DX:AXDX:AX的补码数的补码数 3 3、将、将DX:AXDX:AX中双字长数乘以中双字长数乘以2 / 2 / 除以除以2 2 4 4、两字节数相加、两字节数相加, ,设两字节数存于设两字节数存于BLBL、、DLDL中中, , 和存于和存于AXAX中。
中 A A、、无符号数无符号数 B B、、带符号数带符号数 5 5、比较、比较AX,BX,CXAX,BX,CX中带符号数大小,中带符号数大小, 将最大数存于将最大数存于AXAX中 6 6、已知内存中有一以、已知内存中有一以ARRAYARRAY为首址的为首址的100100个字的数组个字的数组, , 试将数组中每个数加试将数组中每个数加1 1 7 7、试将、试将ELEMSELEMS中的中的100100个字节数据的位置颠倒过来个字节数据的位置颠倒过来 1 X>0 1 X>0 8 8、设、设 Y = 0 X=0 Y = 0 X=0 已知一个已知一个8 8位带符号数存于位带符号数存于X X单单 -1 X<0 -1 X<0 元中试求元中试求Y Y值存于值存于ALAL中。
中 9 9 、、有有3 3个数存于个数存于TABTAB为首址单元中,试将中值存于为首址单元中,试将中值存于A A中中 设数为带符号数设数为带符号数 10 10 、有、有3 3个无符号字节数存于个无符号字节数存于BUFBUF为首址单元中为首址单元中, ,若若3 3个个 数都不为数都不为0,0,则求则求3 3个数之和个数之和, ,存于以存于以BUFBUF++3 3为首址为首址 单元中;若单元中;若3 3个数有个数有1 1个为个为0,0,则将其它则将其它2 2个单元清零个单元清零 11 11 、设有、设有5050个个ASCLLASCLL字符存于字符存于BUFBUF为首址单元中,求出为首址单元中,求出 字符串中字符串中A A字符的个数存于字符的个数存于DLDL中,中,并将并将A A字符的地字符的地 址顺序存于以址顺序存于以ADRYADRY为首址的单元中。
为首址的单元中 12 12 、设有、设有5050个个ASCLLASCLL字符存于字符存于STGSTG为首址单元中,求出为首址单元中,求出 字符串中字符串中0-90-9字符的个数存于字符的个数存于DLDL中,中,并将并将0-90-9字符字符 顺序存于以顺序存于以BUFBUF为首址的单元中为首址的单元中。