780 likes | 926 Views
操作码 操作数 ... 操作数. 第三章寻址方式与指令系统. 指令系统 : 一组指令集. 指令:. 一地址指令: INC AX DEC CX 二地址指令: MOV AX, [2000H] ADD AH, BL. 寻址方式 : 取得操作数地址的方式或 指令中用于说明操作数所在地址的表示方法。. 3.1 寻址方式. 一 . 立即寻址方式 格式: n ; n 为一常数(立即数)
E N D
操作码 操作数 ... 操作数 第三章寻址方式与指令系统 指令系统:一组指令集 指令: 一地址指令: INC AX DEC CX 二地址指令: MOV AX, [2000H] ADD AH, BL 寻址方式:取得操作数地址的方式或指令中用于说明操作数所在地址的表示方法。
3.1 寻址方式 一. 立即寻址方式 格式:n;n为一常数(立即数) 特点:n本身是需要寻找的操作对象。 它紧跟指令存于内存代码段中。 例: MOV BX ,10 MOV AH , ‘A’ MOV AX , 3064H
: MOV 64H 30H : CPU : AX AH AL 低 高 代码段 内存: 注:•立即数只能作双操作数指令的源操作数,不能作目的 操作数。 •立即数不能作单操作数指令的操作数。 如: MOV 100H , AX × INC 50× •立即数送入目的操作数中,注意溢出 如:MOV AL , - 90H ×
二. 直接寻址方式 •格式: 段寄存器:[EA](其中:段寄存器为 DS,ES,SS之一) 或含有变量的地址表达式。 •特点: •操作数的地址偏移量EA,或变量地址表达式的EA直接包含在指令中,与操作码一起放在代码段中。 •操作数对象一般不作特别说明,存放在当前数据段中, 其物理地址求法为:(DS) 0000 + EA 4 例:MOV AX,DS:[2000H ] ;((DS)+2000H) AX 设执行前(DS) = 3000H 4 (32000H)=2415H 则执行后(32000H)字AX 即(AX)=2415H 若MOV AL,DS :[2000H] 则 (32000H)字节AL 即(AL)=15H
代 码 段 DS 3000H : MOV 0000 00H 4 20H + : : 15H32000H 24H 32001H : 这说明: •段寄存器:[EA]这种直接寻址 方式没有类型; •含有变量地址表达式的形式 有类型,其类型由变量类型 决定。 数 据 段 内存 例:MOV AX , ES:[2000H] ; ((ES)+2000H) AX段跨越符 4MOV SS : [1000H] , BX ; (BX)(SS)+1000H4 MOV BUF, AX MOV [BUF] , AX
三、 寄存器寻址方式 寄存器寻址方式*— 操作数在指定的寄存器中 MOV AX, BX MOV AL, BH * 字节寄存器只有 AH AL BH BL CH CL DH DL * SRC 和 DST的字长一致 MOV AH, BX * CS不能用MOV指令改变 MOV CS, AX
四、寄存器间接寻址方式 格式:[R];其中R为BX,BP,SI,DI之一,不允许是其它寄存器。 特点:操作对象在内存中,操作对象的EA在BX,BP,SI,DI之 一中。(不在内存) 即:EA= (BX) (BP) (SI) (DI) 注:(1)若选择[BX],[SI],[DI]之一,且缺省段跨越符,则对象在当前的数据段中;
例:MOV AX,[BX] ;((DS)+(BX)) AX 4 若执行前 (DS)=2000H,(BX)=1000H : MOV AX , [BX] DS BX : : 4 0A0H 21000H + 50H 21001H : 2000H 1000H 数 据 段 AX 50H 0A0H 内存 (2)若缺省段跨越符, 且BP作间址寄存器,则对象存放在当前堆栈段中。 如:MOV BX,[BP] ;((SS)+(BP)) BX 4
(3)若指定段跨越符,则不管BP,BX,SI,DI之一作 变址器,都取相应段中数据。 如:MOV ES:[BP],AX ;(AX) (ES)+(BP) MOV AX,ES:[BX] ;((ES)+(BX)) AX 4 注:•间址器一定要是BP,BX,SI,DI之一 如:MOV CX,[AX] × •间接寻址方式表示对象的地址,并不能表示对 象的类型。
五. 相对寻址方式 格式:X[R] ;其中R为BX,BP,SI,DI之一。 X为一整常数或变量地址表达式。 特点:•操作对象在内存中 •EA为R的内容和X之和(即:X在代码段中,EA另一部 分在R中)。 EA= X+(SI) X+(DI) X+(BX) X+(BP) (DS)+ (SI)+X 4 (DI)+X (BX)+X 缺省段跨越符的物理地址 (SS)+(BP)+X 4
例:MOV CX,-6[BX] ;((DS)+(BX)-6) CX 设执行前 : (BX)=16H,(DS)=2000H,(20010H)=3789H 执行: : DS BX MOV CX OFFH OFAH + : 89H 20010H 37H 20011H : 代 码 段 2000H 16H -6 数 据 段 执行后(CX)=3789H, 其他寄存器内容不变。 例:MOV [BX+7],BX MOV DL,4[AX] × MOV BX,ES:ABC[SI] ;其中ABC为变量名,它表示变量 到所在段段首址的EA
六. 基址变址寻址方式 格式:[BR+IR] 其中:BR为基址寄存器,仅为BX和BP之一; IR为变址寄存器,仅为SI和DI之一。 特点:•操作对象在内存中。 •操作数的EA= (BX)+(SI)或(DI) (BP)+(SI)或(DI) •缺省段跨越符,其物理地址:(DS)+(BX)+(SI)或DI 4 (SS)+(BP)+(SI)或DI 4 例:MOV AX,[BX+BP] × MOV [SI+DI],CX × MOV [BX+CX],AX ×
例:MOV AX,[BX+DI]MOV AX,[BX][DI] 设执行前 (DS)=2100H (BX)=158H (DI)=10A5H (221FDH)=1234H EA=158H+10A5H=11FDH ∴物理地址:(DS)+EA=21000H+11FDH=221FDH 4 : DS BX DI 指令码 : 4 : + 34H 221FDH 12H 221FEH : 2100H 158H 10A5H 数 据 段 执行后:(AX)=1234H 当 MOV AL,[BX+DI];(221FDH)字节=34HAL 即(AL)=34H
七.相对基址变址寻址方式 格式:X[BR+IR] 其中:BR为基址器,仅为BX,BP之一; IR为变址器,仅为SI,DI之; X为一整常数或已定义的变量名。 特点: •对象在内存中; •操作数的EA= (BX)+(SI)或(DI)+X (X为变量名,则该变量名 到所在段的段首的字节 个数) (BP)+(SI)或(DI)+X
例:MOV AX,8[BX+SI] 执行前:(AX)=45H,(BX)=30H,(SI)=20H,(DS)=1000H (10058H)=99H DS BXSI + 10058H 10059H 执行后:(10058H)AX (AX)=99H : 指令码 8 : : 99H 0 : 1000H 30H 20H 代 码 段 数 据 段 例:MOV DX,M[BX+DI] ;设M已定义在数据段中 MOV SS:[BX+SI+7],CX ;物理地址=(SS)+(BX)+(SI)+7 4
习题: 1.分别指出下列指令中源操作数和目的操作数的寻址方式 ① MOV SI,’C’ ④ ADD CX,DS:[10H] ② MOV [BX+3],AX ⑤ MOV DL,[BP+DI] ③ SUB [BX][SI],AL ⑥ MOV [BX],AX 2.指出下列各寻址中的错误,并说明原因 ① MOV 100H,AX ④ MOV [BX+BP],[SI] ② MOV [CX],AH ⑤ ADD AX,[DI+SI] ③ ADD AX,BL ⑥ MOV AH,1000 ⑦ POP CL 3.已(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=0ADH,(BX)=100H, (BP)=10H,试指出下列源操作数的寻址方式是什么?其物理地址值是什? (1)MOV AX,DS:[100H] (2)MOV BX,[SI] (3)MOV CX,[BX+10H] (4)MOV AX,[BX][SI] (5)MOV CL,[BP+4] (6)MOV CH,ES:[BP+SI]
3.2 指令系统 数据传送指令 算术运算指令 逻辑运算指令 串操作指令 程序转移指令 处理机控制指令 注意:1. 指令的基本功能 2. 指令的执行对标志位的影响 3. 对寻址方式或寄存器使用的限制和隐含使用的情况
一.数据传送指令 功能:负责把数据,地址或立即数送到寄存器或内存单元中。 1.传送指令:MOV 格式:MOV DEST,SC 功能:(SRC) DEST • 立即数传送到通用寄存器或存储单元 • MOV CL,25H ;字节传送 • MOV AX,4321H ;字传送 • MOV DA_BYTE,34H ;字节传送 • MOV DA_WORD,4321H ;字传送 • 注意:立即数只能出现在源操作数位置,不能作为目的操作数
寄存器之间的传送 • MOV BL,DL ;字节传送 • MOV DX,CX ;字传送 • MOV ES,AX ;通用寄存器与段寄存器之间传送 • 注意:段寄存器CS仅只能作源操作数,不能作目的操作数。
寄存器与存储单元之间的传送 • MOV DL,DA_BYTE ;字节传送 • MOV AX,DA_WORD ;字传送 • MOV DA_BYTE,CL ;字节传送 • MOV DA_WORD,DX ;字传送 • 注意:两个存储单元之间不能用一条MOV指令直接完成数据传送。 • 立即数不能直接传送给段寄存器,且段寄存器之间亦不能进行直接传送。
立即数 通用寄存器AX BX CX DXBP SP SI DI 存储器 CS 段寄存器 DS ES SS 图3.7 MOV指令的数据传送方向
二.交换指令 格式:XCHG DEST,SRC 功能:(SRC)↔(DEST) 例:XCHG AL,AH ;(AL) ↔(AH) 注:SRC或DEST均不能为立即数
三.标志寄存器传送指令 • 标志送AH指令: LAHF • 执行操作: (AH) (PSW的低字节) • AH送标志寄存器指令: SAHF • 执行操作: (PSW的低字节) (AH) • 标志进栈指令: PUSHF • 执行操作: (SP) (SP) - 2 • ( (SP)+1, (SP) ) (PSW) • 标志出栈指令: POPF • 执行操作: (PSW) (SP)+1, (SP)) • (SP) (SP) + 2 • * 影响标志位
四.地址传送指令 有效地址送寄存器指令: LEA REG, SRC 执行操作: (REG) SRC 指针送寄存器和DS指令: LDS REG, SRC 执行操作: (REG) (SRC) (DS) (SRC+2) 4个相继字节 寄存器(通常是SI)、DS 指针送寄存器和ES指令: LES REG, SRC 执行操作: (REG) (SRC) (ES) (SRC+2) 4个相继字节 寄存器(通常是DI)、ES
例:LEA BX, [BX+SI+0F62H] 例:LDS SI, [10H] 例:LES DI, [BX] 例: MOV BX, TABLE ; (BX)=0040H MOV BX, OFFSET TABLE ; (BX)=1000H LEA BX, TABLE ; (BX)=1000H LDS BX, TABLE ; (BX)=0040H ; (DS)=3000H LES BX, TABLE ; (BX)=0040H ; (ES)=3000H TABLE (DS):1000H 40 H 00 H 00 H 30 H • 注意: • *不影响标志位 • *REG不能是段寄存器 • *SRC必须为存储器寻址方式
(DS)=F000H (BX) 30 H F0040 TABLE 31 H F0041 (AL) = 3 32 H F0042 33 H F0043 五.换码指令 换码指令:XLAT 或 XLAT OPR 执行操作:(AL) ( (BX) + (AL) ) 例:MOV BX, OFFSET TABLE ; (BX)=0040H MOV AL, 3 XLAT TABLE 指令执行后 (AL)=33H 注意: *不影响标志位 * 字节表格(长度不超过256) 首地址 (BX) *需转换代码 (AL)
3.2.2 算术指令 • 加法指令 • 减法指令 • 乘法指令 • 除法指令 • 十进制调整指令
加法指令 加法指令: ADD DST, SRC 执行操作: (DST) (SRC) + (DST) 带进位加法指令: ADC DST, SRC 执行操作: (DST) (SRC) + (DST) + CF 加1指令: INC OPR 执行操作: (OPR) (OPR) + 1 注意: *除INC指令不影响CF标志外,均对条件标志位 有影响。
1 结果为负 0 否则 1 结果为0 0 否则 1 和的最高有效位有向高位的进位 0 否则 1 两个操作数符号相同,而结果符号与之相反 0 否则 SF= ZF= CF= OF= 加法指令对条件标志位(CF/OF/ZF/SF)的影响: CF位表示无符号数相加的溢出。 OF位表示带符号数相加的溢出。
无符号数溢出 带符号数和无符号数都不溢出 带符号数溢出 带符号数和无符号数都溢出 0 0 0 0 0 1 1 1 + 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 带:(+7)+(-5)=+2 OF=0 无:7+251=2 CF=1 0 0 0 0 0 1 0 0 + 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 带:(+4)+(+11)=+15 OF=0 无:4+11=15 CF=0 0 0 0 0 1 0 0 1 + 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 带:(+9)+(+124)=-123 OF=1 无:9+124=133 CF=0 1 0 0 0 0 1 1 1 + 1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 带:(-121)+(-11)=+124 OF=1 无:135+245=124 CF=1 n=8bit 带符号数(-128~127) 无符号数(0~255)
例:双精度数的加法 • (DX)= 0002H (AX)= 0F365H • (BX)= 0005H (CX)= 0E024H • 指令序列 (1) ADD AX, CX • (2) ADC DX, BX • (1) 执行后,(AX)= 0D389H CF=1 OF=0 • SF=1 ZF=0 • (2) 执行后,(DX)= 0008H CF=0 OF=0 • SF=0 ZF=0
减法指令 减法指令: SUB DST, SRC 执行操作: (DST) (DST) - (SRC) 带借位减法指令: SBB DST, SRC 执行操作: (DST) (DST) - (SRC) - CF 减1指令: DEC OPR 执行操作: (OPR) (OPR) - 1 求补指令: NEG OPR 执行操作: (OPR) - (OPR) 比较指令: CMP OPR1, OPR2 执行操作: (OPR1) - (OPR2) 注意: *除DEC指令不影响 CF标志外,均对条 件标志位有影响。
1 被减数的最高有效位有向高位的借位 0 否则 1 两个操作数符号相反,而结果的符号与减数相同 0 否则 1 减法转换为加法运算时无进位 0 否则 CF= OF= CF= 减法指令对条件标志位(CF/OF/ZF/SF)的影响: 或 CF位表示无符号数减法的溢出。 OF位表示带符号数减法的溢出。 NEG指令对CF/OF的影响: CF位:操作数为0时,求补的结果使CF=0,否则CF=1。 OF位:字节运算对-128求补或字运算对-32768求补时OF=1, 否则OF=0。
例:x、y、z均为双精度数,分别存放在地址为X, X+2; • Y, Y+2;Z, Z+2的存储单元中,用指令序列实现 • w x+y+24-z ,并用W, W+2单元存放w。 • MOV AX, X • MOV DX, X+2 • ADD AX, Y • ADC DX, Y+2 ; x+y • ADD AX, 24 • ADC DX, 0 ; x+y+24 • SUB AX, Z • SBB DX, Z+2 ; x+y+24-z • MOV W, AX • MOV W+2, DX ; 结果存入W, W+2单元
乘法指令 无符号数乘法指令: MUL SRC 执行操作:字节操作数 (AX) (AL) * (SRC) 字操作数 (DX, AX) (AX) * (SRC) 带符号数乘法指令: IMUL SRC 注意: * AL(AX)为隐含的乘数寄存器。 *AX(DX,AX)为隐含的乘积寄存器。 *SRC不能为立即数。 * 除CF和OF外,对条件标志位无定义。
00 乘积的高一半为零 11 否则 MUL指令: CF/OF = 00 乘积的高一半是低一半的符号扩展 11 否则 IMUL指令: CF/OF = 乘法指令对CF/OF的影响: 例:(AX) = 16A5H,(BX) = 0611H (1) IMUL BL ; (AX) (AL) * (BL) ; A5*11 5B*11=060B F9F5 ; (AX) = 0F9F5HCF=OF=1 (2) MUL BX ; (DX, AX) (AX) * (BX) ; 16A5*0611=0089 5EF5 ; (DX) = 0089H (AX) = 5EF5HCF=OF=1
除法指令 无符号数除法指令: DIV SRC 执行操作: 字节操作 (AL) (AX) / (SRC) 的商 (AH) (AX) / (SRC) 的余数 字操作 (AX) (DX, AX) / (SRC) 的商 (DX) (DX, AX) / (SRC) 的余数 带符号数除法指令: IDIV SRC 注意: * AX(DX,AX)为隐含的被除数寄存器。 *AL(AX)为隐含的商寄存器。 *AH(DX)为隐含的余数寄存器。 *SRC不能为立即数。 *对所有条件标志位均无定义。
符号扩展指令: CBW AL AX 执行操作: 若(AL)的最高有效位为0,则(AH)= 00H 若(AL)的最高有效位为1,则(AH)= 0FFH CWD AX (DX,AX) 执行操作:若(AX)的最高有效位为0,则(DX)= 0000H 若(AX)的最高有效位为1,则(DX)= 0FFFFH 例:(AX)=0BA45H CBW ; (AX)=0045H CWD ; (DX)=0FFFFH (AX)=0BA45H 注意: *无操作数指令 * 隐含对AL或AX进行符号扩展 * 不影响条件标志位
例:x,y,z,v均为16位带符号数,计算(v-(x*y+z-540))/x例:x,y,z,v均为16位带符号数,计算(v-(x*y+z-540))/x • MOV AX, X • IMUL Y ; x*y • MOV CX, AX • MOV BX, DX • MOV AX, Z • CWD • ADD CX, AX • ADC BX, DX ; x*y+z • SUB CX, 540 • SBB BX, 0 ; x*y+z-540 • MOV AX, V • CWD • SUB AX, CX • SBB DX, BX ; v-(x*y+z-540) • IDIV X ; (v-(x*y+z-540))/x
十进制调整指令 • BCD码:用二进制编码的十进制数,又称二--十进制数 • 压缩的BCD码:用4位二进制数表示1位十进制数 • 例:(59)10 =(0101 1001)BCD • 非压缩的BCD码:用8位二进制数表示1位十进制数 • 例:(59)10 =(0000 0101 0000 1001)BCD • 数字的ASCII码是一种非压缩的BCD码 • DIGIT ASCII BCD • 0 30H 0011 0000 • 1 31H 0011 0001 • 2 32H 0011 0010 • … … … • 9 39H 0011 1001
PAKED 90H UNPAK 00H 35H 09H 05H 03H 例:写出(3590)10的压缩BCD码和非压缩BCD码,并 分别把它们存入数据区PAKED和UNPAK。 压缩BCD: (3590)10=(0011 0101 1001 0000)BCD 非压缩BCD: (3590)10=(00000011 00000101 00001001 00000000)BCD
压缩的BCD码调整指令 19 压缩BCD: 0001 1001 + 08 + 0000 1000 问题的提出: 27 0010 0001 + 110 (0010 0111)BCD AF=1 加法的十进制调整指令:DAA 执行操作:(AL) (AL)压缩BCD 减法的十进制调整指令:DAS 执行操作:(AL) (AL)压缩BCD 注意: *隐含的操作寄存器为AL *紧接在加减指令之后使用 * 影响条件标志位 (对OF无定义)
调整方法: AF=1或(AL)0~3=A~F,则(AL) (AL) 06H,AF=1 CF=1或(AL)4~7=A~F,则(AL) (AL) 60H,CF=1 ( DAA做‘+’, DAS做‘-’ ) 例: DATA SEGMENT BCD1 DB 34H, 18H ; (1834)BCD BCD2 DB 89H, 27H ; (2789)BCD BCD3 DB 2 DUP (?) DATA ENDS (1) BCD3 BCD1 + BCD2 ; (4623)BCD (2) BCD3 BCD1 - BCD2 ; (9045)BCD= -955
(1) MOV AL, BCD1 ; (AL)=34H ADD AL, BCD2; (AL)=34+89=BDH DAA; (AL)=BD+60+06=23H AF=CF=1 MOV BCD3, AL ; (BCD3)=23H MOV AL, BCD1+1 ; (AL)=18H ADC AL, BCD2+1 ; (AL)=18+27+1=40HAF=1 CF=0 DAA ; (AL)=40+06=46H MOV BCD3+1, AL ; (BCD3+1)=46H (2) MOV AL, BCD1 ; (AL)=34H SUB AL, BCD2 ; (AL)=34-89=ABH DAS ; (AL)=AB-60-06=45H AF=CF=1 MOV BCD3, AL ; (BCD3)=45H MOV AL, BCD1+1 ; (AL)=18H SBB AL, BCD2+1 ; (AL)=18-27-1=F0H DAS ; (AL)=F0-60=90H MOV BCD3+1, AL ; (BCD3+1)=90H
非压缩的BCD调整指令 • 加法调整指令:AAA (AL) (AL)非压缩BCD • 减法调整指令:AAS (AL) (AL)非压缩BCD • 注意: *隐含的操作寄存器为AL • *紧接在加减指令之后使用 • * 除AF、CF外,对其它条件标志位无定义 • 调整方法: • 若(AL)0~3=0~9,且AF=0,则(AL)4~7 = 0,AF CF=0 • 若(AL)0~3=A~F,或AF=1,则(AL) (AL)±6,(AL)4~7=0 • (AH) (AH)±1,AF CF=1 ( AAA做‘+’, AAS做‘-’ )
乘法调整指令:AAM (AL) (AX)非压缩BCD 注意: *隐含的操作寄存器为AL *紧接在MUL指令之后使用 * 对OF、CF、AF无定义 调整方法: (AL)除以0AH,商 (AH),余数 (AL) 除法调整指令:AAD 被除数(AX) = (0000 xxxx 0000 xxxx)非压缩BCD 除数 = (0000 xxxx)非压缩BCD 在DIV指令之前: (AL)2 0AH ×(AH)+(AL) (AH)2 0
例:(AX)=0504H (BL)=03H (1) (AL)*(BL) MUL BL ; (AX)=000CH AAM ; (AH)=01H (AL)=02H (2) (AX)/(BL) AAD ; (AH)=00H (AL)=36H DIV BL ; (AH)=00H (AL)=12H AAM ; (AH)=01H (AL)=08H
逻辑运算指令 • 移位指令
逻辑非指令:NOT OPR * OPR不能为立即数 执行操作: (OPR) (OPR) * 不影响标志位 逻辑与指令:AND DST, SRC 执行操作: (DST) (DST) (SRC) 逻辑或指令:OR DST, SRC 执行操作: (DST) (DST) (SRC) 异或指令: XOR DST, SRC 执行操作: (DST) (DST) (SRC) 测试指令: TEST OPR1, OPR2执行操作: (OPR1) (OPR2) CF OF SF ZF PF AF 0 0 * * * 无定义 根据运算结果设置
例:屏蔽AL的0、1两位 • AND AL, 0FCH • 例:置AL的第5位为1 • OR AL, 20H • 例:使AL的0、1位变反 • XOR AL, 3 • 例:测试某些位是0是1 • TEST AL, 1 • JZ EVEN * * * * * * * * AND 1 1 1 1 1 1 0 0 * * * * * * 0 0 * * * * * * * * OR 0 0 1 0 0 0 0 0 * * 1 * * * * * * * * * * * * * XOR 0 0 0 0 0 0 1 1 * * * * * * * *