
2019/9/29 2.2.4串操作指令 微机技术与仪器系统设计 ·串:顺序放在内存中的一组字节或字的序列。 。串操作:对串中的每一项都执行的操作,如申传送, 查找,比较等,可以处理的数据串长度最大为64K, 第二章 撒型计算机指令系统 ·串操作的寻址方式 源操作数州针 -DS:SI(DS可超越) 目的操作数指针一ES:D1(不允许段超越) 1)串传送指令MoVs(MOVe String) 指孕幕式: ·每次申操作后: 申操作指令自动修改S1和D一字节土1,字 REP]MOVS [ES:]dst_string,[seg:Isre_string 士2。DF标志决定士。(注意:退出申操作后,指 MOVS WORD PTR[DIL,[SI] 针指向最后操作的元素的下一个元南 IREP]MOVSB REP]MOVSW 可完成两个存储单元之间的传送和比较 ①(ES:D)(DS):(SI) 操作(也仅是串指令可以) ②(SIS士1,(DD-(DD±1(字节操作) (SI)+(S±2,D0D士2(字操作
2019/9/29 1 微机技术与仪器系统设计 第二章 微型计算机指令系统 2.2.4 串操作指令 • 串:顺序放在内存中的一组字节或字的序列。 • 串操作:对串中的每一项都执行的操作,如串传送, 查找,比较等,可以处理的数据串长度最大为64K 。 • 串操作的寻址方式: • 源操作数指针———DS:SI(DS可超越) • 目的操作数指针——ES:DI(不允许段超越) • 每次串操作后: • 串操作指令自动修改SI和DI——字节±1,字 ±2。DF标志决定±。(注意:退出串操作后,指 针指向最后操作的元素的下一个元素) 可完成两个存储单元之间的传送和比较 操作(也仅是串指令可以) 指令格式: [REP] MOVS [ES:]dst_string,[seg:]src_string MOVS WORD PTR[DI], [SI] [REP] MOVSB [REP] MOVSW 1) 串传送指令MOVS (MOVe String) ① ((ES):(DI))←((DS):(SI)) ② (SI)←(SI) 1,(DI)←(DI) 1 (字节操作) (SI)←(SI) 2,(DI)←(DI) 2 (字操作) 1 2 3 4

2019/9/29 串指令使用的一般方法 多复前象 接量0停地地 MOVS红,源奉黄地址 (或LEA SL源率) ·有的串操作指令前面可加上意复前雏REP。当使用 REP前服时,该指令蓝复执行,藏复执行次数由CX决 使红耳标本地址 e 定(带有REP前服的帝操作指令每执行一次,CX自动 减1), 设■坤长度 MOVC区事长度 ·重复前领包括: ·REP CX0时量复执行 设量缘作方询正 CID(戴SD) ·REPE/REPZ CX0入ZF=1时量复执行 ·REPNE/REPNZ CX0AZF=O时意复执行 阜油冷 《亭指令》 MOVSB 例将数据段中首地址为BUFFER1的200个李节传送到附加 数据段首地址为BUF下ER2的内存区中。使用字节率传送指令的 例2将当前数据段中的BL0C1数据块(80个半)橐到同 程序段如下: 段中BCK2去 PUSH DS LEA SI,BUFFERI ;(S源串首地址指针 POP ES :使E$=D3,即数据段和附加段首地址 LEA DL,BUFFER21(D-目的审首地址指针 相同。 MOV CX,200 ,(CX):字节串长度 LEA SI,BLOCKI :源串地址进s工 CLD ,清方向标志DF LEA DI,BLOCK2 :目的率地址送D虹 MOV CX,0050日 :量复次数(80)送cx REP MOVSB ;传进200个字节 CLD :使DE=0,SI,DI作加2操作 HLT 1停止 REP MOVSW :重复执行,直到cx=0为址 节
2019/9/29 2 串指令使用的一般方法 设置源串地址 设置目标串地址 设置串长度 设置操作方向DF 串指令 MOV SI, 源串首地址 (或LEA SI, 源串) MOV DI, 目的串首地址 (或LEA DI, 目的串) MOV CX, 串长度 CLD(或STD) 《串指令》 MOVSB •重复前缀 • 有的串操作指令前面可加上重复前缀REP。当使用 REP前缀时,该指令重复执行,重复执行次数由CX决 定(带有REP前缀的串操作指令每执行一次,CX自动 减1)。 •重复前缀包括: • REP CX≠0 时重复执行 • REPE/REPZ CX≠0∧ZF=1时重复执行 • REPNE/REPNZ CX≠0∧ZF=0时重复执行 例 将数据段中首地址为BUFFER1的200个字节传送到附加 数据段首地址为BUFFER2的内存区中。使用字节串传送指令的 程序段如下: LEA SI,BUFFER1 ;(SI)←源串首地址指针 LEA DI,BUFFER2 ;(DI)←目的串首地址指针 MOV CX,200 ;(CX)←字节串长度 CLD ;清方向标志DF REP MOVSB ;传送200个字节 HLT ;停止 例2 将当前数据段中的BLOCK1数据块(80个字)搬到同一 段中BLOCK2去: PUSH DS POP ES ;使ES=DS,即数据段和附加段首地址 相同。 LEA SI,BLOCK1 ;源串地址送SI LEA DI,BLOCK2 ;目的串地址送DI MOV CX,0050H ;重复次数(80)送CX CLD ;使DF=0,SI.DI作加2操作 REP MOVSW ;重复执行,直到CX=0为止 5 6 7 8

2019/9/29 年2)串比较指令CMPS(CoMPare String) 指令格式 比较的结果只反映在标志位上,申本身无变化。 [REPE/REPNE]CMPS r_tring [ES:ldst_sring 本指令可用来检查两个串是否相等。 IREPE/REPNE]CMPSB [REPE/REPNE]CMPSB [REPE/REPNE]CMPSW [REPE/REPNE]CMPSW ④DSrS)-ES:D REPE或REPZ表示当(CX≠,且(ZF=1时整续进行比较。 ②S)一(S,(DD01字节操作) REPNE或REPNZ表示当(CX),且(ZF)=O时继续进行B虚 S-S到拉2,D-DD土李操作) 10 LEA SI,STRINGI :S,字符事1首地址 LEA DI,STRINGZ 多D:字符率2首地址 例比较两个字符率,找出其中第一个不相等字符的地址。 MOV CX,20 :(CX)字符申长度 如果两个字符全部相同,则转到ALLMATCH进行处理。这两 CLD E清方向标志DF 个字符串长度均为20,首地址分别为STRING1和STRING2, REPE CMPSB 年如湘等,重复进行比校 JCXZ ALLMATCH CX-,至LLMATCH DEC SI 吾测S-可1 DEC DI 事D0-1 HLT 停止 ALLMATCH: MOV SI,0 MOV DL,0 HLT 停止 11 3
2019/9/29 3 指令格式: [REPE/REPNE] CMPS [srg:]src_string,[ES:]dst_string [REPE/REPNE] CMPSB [REPE/REPNE] CMPSW 2) 串比较指令CMPS (CoMPare String) ① ((DS):(SI)) − ((ES):(DI)) ② (SI)←(SI) 1,(DI)←(DI) 1 (字节操作) (SI)←(SI) 2,(DI)←(DI) 2 (字操作) •比较的结果只反映在标志位上,串本身无变化。 •本指令可用来检查两个串是否相等。 [REPE/REPNE] CMPSB [REPE/REPNE] CMPSW REPE或REPZ表示当(CX)≠0,且(ZF)=1时继续进行比较。 REPNE或REPNZ表示当(CX)≠0,且(ZF)=0时继续进行比较。 例 比较两个字符串,找出其中第一个不相等字符的地址。 如果两个字符全部相同,则转到ALLMATCH进行处理。这两 个字符串长度均为20,首地址分别为STRING1和STRING2。 LEA SI,STRING1 ;(SI)←字符串1首地址 LEA DI,STRING2 ;(DI)←字符串2首地址 MOV CX,20 ;(CX)←字符串长度 CLD ;清方向标志DF REPE CMPSB ;如相等,重复进行比较 JCXZ ALLMATCH ;若(CX)=0,跳至ALLMATCH DEC SI ;否则(SI) −1 DEC DI ;(DI) −1 HLT ;停止 ALLMATCH: MOV SI,0 MOV DI,0 HLT ;停止 9 10 11 12

2019/9/29 米 3)串扫描指令sCAs(SCAn String) s在一个字特事中捷素关茅,事的始地丝效在S,D而 指令格式: 中,不允许段粗抛。特遭虞关健字必须放在AL或AX中。 [REPE/REPNE]SCAS [ES:Idst_string SCAS指令的基本操作为: REPE/REPNE SCASB ①(AL-(ES:D) 或(AX)-(ES):D) REPE/REPNEI SCASW ②(D小-DI士1(字节操作) 或(DI)D土2(字操作 13 SCAS将AL或AX的内容与字符串中的元素逐个进行比较,比较 例在100个字符的字符率中寻找第一个回车符CR(ASCI 结果衫响标志位SF、ZF、AF、PF、CF和OF,如果景加器的内 码为0DH田,找到后将其地址保留在ES:D川中,并在屏幕上显 容与字符串中的元素相等,则比较之后(ZF=1. 示字符‘Y”。如果字符审中没有回车符,则在屏幕上显示字符 N,该字符串的首地址为STRING, 指◆可以加上量复前级REPE或REPNE。 REPE(即REPZ表示当(CX≠0,且ZF一I时章禁进行扫播。 REPNEC即REPNZ)表示当(CX,且(ZF-O时壁熊进行扫墙。 15 16 4
2019/9/29 4 指令格式: [REPE/REPNE] SCAS [ES:]dst_string [REPE/REPNE] SCASB [REPE/REPNE] SCASW 3) 串扫描指令SCAS (SCAn String) SCAS在一个字符串中搜索关键字。串的起始地址放在(ES:DI) 中,不允许段超越。待搜索关键字必须放在AL或AX中。 SCAS指令的基本操作为: ① (AL) − ((ES):(DI)) 或 (AX) − ((ES):(DI)) ② (DI)←(DI)1 (字节操作) 或 (DI)←(DI) 2 (字操作) SCAS将AL或AX的内容与字符串中的元素逐个进行比较,比较 结果影响标志位SF、ZF、AF、PF、CF和OF。如果累加器的内 容与字符串中的元素相等,则比较之后(ZF)=1. 指令可以加上重复前缀REPE或REPNE。 REPE(即REPZ)表示当(CX)≠0,且(ZF)=1时继续进行扫描。 REPNE(即REPNZ)表示当(CX)≠0,且(ZF)=0时继续进行扫描。 例 在100个字符的字符串中寻找第一个回车符CR(ASCII 码为0DH),找到后将其地址保留在(ES:DI)中,并在屏幕上显 示字符 ‘Y’。如果字符串中没有回车符,则在屏幕上显示字符 ‘N’。该字符串的首地址为STRING。 13 14 15 16

2019/9/29 装山 根据要求可编程如下: LEA DI,STRING,(D字符率首址 4)串装入指令LoDs(LOaD String) MOV AL,ODH ,L画车符 MOV CX,100 :(CX)字符率长度 指令格式: CLD ,清状本海志位DF REPNE SCASB 。如未找测。量复扫描 LODS [seg:Isre_string JZ MATCH :如找到,则转MATCH LODSB MOV DL,N :字特亭中无厨车,则DLN JMP DSPY 转到DSPY LODSW MATCH: DEC DI :(DI-(DI)-1 MOV DL,'Y :(DL)-Y L0DS将一个字符串中的字节或字墨个装入AL或AX中。 DSPY: MOV AH,02H INT 21H ,量示字特 HLT 17 18 人出 例内存中以BUFFER为首址的级冲区内有10个非压缩型BCD 指令的基本操作为: 码形式存放的十进制数,它们的值可能是0一9中的任意一个, 将这些十进制数顺序显示在屏蒂上。 ①(AL)(DS:(S)(字节操作) 在屏幕上显示一个字符的方法是: 或(AX)-(DS):(S)(字操作) MOV AH,2H1(AH-DOS系峡动藏号(在幕上是示 ②S(S士1(字节操作) MOV DL,'Y ,(DL特是示字符Y的ASC高值 成SD,-(S土2(字操作) INT 21H 调用DOs的21H中断 当DF-时用“+”,DF-1时用-。 LODS不影响状态标志位,且一般不带营复前最。 19 5
2019/9/29 5 根据要求可编程如下: LEA DI,STRING ;(DI)←字符串首址 MOV AL,0DH ;(AL)←回车符 MOV CX,100 ;(CX)←字符串长度 CLD ;清状态标志位DF REPNE SCASB ;如未找到,重复扫描 JZ MATCH ;如找到,则转MATCH MOV DL,'N' ;字符串中无回车,则(DL)←'N' JMP DSPY ;转到DSPY MATCH: DEC DI ;(DI)←(DI) −1 MOV DL,'Y' ;(DL)←'Y' DSPY: MOV AH,02H INT 21H ;显示字符 HLT 指令格式: LODS [seg:] src_string LODSB LODSW LODS将一个字符串中的字节或字逐个装入AL或AX中。 4) 串装入指令LODS (LOaD String) 指令的基本操作为: ① (AL)←((DS):(SI)) (字节操作) 或 (AX)←((DS):(SI)) (字操作) ② (SI)←(SI)±1 (字节操作) 或 (SI)←(SI)±2 (字操作) 当DF=0时用“+”,DF=1时用“−”。 LODS不影响状态标志位,且一般不带重复前缀。 例 内存中以BUFFER为首址的缓冲区内有10个非压缩型BCD 码形式存放的十进制数,它们的值可能是0~9中的任意一个, 将这些十进制数顺序显示在屏幕上。 在屏幕上显示一个字符的方法是: MOV AH,02H ;(AH)←DOS系统功能号(在屏幕上显示) MOV DL,'Y' ;(DL)←待显示字符Y的ASCII码值 INT 21H ;调用DOS的21H中断 17 18 19 20

2019/9/29 5)串送存指令sTos(STOre String) LEA S,BUFFER:(S区首址 MOV CX,10 1(CX字符事长度 指令格式: CLD ,裤状本标这位DF MOV AH,02H 1(AH功能号 IREPSTOS [ES:ldst_string GET:LODSB ,敢一个BCD哥到L REPI STOSB OR AL,30H ,BCD网转换为:ASC网 MOV DL,AL :(DL字特 REPI STOSW INT 21H ,显示 STOS将AL酸AX的值送存到内存缓冲区的某个位置上。 DEC c ,(CX-CX-1 指令的基本操作为: Z GET :未亮成10个字特则重复 HLT 22 6四:Dw山字节有 例一个数籍块由大写或小写的英文字母、数字和各种其 或ES):DD)AX)(宇操作) 他符号组成,其第束符是回车符CR(ASCI码为0D,数振 块的首地址为BLOCK1。将数据块传送到以BLOCK2为首地 ②DIDD土1字节操作 址的内存区,并将其中所用的英文小写字母一一)转换成相 或DD-DD士2(字操作) 应的大写字每A一公,其余不变。 其中,当标志DF-0时用·+”,DF-1时用“、 分折:只需将小写字母的ASCⅡ码减20H,即可得到相应 STOS对状态标志位投有影响。指◆若加上复前银REP,则操饰 大写字母的ASCIR码。程序如下 直量复进折下去,直到(C-0。 23 24 6
2019/9/29 6 编程如下: LEA SI,BUFFER ;(SI)←缓冲区首址 MOV CX,10 ;(CX)←字符串长度 CLD ;清状态标志位DF MOV AH,02H ;(AH)←功能号 GET: LODSB ;取一个BCD码到AL OR AL,30H ;BCD码转换为ASCII码 MOV DL,AL ;(DL)←字符 INT 21H ;显示 DEC CX ;(CX)←(CX) −1 JNZ GET ;未完成10个字符则重复 HLT 指令格式: [REP] STOS [ES:]dst_string [REP] STOSB [REP] STOSW STOS将AL或AX的值送存到内存缓冲区的某个位置上。 指令的基本操作为: 5) 串送存指令STOS (STOre String) ① ((ES):(DI))←(AL) (字节操作) 或((ES):(DI))←(AX) (字操作) ② (DI)←(DI)±1 (字节操作) 或(DI)←(DI)±2 (字操作) 其中,当标志DF=0时用“+”,DF=1时用“−”。 STOS对状态标志位没有影响。指令若加上重复前缀REP,则操作将一 直重复进行下去,直到(CX)=0。 例 一个数据块由大写或小写的英文字母、数字和各种其 他符号组成,其结束符是回车符CR(ASCII码为0DH),数据 块的首地址为BLOCK1。将数据块传送到以BLOCK2为首地 址的内存区,并将其中所用的英文小写字母(a~z)转换成相 应的大写字母(A~Z),其余不变。 分析:只需将小写字母的ASCII码减20H,即可得到相应 大写字母的ASCII码。程序如下: 21 22 23 24

2019/9/29 LEA S,BLOCK1(S)地址指 串操作指令的共同点: LEA DL,BLOCK2:(Dl-目标地址指时 CLD 清方向标志DF 的定以DS:SI学址源率,以ES:DI寻址目标率,其中源 NEXT:LODSB ,取一个字符到人L 串中的段寄存悬DS可通过加段超越前驱而放变,但目标串 CMP AL,ODH 是吾回车特 不可以。 IZ DONE ,是,则装DONE CMP AL,61H 用方向标志DF规定串处强方向, :否则,是否小于a JC OK 1是,特OK SI和DI根据DF自动增/减1或2。 CMP AL,7BH :是百大于红 要处理的字符串长度放在CX寄存都中。 JNC OK :是,特OK SUB AL,20H 1百则,AL被2阳 为了加快串运算指令的执行速度,通常在串操作指令前 加置复前藏,以对一个以上的串数据进行操作 OK: STOSB :迷存 JMP NEXT I转移到NEXT 置复的数据串处理过程可被中断 DONE HLT 五、控制转移类指令 段内转移:转移的目标地址在当前代码段内, 则目标离性为NEAR,这时指令只修政IP。 一、转移指令 ◇控制转移类指◆用于实现分支、 中码段 段间转移:转移的目标地址在其他代码段内, 二、循环控制指令 循环、过程等程序结构 则目标属性为FAR,这时指令同时修政IP与 三、过程调用指令 直接转移:转移的目标地址直接出现在指令 四、中断指令 中。 代码段 间接转移:转移的目标地址间接存贮在某一 控制转移类指令通过改变P(和CS)值, 寄存器或内存量中。 实现程序执行顺序的改变 28 1
2019/9/29 7 LEA SI,BLOCK1 ;(SI)←源地址指针 LEA DI,BLOCK2 ;(DI)←目标地址指针 CLD ;清方向标志DF NEXT:LODSB ;取一个字符到AL CMP AL,0DH ;是否回车符 JZ DONE ;是,则转DONE CMP AL,61H ;否则,是否小于'a' JC OK ;是,则转OK CMP AL,7BH ;是否大于'z' JNC OK ;是,则转OK SUB AL,20H ;否则,AL减20H OK: STOSB ;送存 JMP NEXT ;转移到NEXT DONE:HLT ;停止 约定以DS:SI寻址源串,以ES:DI寻址目标串,其中源 串中的段寄存器DS可通过加段超越前缀而改变,但目标串 不可以。 用方向标志DF规定串处理方向。 SI和DI根据DF自动增/减1或2。 要处理的字符串长度放在CX寄存器中。 为了加快串运算指令的执行速度,通常在串操作指令前 加重复前缀,以对一个以上的串数据进行操作 重复的数据串处理过程可被中断 串操作指令的共同点: 五、控制转移类指令 一、转移指令 二、循环控制指令 三、过程调用指令 四、中断指令 控制转移类指令用于实现分支、 循环、过程等程序结构. 控制转移类指令通过改变IP(和CS)值, 实现程序执行顺序的改变 段内转移:转移的目标地址在当前代码段内, 则目标属性为NEAR,这时指令只修改IP。 段间转移:转移的目标地址在其他代码段内, 则目标属性为FAR,这时指令同时修改IP与 CS。 直接转移:转移的目标地址直接出现在指令 中。间接转移:转移的目标地址间接存贮在某一 寄存器或内存量中。 • 代 码 段• 代 码 段 25 26 27 28

2019/9/29 段内转移 标号地址 一、无条件转移指今 JMP(jump) 段内直按短转移:JMP SHORT_lable 指令格式:JMP OPR 段内直接近装移:JMP NEAR_lable 转移分类 为16位 段内转移 段内间接转移,JMP reg(mem 段间转移 杂件騁禁健的避兰热在少禁 29 段间转移 沙、 二、 条件转移指令(直接转移) 段间直接(远)转移: 条件转移指令Jcc根据指定的条件确定程序是否发生转移 指令格式:JMP FAR_able 。其通用格式为: 执行操作:无条并神答到指定段内的目标地址able Jcc label:条件满足,发生转移 是一种随对特移指食。 :1PP十8位位移量 段间间接转移: :否则。顺序执行 指令格式: JMP mem label是一个标号、一个8位位移量,表示Jcc指令后的那 功能:程序转向由mem指定的双字指针中壤一个字单元的内 条指令的偏移地址,到目标指令的偏移地址的地址位移 喜作为IP,第二个字单元的内喜作为C5的目标此 1ab©只支持短转移的相对寻址方式,操作数必须是 短标号 执行操作: IP.[mem] CS-[mem+2] 8
2019/9/29 8 一、无条件转移指令 JMP(jump) 指令格式:JMP OPR 转移分类 段内转移 段间转移 段内直接短转移: JMP SHORT_lable 无条件转移到lable所指定的目标地址,目标地址与JMP指令的下一条指 令地址之差在-128~127之间。相对转移 段内直接近转移: JMP NEAR _lable 无条件转移到lable所指定的目标地址,跳转地址的偏移范围为16位带符 号二进制数范围,即-32768~+32767之间。相对转移。 段内间接转移: JMP reg(mem) 无条件转移到由寄存器的内容指定的目标地址,或是由存储器寻址方式提 供的存储单元内容所指定的目标地址。这是一种绝对转移指令。 段内转移 标号地址 段间转移 段间直接(远)转移: 指令格式: JMP FAR _lable 执行操作:无条件转移到指定段内的目标地址 lable. 是一种绝对转移指令。 段间间接转移: 指令格式: JMP mem 功能:程序转向由mem指定的双字指针中第一个字单元的内 容作为IP,第二个字单元的内容作为CS的目标地址。 执行操作: IP← [mem] CS←[mem+2] • 条件转移指令Jcc根据指定的条件确定程序是否发生转移 。其通用格式为: Jcc label ;条件满足,发生转移 ;IP←IP+8位位移量; ;否则,顺序执行 • label是一个标号、一个8位位移量,表示Jcc指令后的那 条指令的偏移地址,到目标指令的偏移地址的地址位移 • label只支持短转移的相对寻址方式,操作数必须是一个 短标号 二、 条件转移指令(直接转移) 29 30 31 32

2019/9/29 Jcc指令的分类(表2.7) 1.判断单个标志位状态 JZJE和JNZ/JNE ·根据利用的标志位不同,分成三种情况: 利用零标志ZF,判断结果是否为零(或相等) ②JS和JNS ()判断单个标志位状态 利用符号标志SF,判断结果是正是负 (3)JO和JNO (份比较无符号数高低 利用滥出标志OF,判断结果是否产生泄出 (③)比较有符号数大小 (IPLIPERUINPUIPO 利用奇偶标志PF,判断结果中“1"的个数是偶是奇 (⑤JC/JB/JNAE和JNC/JNB/JAE 利用进位标志CF,判断结果是否进位或僧位 33 例 解答1用JZ指令实现 题目:将AX中存放的无符号数除以2,如果是奇 test ax,01h 数则加1后除以2 :测试AX的最低位D0(不用AND指令,以免政变AX) 问题:如何判断AX中的数据是奇数还是偶数? jz even 解答:判断AX最低位是“0”(偶数),还是“1” (奇数)。可以用位操作类指令 ;标志ZF=1,即D0=0:AX内是偶藏,程序转移 1:用逻将与指令将除景低位外的其他位变成0,保窗最低位 add ax,1 不变。别断这个数据是0,AX就是数:否则,为奇数 ;标志ZF=0,即D0=1:AX内的奇数,加1 乙德然限警窖个劳需被标志断进位标志0。 even:shr ax,1 :AX-AX÷2 3:将最低位用移位指令移至最高位(符号位),判断年 标志是0,AX就是:否则,为奇数 9
2019/9/29 9 Jcc指令的分类(表2.7) • 根据利用的标志位不同,分成三种情况: ⑴ 判断单个标志位状态 ⑵ 比较无符号数高低 ⑶ 比较有符号数大小 1. 判断单个标志位状态 ⑴ JZ/JE和JNZ/JNE 利用零标志ZF,判断结果是否为零(或相等) ⑵ JS和JNS 利用符号标志SF,判断结果是正是负 ⑶ JO和JNO 利用溢出标志OF,判断结果是否产生溢出 ⑷ JP/JPE和JNP/JPO 利用奇偶标志PF,判断结果中“1”的个数是偶是奇 ⑸ JC/JB/JNAE和JNC/JNB/JAE 利用进位标志CF,判断结果是否进位或借位 例 • 题目:将AX中存放的无符号数除以2,如果是奇 数则加1后除以2 • 问题:如何判断AX中的数据是奇数还是偶数? • 解答:判断AX最低位是“0”(偶数),还是“1” (奇数)。可以用位操作类指令 1:用逻辑与指令将除最低位外的其他位变成0,保留最低位 不变。判断这个数据是0,AX就是偶数;否则,为奇数 2:将最低位用移位指令移至进位标志,判断进位标志是0, AX就是偶数;否则,为奇数 3:将最低位用移位指令移至最高位(符号位),判断符号 标志是0,AX就是偶数;否则,为奇数 解答1 用JZ指令实现 test ax,01h ;测试AX的最低位D0(不用AND指令,以免改变AX) jz even ;标志ZF=1,即D0=0:AX内是偶数,程序转移 add ax,1 ;标志ZF=0,即D0=1:AX内的奇数,加1 even: shr ax,1 ;AX←AX÷2 33 34 35 36

2019/9/29 海年 解答2用JNC指令实现 解答3用JNS指令实现 mov bx,ax 还可用SAR、ROR和RCR指令 mov bx,ax 带误1葡环指令不形响SF等标志 shr bx,1 ror bx.1 :将AX的最低位D0移进CF :将AX的最低位D0移进最高位(符号位SF) jnc even jns even :标志CF=0,即D0=0:AX内是偶数,程序转移 ;标志SF=0,即D0=0:AX内是偶数,程序转移 add ax,1 add ax,1 ,标志CF=1,即D0=1:AX内的奇数,加1 1标志3F=1,即D0=1:AX内的奇数加1 even:shr ax,1 :AX-AX÷2 even:shr ax,1 iAX-AX÷2 ADD BX,0增加条 ,2世软无符号高 3.比较有符号数大小 无符号的大小用离《刻年定 判断有符号数的大(Greater)、小(Less), 表示,需要利用CF确定高低、利用ZF标志确定相 需要组合OF、SF标志、并利用ZF标志确定相等 等(Equal) 与否 ·两数的高低分成4种关系,对应4条指令 ·两数的大小分成4种关系,分别对应4条指令 JB(JNAE):目的操作数低于(不高于等于)源操作数 JL(JNGE),目的操作数小于(不大于等于)操作数 JNB(JAE):目的操作数不低于(高于等于)源操作数 JNL(JGE),目的操作教不小于(大于等于)源操作兼 JBE(JNA):目的操作数低于等于(不高于)源操作敦 JLE(JNG):目的操作数小于等于(不大于)源操作数 JNBE(JA):目的操作数不低于等于(高于)源操作卷 JNLE(JG):目的操作数不小于等于(大于)源操作 10
2019/9/29 10 解答2 用JNC指令实现 mov bx,ax shr bx,1 ;将AX的最低位D0移进CF jnc even ;标志CF=0,即D0=0:AX内是偶数,程序转移 add ax,1 ;标志CF=1,即D0=1:AX内的奇数,加1 even: shr ax,1 ;AX←AX÷2 还可用SAR、ROR和RCR指令 解答3 用JNS指令实现 mov bx,ax ror bx,1 ;将AX的最低位D0移进最高位(符号位SF) jns even ;标志SF=0,即D0=0:AX内是偶数,程序转移 add ax,1 ;标志SF=1,即D0=1:AX内的奇数,加1 even: shr ax,1 ;AX←AX÷2 错误!循环指令不影响SF等标志 ADD BX,0 ;增加一条指令 2. 比较无符号数高低 • 无符号数的大小用高(Above)、低(Below) 表示,需要利用CF确定高低、利用ZF标志确定相 等(Equal) • 两数的高低分成4种关系,对应4条指令 JB(JNAE):目的操作数低于(不高于等于)源操作数 JNB(JAE):目的操作数不低于(高于等于)源操作数 JBE(JNA):目的操作数低于等于(不高于)源操作数 JNBE(JA):目的操作数不低于等于(高于)源操作数 3. 比较有符号数大小 • 判断有符号数的大(Greater)、小(Less), 需要组合OF、SF标志、并利用ZF标志确定相等 与否 • 两数的大小分成4种关系,分别对应4条指令 JL(JNGE):目的操作数小于(不大于等于)源操作数 JNL(JGE):目的操作数不小于(大于等于)源操作数 JLE(JNG):目的操作数小于等于(不大于)源操作数 JNLE(JG):目的操作数不小于等于(大于)源操作数 37 38 39 40