1、1,教学重点,第3章是本课程的一个关键内容,是程序设计的基础 难点是各种寻址方式 基础是熟悉寄存器组 重点是掌握8086常用指令的功能及应用,第三章 80x86的指令系统和寻址方式,2,指令系统:计算机的指令系统就是指该计算机能够执行的全部指令的集合。(一组指令集)。指令的一般格式:,指令由操作码和操作数两部分组成 操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 操作数是指令执行的参与者,即各种操作的对象 有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数,3,每种指令的操作码: 用一个唯一的助记符表示(指令功能
2、的英文缩写) 指令中的操作数: 可以是一个具体的数值 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址,指令举例: MOV AX,BX SUB BX,123 ADD AX,3 AND DL,80H MUL BL PUSH DX CLD CBW,4,寻址方式:取得操作数地址的方式,指令系统设计了多种操作数的来源 寻找操作数的过程就是操作数的寻址 操作数采取哪一种寻址方式,会影响机器运行的速度和效率,如何寻址一个操作数对程序设计很重要,与数据有关的寻址方式 与转移地址有关的寻址方式,5,3.1 IBM PC机的寻址方式,与数据有关的寻址方式 与转移地址有关的寻址方式,3.1.1 与数据有关
3、的寻址方式以 MOV 指令为例,操作码 操作数1,操作数2 ;注释 操作数2,称为源操作数 src,它表示参与指令操作的一个对象 操作数1,称为目的操作数 dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果 分号后的内容是对指令的解释,6,MOV dest,src ;destsrc MOV指令的功能是将源操作数src传送至目的操作数dest,例如: MOV AL,05H ;AL05H MOV BX,AX ;BXAX MOV AX,SI ;AXDS:SI MOV AX,BP+06H ;AXSS:BP+06H MOV AX,BX+SI ;AXDS:BX+SI,7,1. 立即寻
4、址方式* 操作数在指令中给出MOV AL, 5MOV AX, 3064H * 只能用于SRC字段 * SRC 和 DST的字长一致 MOV AH, 3064H,8,2. 寄存器寻址方式* 操作数在指定的寄存器中MOV AX, BXMOV AL, BH* 字节寄存器只有 AH AL BH BL CH CL DH DL * SRC 和 DST的字长一致 MOV AH, BX * CS不能用MOV指令改变 MOV CS, AX,9,3. 直接寻址方式* 有效地址EA由指令直接给出有效地址EA:操作数的偏移地址物理地址PA = 16d (DS) + EA例:MOV AX, 2000HEA=2000H,
5、 假设(DS)=3000H, 那么(PA)=32000H例:操作数地址可由变量(符号地址)表示MOV AH, VALUE ( VALUE DB 10 ),50,30,32000,AH AL,30,50,(AX) = 3050H,10,3. 直接寻址方式* * 隐含的段为数据段 DS * 可使用段跨越前缀MOV AX, ES :2000H * 使用变量时,要注意变量的属性 VALUE DB 10 MOV AX, VALUE MOV AX, WORD PTR VALUE * 适于处理单个变量,11,4. 寄存器间接寻址方式* EA在基址寄存器 (BX/BP)或变址寄存器(SI/DI)中BX, SI
6、, DI (DS) 物理地址 = 16d (DS) + BP (SS)物理地址 = 16d (SS) + (BP)MOV AX, BX PA = 16d (DS) + (BX)MOV AX, ES:BX PA = 16d (ES) + (BX)MOV AX, BP PA = 16d (SS) + (BP),(BX) (SI) (DI),12,4. 寄存器间接寻址方式* 不允许使用AX、CX、DX存放EA MOV AX, CX * SRC 和 DST的字长一致 MOV DL, BX ; BX指示一个字节单元MOV DX, BX ; BX指示一个字单元 * 适于数组、字符串、表格的处理,13,5.
7、 寄存器相对寻址方式*例: MOV AX, COUNTSI 或 MOV AX, COUNT+SI假设(DS)=3000H, (SI)=2000H, COUNT=3000H那么 PA = 35000H 假设(35000H)=1234H, 那么 (AX)=1234H * 适于数组、字符串、表格的处理,有效地址 =,(BX) (BP) (SI) (DI),+,8位 16位,位移量,14,6. 基址变址寻址方式*MOV AX, BXDI或 MOV AX, BX+DIMOV AX, ES:BXSI * 适于数组、字符串、表格的处理 * 必须是一个基址寄存器和一个变址寄存器的组合 MOV AX, BXBP
8、 MOV AX, SIDI,有效地址 =,(BX) (BP),+,(SI) (DI),15,7. 相对基址变址寻址方式*MOV AX, MASKBXSI或 MOV AX, MASKBX+SI或 MOV AX, MASK+BX+SI* 适于堆栈处理和数组处理,有效地址 =,(BX) (BP),+,(SI) (DI),+,8位 16位,位移量,16,例:编写一段显示字符串STRING的程序DATA SEGMENTSTRING DB HAPPY NEW YEAR!, 0DH , 0AH , $COUNT DW 17DATA ENDS (1)直接寻址mov dl, string ; mov dl, H
9、mov ah, 2 int 21h ; 显示字符Hmov dl, string+1 ; mov dl, Amov ah, 2int 21h ; 显示字符A.,17,(2)寄存器间接寻址mov cx, count ; mov cx, 17 mov bx, offset string ; string的偏址 bxnext: mov dl, bx mov ah, 2int 21h ; 显示一个字符inc bxloop next ; 循环指令,(3)寄存器相对寻址mov cx, count ; mov cx, 17 mov si, 0 next: mov dl, stringsi ; mov dl,
10、string+si mov ah, 2int 21h ; 显示一个字符inc siloop next ; 循环指令,18,(4)基址变址寻址mov cx, count ; mov cx, 17 mov bx, offset string ; string的偏址 bxmov si, 0next: mov dl, bxsi ; mov dl, bx+si mov ah, 2int 21h ; 显示一个字符inc siloop next ; 循环指令(5)DOS显示字符串功能mov dx, offset string ; string的偏址 dx; lea dx, stringmov ah, 9in
11、t 21h ; 显示一串字符,19,3.1.2 与转移地址有关的寻址方式,用来确定 转移指令 及 CALL指令 的转向地址。,段内寻址段间寻址,段内直接寻址 段内间接寻址,段间直接寻址 段间间接寻址,以 转移(条件转移/无条件转移)指令 为例,段内:转移指令与转向的目标指令在同一代码段中,(CS)不变。 段间:转移指令与转向的目标指令在两个代码段中, (CS)变化。,20,1. 段内直接寻址转向的有效地址EA = 物理地址 = 16d (CS) + (IP)新例: JMP AGAIN(IP)当前 MOV BX, AXAGAIN: 例: JMP NEAR PTR NEXT 近转移 -32768
12、+32767JMP SHORT NEXT 短转移 -128 +127,(IP)当前 +位移量( 8bit / 16bit ),(IP)新,(IP)新,21,2. 段内间接寻址转向的有效地址EA是一个寄存器或存储单元的内容。 (可用除立即数以外的任何一种数据寻址方式得到)物理地址 = 16d (CS) + EA例: (BX)=1256H (SI)=528EH TABLE=20A2H (DS)=2000H (232F8H)=3280H (264E4H)=2450HJMP BX ; (IP)=1256HJMP TABLEBXJMP WORD PTR TABLEBX ; (IP)=3280HJMP B
13、XSIJMP WORD PTR BXSI ; (IP)=2450H,22,3. 段间直接寻址用指令中提供的转向段地址和偏移地址取代CS和IP。物理地址 = 16d (CS) + (IP) 例:,code1 segmentjmp far ptr next code1 ends,code2 segment next: .code2 ends,23,4. 段间间接寻址用存储器中的两个相继字的内容取代CS和IP。 (存储单元的地址可用除立即数和寄存器以外的任何一种数据寻址方式得到)物理地址 = 16d (CS) + (IP) 例: JMP DWORD PTR INTERS+BX,24,3.3 IBM
14、PC机的指令系统, 数据传送指令 算术指令 逻辑指令 串处理指令 控制转移指令 处理机控制指令,注意:1. 指令的基本功能2. 指令的执行对标志位的影响3. 对寻址方式或寄存器使用的限制和隐含使用的情况,25,3.3.1 数据传送指令 通用数据传送指令 累加器专用传送指令 地址传送指令 标志寄存器传送指令,26, 通用数据传送指令传送指令: MOV DST, SRC执行操作: (DST) (SRC)注意: * DST不能是CS* 不影响标志位* DST、SRC不同时为段寄存器 MOV DS, ES* 立即数不能直接送段寄存器 MOV DS, 2000H,27,例: MOV AX, DATA_S
15、EGMOV DS, AX例: MOV AL, E ; MOV AL, 45H例: MOV BX, OFFSET TABLE例: MOV AX, YBPSI,返回,28,进栈指令: PUSH SRC执行操作: (SP) (SP) - 2( (SP)+1, (SP) ) (SRC)出栈指令: POP DST执行操作: (DST) (SP)+1, (SP)(SP) (SP) + 2堆栈:“先进后出”的存储区,存在于堆栈段中,SP在任何时候都指向栈顶。注意: * 堆栈操作必须以字为单位。 * 不影响标志位* 不能用立即寻址方式 PUSH 1234H* DST不能是CS POP CS,29,例: 假设
16、(AX) = 2107 H , 执行 PUSH AX,(SP),低地址,高地址,(SP),07H21H,低地址,高地址,进栈方向,* *,* *,* *,* *,PUSH AX 执行前,PUSH AX 执行后,30,例: POP BX,(SP),低地址,高地址,(SP),07H21H,低地址,高地址,出栈方向,07H 21H,(BX) = 2107H,POP BX 执行前,POP BX 执行后,* *,* *,* *,* *,31,例: PUSH DSSUB AX, AXPUSH AXRET例: PUSH AX PUSH BX POP BX POP AX,;其间用到AX和BX寄存器,32,交换
17、指令: XCHG OPR1, OPR2执行操作: (OPR1) (OPR2)注意: * 不影响标志位* 不允许使用段寄存器例:XCHG BX, BP+SIXCHG AL, BH,33, 累加器专用传送指令(只限于使用AX或AL)输入指令(I/O CPU)长格式: IN AL, PORT (字节)IN AX, PORT (字)执行操作:(AL) (PORT) (字节)(AX) (PORT+1, PORT)(字)短格式: IN AL, DX (字节)IN AX, DX (字)执行操作:(AL) ( (DX) ) (字节)(AX) ( (DX)+1, (DX) )(字),34,输出指令(CPU I/
18、O)长格式: OUT PORT, AL (字节)OUT PORT, AX (字) 执行操作:(PORT) (AL) (字节)(PORT+1, PORT) (AX)(字)短格式: OUT DX, AL (字节)OUT DX, AX (字) 执行操作:( (DX) ) (AL) (字节)( (DX)+1, (DX) ) (AX)(字),35,注意: * 不影响标志位 * 前256个端口号00HFFH可直接在指令中指定(长格式) * 如果端口号 256,端口号 DX(短格式)例: IN AX, 28H ; MOV DX, 28H; IN AX, DXMOV DATA_WORD, AX例: MOV D
19、X, 3FCH 例:OUT 5, ALIN AX, DX例:测试某状态寄存器(端口号27H)的第2位是否为1IN AL, 27HTEST AL, 00000100BJNZ ERROR ;若第2位为1,转到ERROR处理,36,例 8.1 Sound程序 ( page 204 ),mov dx, 100in al, 61hand al, 11111100b sound: xor al, 2out 61h, almov cx, 140h wait1: loop wait1dec dxjne sound,设备控制寄存器,端口61H,1 / 0 0,控制其它外部设备,与门,放大器,2号定时器门控,1
20、0,37,换码指令:XLAT 或 XLAT OPR 执行操作:(AL) ( (BX) + (AL) )例:MOV BX, OFFSET TABLE ; (BX)=0040HMOV AL, 3XLAT TABLE指令执行后 (AL)=33H注意:* 不影响标志位 * 字节表格(长度不超过256)首地址 (BX) * 需转换代码 (AL),38, 地址传送指令有效地址送寄存器指令: LEA REG, SRC执行操作: (REG) SRC指针送寄存器和DS指令: LDS REG, SRC执行操作: (REG) (SRC)(DS) (SRC+2)4个相继字节 寄存器(通常是SI)、DS指针送寄存器和E
21、S指令: LES REG, SRC执行操作: (REG) (SRC)(ES) (SRC+2)4个相继字节 寄存器(通常是DI)、ES,39,例:LEA BX, BX+SI+0F62H 例:LDS SI, 10H 例:LES DI, BX 例:,(DS):1000H 40 H,00 H,00 H,30 H,TABLE,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
22、; (BX)=0040H; (ES)=3000H,注意: * 不影响标志位* REG不能是段寄存器* SRC必须为存储器寻址方式,40, 标志寄存器传送指令标志送AH指令: LAHF执行操作: (AH) (PSW的低字节)AH送标志寄存器指令: SAHF执行操作: (PSW的低字节) (AH)标志进栈指令: PUSHF执行操作: (SP) (SP) - 2( (SP)+1, (SP) ) (PSW)标志出栈指令: POPF执行操作: (PSW) (SP)+1, (SP)(SP) (SP) + 2 * 影响标志位,41,3.3.2 算术指令 加法指令 减法指令 乘法指令 除法指令 十进制调整指令
23、,42, 加法指令加法指令: ADD DST, SRC 执行操作: (DST) (SRC) + (DST)带进位加法指令: ADC DST, SRC 执行操作: (DST) (SRC) + (DST) + CF加1指令: INC OPR 执行操作: (OPR) (OPR) + 1,注意: * 除INC指令不影响CF标志外,均对条件标志位有影响。,43,加法指令对条件标志位(CF/OF/ZF/SF)的影响:,CF位表示无符号数相加的溢出。OF位表示带符号数相加的溢出。,44,n=8bit 带符号数(-128127) 无符号数(0255),45,例:双精度数的加法(DX)= 0002H (AX)=
24、 0F365H(BX)= 0005H (CX)= 0E024H指令序列 (1) ADD AX, CX(2) ADC DX, BX(1) 执行后,(AX)= 0D389H CF=1 OF=0SF=1 ZF=0(2) 执行后,(DX)= 0008H CF=0 OF=0SF=0 ZF=0,46, 减法指令减法指令: SUB DST, SRC 执行操作: (DST) (DST) - (SRC)带借位减法指令: SBB DST, SRC 执行操作: (DST) (DST) - (SRC) - CF减1指令: DEC OPR 执行操作: (OPR) (OPR) - 1求补指令: NEG OPR 执行操作:
25、 (OPR) - (OPR)比较指令: CMP OPR1, OPR2 执行操作: (OPR1) - (OPR2),注意: * 除DEC指令不影响CF标志外,均对条件标志位有影响。,47,减法指令对条件标志位(CF/OF/ZF/SF)的影响:,CF位表示无符号数减法的溢出。 OF位表示带符号数减法的溢出。NEG指令对CF/OF的影响: CF位:操作数为0时,求补的结果使CF=0,否则CF=1。 OF位:字节运算对-128求补或字运算对-32768求补时OF=1,否则OF=0。,或,48,例:x、y、z均为双精度数,分别存放在地址为X, X+2;Y, Y+2;Z, Z+2的存储单元中,用指令序列实
26、现w x+y+24-z ,并用W, W+2单元存放w。MOV AX, XMOV DX, X+2ADD AX, YADC DX, Y+2 ; x+yADD AX, 24ADC DX, 0 ; x+y+24SUB AX, ZSBB DX, Z+2 ; x+y+24-zMOV W, AXMOV W+2, DX ; 结果存入W, W+2单元,49, 乘法指令无符号数乘法指令: MUL SRC执行操作:字节操作数 (AX) (AL) * (SRC)字操作数 (DX, AX) (AX) * (SRC)带符号数乘法指令: IMUL SRC,注意: * AL(AX)为隐含的乘数寄存器。* AX(DX,AX)为
27、隐含的乘积寄存器。* SRC不能为立即数。* 除CF和OF外,对条件标志位无定义。,50,乘法指令对CF/OF的影响:,例:(AX) = 16A5H,(BX) = 0611H(1) IMUL BL ; (AX) (AL) * (BL); A5*11 5B*11=060B F9F5; (AX) = 0F9F5H CF=OF=1(2) MUL BX ; (DX, AX) (AX) * (BX); 16A5*0611=0089 5EF5; (DX) = 0089H (AX) = 5EF5H CF=OF=1,51, 除法指令无符号数除法指令: DIV SRC执行操作: 字节操作 (AL) (AX) /
28、 (SRC) 的商(AH) (AX) / (SRC) 的余数字操作 (AX) (DX, AX) / (SRC) 的商(DX) (DX, AX) / (SRC) 的余数带符号数除法指令: IDIV SRC注意: * AX(DX,AX)为隐含的被除数寄存器。* AL(AX)为隐含的商寄存器。* AH(DX)为隐含的余数寄存器。* SRC不能为立即数。* 对所有条件标志位均无定义。,52,符号扩展指令:CBW AL AX执行操作: 若(AL)的最高有效位为0,则(AH)= 00H若(AL)的最高有效位为1,则(AH)= 0FFHCWD AX (DX,AX)执行操作:若(AX)的最高有效位为0,则(D
29、X)= 0000H若(AX)的最高有效位为1,则(DX)= 0FFFFH,注意: * 无操作数指令* 隐含对AL或AX进行符号扩展* 不影响条件标志位,例:(AX)=0BA45HCBW ; (AX)=0045HCWD ; (DX)=0FFFFH (AX)=0BA45H,53,例:x,y,z,v均为16位带符号数,计算(v-(x*y+z-540)/xMOV AX, X IMUL Y ; x*yMOV CX, AXMOV BX, DXMOV AX, ZCWDADD CX, AXADC BX, DX ; x*y+zSUB CX, 540 SBB BX, 0 ; x*y+z-540MOV AX, VC
30、WDSUB AX, CXSBB DX, BX ; v-(x*y+z-540)IDIV X ; (v-(x*y+z-540)/x,54, 十进制调整指令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
31、1001,55,例:写出(3590)10的压缩BCD码和非压缩BCD码,并分别把它们存入数据区PAKED和UNPAK。压缩BCD: (3590)10(0011 0101 1001 0000)BCD非压缩BCD:(3590)10(00000011 00000101 00001001 00000000)BCD,56,压缩的BCD码调整指令,加法的十进制调整指令:DAA 执行操作:(AL) (AL)压缩BCD减法的十进制调整指令:DAS 执行操作:(AL) (AL)压缩BCD,19 压缩BCD: 0001 1001,+ 08 + 0000 1000,27 0010 0001 + 110,(0010
32、0111)BCD,AF=1,问题的提出:,注意: * 隐含的操作寄存器为AL* 紧接在加减指令之后使用* 影响条件标志位(对OF无定义),57,调整方法:AF1或(AL)03AF,则(AL) (AL) 06H,AF1 CF1或(AL)47AF,则(AL) (AL) 60H,CF1( DAA做+, DAS做- )例: DATA SEGMENTBCD1 DB 34H, 18H ; (1834)BCDBCD2 DB 89H, 27H ; (2789)BCDBCD3 DB 2 DUP (?)DATA ENDS(1) BCD3 BCD1 + BCD2 ; (4623)BCD (2) BCD3 BCD1
33、- BCD2 ; (9045)BCD = -955,58,(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)=23HMOV AL, BCD1+1 ; (AL)=18H ADC AL, BCD2+1 ; (AL)=18+27+1=40H AF=1 CF=0DAA ; (AL)=40+06=46H MOV BCD3+1, AL ; (BCD3+1)=46H(2) MOV AL, BCD1 ; (AL)=34H SUB AL, B
34、CD2 ; (AL)=34-89=ABH DAS ; (AL)=AB-60-06=45H AF=CF=1 MOV BCD3, AL ; (BCD3)=45HMOV 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,59,非压缩的BCD调整指令加法调整指令:AAA (AL) (AL)非压缩BCD 减法调整指令:AAS (AL) (AL)非压缩BCD注意: * 隐含的操作寄存器为AL* 紧接在加减指令之后使用* 除AF、CF外,对其它条
35、件标志位无定义调整方法: 若(AL)03=09,且AF=0,则(AL)47 = 0,AF CF0 若(AL)03=AF,或AF=1,则(AL) (AL)6,(AL)470(AH) (AH)1,AF CF1,( AAA做+, AAS做- ),60,乘法调整指令:AAM (AL) (AX)非压缩BCD注意: * 隐含的操作寄存器为AL* 紧接在MUL指令之后使用* 对OF、CF、AF无定义 调整方法:(AL)除以0AH,商 (AH),余数 (AL)除法调整指令:AAD被除数(AX) = (0000 xxxx 0000 xxxx)非压缩BCD除数 = (0000 xxxx)非压缩BCD在DIV指令之
36、前:(AL)2 0AH (AH)+(AL)(AH)2 0,61,例:(AX)0504H (BL)03H(1) (AL)*(BL) MUL BL ; (AX)=000CHAAM ; (AH)=01H (AL)=02H(2) (AX)/(BL)AAD ; (AH)=00H (AL)=36HDIV BL ; (AH)=00H (AL)=12HAAM ; (AH)=01H (AL)=08H,62,3.3.3 逻辑指令 逻辑运算指令 移位指令,63,逻辑非指令:NOT OPR * OPR不能为立即数 执行操作: (OPR) (OPR) * 不影响标志位 逻辑与指令:AND DST, SRC 执行操作:
37、(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 AF0 0 * * * 无定义,根据运算结果设置,64,例:屏蔽AL的0、1两位AND AL, 0FCH例:置AL的第5位为1OR AL, 20H例:使AL的0、1位变反XOR AL, 3例:测试某些位是0是1TEST AL, 1JZ EVEN,* * * * * * * *AND 1
38、 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* * * * * * * *,65,移位指令:逻辑左移 SHL OPR, CNT逻辑右移 SHR OPR, CNT算术左移 SAL OPR, CNT(同逻辑左移)算术右移 SAR OPR, CNT,66,循环移位指令: 循环左移 ROL OPR, CNT循环右移 ROR OPR, CNT带进位循环左移 RCL OPR, CNT带进位循环右移 RCR OPR, CNT,6
39、7,注意: * OPR可用立即数以外的任何寻址方式 * CNT=1,SHL OPR, 1CNT1,MOV CL, CNTSHL OPR, CL ; 以SHL为例 * 条件标志位:CF = 移入的数值1 CNT=1时,最高有效位的值发生变化0 CNT=1时,最高有效位的值不变移位指令:SF、ZF、PF 根据移位结果设置AF无定义循环移位指令:不影响 SF、ZF、PF、AF,OF =,68,例:(AX)= 0012H,(BX)= 0034H,把它们装配成(AX)= 1234HMOV CL, 8ROL AX, CLADD AX, BX 例:(BX)=84F0H(1) (BX)为无符号数,求(BX)/
40、2SHR BX, 1 ; (BX) = 4278H(2) (BX)为带符号数,求(BX)/2SAR BX, 1 ; (BX) = 0C278H(3) 把(BX)中的16位数每4位压入堆栈,0008,0004,000F,0000 (SP),MOV CH, 4 ; 循环次数MOV CL, 4 ; 移位次数 NEXT: ROL BX, CLMOV AX, BXAND AX, 0FHPUSH AXDEC CHJNZ NEXT,69,3.3.4 串处理指令 串传送指令 存入串指令 从串取指令 串比较指令 串扫描指令,配合使用的前缀有:REP 重复REPE/REPZ 相等/为零则重复REPNE/REPNZ
41、 不相等/不为零则重复,70,与REP配合工作的 MOVS / STOS / LODSREP MOVS / STOS / LODS执行操作:(1) 如(CX)= 0则退出REP,否则转(2)(2) (CX) (CX) -1(3) 执行MOVS / STOS / LODS(4) 重复(1) (3),71,MOVS 串传送指令 MOVS DST, SRC MOVSB (字节) MOVSW (字) 例:MOVS ES: BYTE PTR DI, DS: SI执行操作:(1) (DI) (SI)(2) 字节操作:(SI)(SI)1, (DI)(DI)1字操作: (SI)(SI)2, (DI)(DI)2
42、方向标志DF=0时用 +,DF=1时用 - 。REP MOVS:将数据段中的整串数据传送到附加段中。源串(数据段) 目的串(附加段)执行REP MOVS之前,应先做好: (1)源串首地址(末地址) SI (2)目的串首地址(末地址) DI (3)串长度 CX (4)建立方向标志(CLD使DF=0,STD使DF=1),72,(SI),低地址,高地址,数据段,附加段,(SI),(DI),(DI),DF=0,DF=1,73,例3.58 datarea segment mess1 db personal_computer datarea endsextra segment mess2 db 17 du
43、p (?) extra endscode segment lea si, mess1 lea di, mess2 mov cx, 17 cld rep movsb code ends,lea si, mess1+16 lea di, mess2+16 mov cx, 17 std rep movsb,74,STOS存入串指令STOS DST STOSB (字节) STOSW (字)执行操作: 字节操作:(DI)(AL), (DI)(DI)1字操作: (DI)(AX), (DI)(DI)2例:把附加段中的5个字节缓冲区置为20Hlea di, mess2 mov al, 20H mov cx, 5 cld rep stosb,75,LODS从串取指令LODS SRC LODSB (字节) LODSW (字)执行操作: 字节操作:(AL)(SI), (SI)(SI)1字操作: (AX)(SI), (SI)(SI)2,