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