汇编循环与分支程序设计.ppt
1,第五章 循环与分支程序设计,1、编制汇编语言程序的步骤如下:,分析问题问题性质、目的、要求、已知条件等等。建立相应数学模型。确定算法把实际问题转化为计算机求解的步骤和方法。确定数据结构数据的组织方式,分配存储区绘制流程图形象化描述程序算法。编写程序将流程图用指令集合来实现。应该“简单明了、层次清晰、运算正确、短小精悍”。上机调试验证程序功能,反复修改达到完善。,基本步骤,2,计算机通常不会从程序的第一条指令直接顺序执行到程序的最后一条指令结束,会根据处理事务的不同而具有不同的执行流程。程序的流程是由程序的结构决定的。基本的程序结构有:,2、程序基本结构,顺序结构分支结构循环结构子程序结构,3,程序设计基础一、读键盘输入的两种方法INT 21H 功能调用,1键盘一次输入一个字符的方法,例如,在数据区定义的字符缓冲区如下:DATA SEGMENT Buffer DB 32ACTLEN DB?STRING DB 32 DUP(?)DATA ENDS,2键盘一次输入一个字符串的方法:,串地址存入(DS:DX)、调用参数为10送AH MOV AX,SEG Buffer/Buffer是存放输入字符串的缓冲区 MOV DS,AX/Buffer的段地址存入DS MOV DX,Offset Buffer/Buffer的偏移地址存入DX MOV Buffer,count/设置存入字符串的最大长度并存入Buffer的首字节;MOV AH,0AH/设置INT 21H功能参数为0AH INT 21H/调用DOS功能,By brooks too broad for leaping,4,二、DOS显示功能调用 INT 21H 功能调用1显示单个字符的方法调用参数为2或6(AH)02H/06H;MOV AH,2或MOV AH,6置21H功能调用参数2或6于AH中;MOV DL,&被显示的字符ASCI码放入DL中;INT 21H 2显示一个字符串的方法串地址存入(DS:DX)、调用参数为9送AH说明.被显示的字符串必须以结束;.并且字符串在内存中的段地址存放在DS中,段内偏移地址(即首字符偏移)存放在寄存器DX中;.字符串必须以ASC码值存放;Eg:DATA_SEG segment Sting1 Good Moring$students!,10,13,$DATA_SEG ends MOV AX,SEG sting1/取字符串的段地址并存放在DS中;MOV DS,AX MOV DX,offset sting1/取字符串变量的偏移并放入DX中;MOV AH,09H/AH中设置21H中断参数9;INT 21H/调用21H中断;,5,3光标自动换行(即换行开始显示)的方法:1方法一在需要换行显示的字符前加“回车”和“换行”的ASC码;2方法二用单字符显示方法连续显示“回车”和“换行”(可反序);,6,顺序结构及简单程序设计,程序设计中最基本的结构是如图所示的顺序结构,它只有一个起始框、一个结束框和一至多个执行模块。具有顺序结构的程序叫做简单程序。顺序结构中的执行模块可以是一条指令或完成某一功能的程序。简单程序执行的特点是其中的指令或语句是按顺序执行的,没有分支或循环。,开始,A,B,结束,7,例:设置光标到屏幕左上角。SET_CURPROC MOV AH,2 MOV BH,0 MOV DX,0 INT 10H RET SET_CURENDP 这个程序是顺序执行的,一条指令执行后顺序执行紧接其后的另一条指令。实际上许多程序片段都具有顺序结构。,【例】编制一个程序,求下列公式中的Z值,并将结果存放到RESULT单元中:Z=(AB)10500。设A、B的值分别存放在BUFA、BUFB单元中,运算结果不超过16位。,算 法:在二进制整数中左移1位相当于乘2,右移1位相当于除2,所以可将(A+B)左移3位完成乘以8的操作,然后再与(A+B)左移1位(乘以2)的结果相加得到(A+B)10的计算。,顺序结构程序简单程序结构,分 析:这是一个简单的顺序结构程序,可以直接使用汇编指令完成。,数据结构:存储单元RESULT用来存放结果,BUFA、BUFB存放A、B的值,可用寄存器BX存放中间运算结果。,程序流程图,DATA SEGMENTBUFA DW?BUFB DW?RESULTDW?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,BUFA;DX=A ADD DX,BUFB;DX=A+B MOV BX,DX;BX=DX=A+B MOV CL,3 SAL DX,CL;DX=(A+B)8 SAL BX,1;BS=(A+B)2 ADD DX,BX;DX=(A+B)*8+(A+B)*2=(A+B)*10 SUB DX,500;DX=(A+B)*8-500 MOV RESULT,DX MOV AH,4CH;DOS系统功能调用 INT 21H;返回操作系统CODE ENDS END START,编写程序,【例】用查表法求整数X的平方值(0 x15的整数),将结果存入RESULT单元中。,分析:用查表法求平方值,首先需要建一个用于存放各数平方值的表,以TABLE表示表头,表中依次存放015的平方值,将待求数X放入AL寄存器,表的起始地址放入BX寄存器。使用XLAT查表指令可以将地址BX+AL上的一个字节,即AL数值对应的平方值读入AL中。,程序流程图,编写程序,DATA SEGMENT TABLE DB 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225 X DB 9RESULT DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOV AL,X MOV BX,OFFSET TABLE;LEA BX,TABLE XLAT MOV RESULT,AL MOV AH,4CH INT 21HCODE ENDS END START,12,5.1 循环程序设计,5.1.1 循环程序的结构形式,13,5.1.2 循环程序设计方法,无论使用哪种循环结构,循环程序一般应包括以下几部分:循环初始化。包括设置循环次数的初值、地址指针初始设置等。循环体。循环工作主体,包括要重复执行的操作以及循环的修改部分。修改部分包括地址指针的修改、循环控制条件的修改等。循环控制部分:判断循环条件满足与否,常用方法:计数控制、特征值控制、地址边界控制等。常用指令1.LOOP,LOOPZ/LOOPE,LOOPNZ/LOOPNE;2.各种跳转指令;特别要注意循环入口和循环次数的正确设置、地址指针及循环控制条件的修改等。否则会得不到期望的结果。多重循环程序设计循环嵌套 注意事项每次通过外层循环再次进入内层循环时,内层初始条件将重新设置;,14,例5.1:把 BX 中的二进制数以十六进制的形式显示在屏幕上,如:1011 0010 1111 1010 B B2FAH,BX,1,2,3,4,分析:(1)程序结构的确定由题意应该把BX的内容从左到右每4位为一组在屏幕上显示出来,显然这可以用循环结构来完成,循环次数为4。,用何种移位指令?,15,(2)循环体的构成(算法确定)循环体应该包括:(a)BX循环左移一个数位(b)把最右边的数位转换为ASCII(c)显示字符.需要了解相关知识:字符和其ASCII码之间的关系?“0”“9”30H39H,(0+30H=30H)“A”F”41H46H(A+37H=41H=A+30H+7H)如何显示一个字符?(a)将显示字符的ASCII码放入DL寄存器;(b)将AH的内容置为2(功能号);(c)执行INT 21H(DOS 功能调用).,16,(3)循环控制条件分析因为循环次数已知,可以使用计数值作为循环控制条件。可以使用LOOP指令实现。循环移位指令中移位次数存放于CL寄存器中LOOP 指令的循环次数隐含在CX寄存器中注意:两者之间有冲突!如何解决?用PUSH 和 POP指令解决,17,mov cx,4;初始化 push cx mov cl,4;设置移动的位数 rol bx,cl;循环左移 mov al,bl;避免bx中的数被修改 and al,0fh;高4位清零 add al,30h;09 ASCII 30H39H cmp al,3ah jb printit add al,7h;AF ASCII 41H46H mov dl,al mov ah,2 int 21h pop cx loop rotate,方法1(LOOP),rotate:,容易出错处1,容易出错处4,容易出错处3,容易出错处2,printit:,结束,开始,初始化循环计数值,BX循环左移一个数位,把最右边的数位转换为ASCII(即将最右边的数位+30H),是ASCII AF?,加上7,显示一个字符,循环计数值=0?,Y,用隐藏的cx作为控制条件,printit:,18,除了可以使用LOOP指令之外,还可以使用条件跳转指令来实现。如何实现?,19,mov ch,4;初始化rotate:mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h;09 ASCII 30H39H cmp al,3ah jl printit add al,7h;AF ASCII 41H46Hprintit:mov dl,al mov ah,2 int 21h dec ch jnz rotate,方法2(条件跳转指令),将cx分成ch和cl两部分使用,代替loop rotate,20,mov bx,0newchar:mov ah,1;键盘输入 int 21h sub al,30h jl exit;9退出,分支2 cbw;符号扩展而清除AH xchg ax,bx mov cx,10 mul cx;AX的内容乘10 xchg ax,bx add bx,ax jmp newchar;无条件死循环exit:;输入非法字符时退出,实例2从键盘接收十进制数并存入BX,(010)+1)10+2)10+5,1 2 531H 32H 35H如何把125D变成007DH?,21,mov bx,0newchar:mov ah,1;键盘输入 int 21h sub al,30h jl exit;f退出,分支4add_to:mov cl,4 shl bx,cl mov ah,0 add bx,ax jmp newchar;无条件死循环exit:,实例3从键盘接收十六进制数并存入 BX,1 a f31H 61H 66H,(016)+1)16+0a)16+0f,22,例5.2 在ADDR单元存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中,循环次数固定,完全由循环计数器控制,23,DATA SEGMENTYDW 1234HADDRDW YCOUNTDB?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV DL,0MOV BX,ADDRMOV AX,BXMOV CX,16,REPEAT:SHL AX,1JNC NEXTINC DLNEXT:LOOP REPEATEXIT0:MOV COUNT,DLMOV AH,4CHINT 21HCODEENDSEND START,例5.2,24,例5.2,25,DATA SEGMENTYDW 1234HADDRDW YCOUNTDB?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV DL,0MOV BX,ADDRMOV AX,BXMOV CX,16,REPEAT:SHL AX,1JNC NEXTINC DLNEXT:LOOP REPEATEXIT0:MOV COUNT,DLMOV AH,4CHINT 21HCODEENDSEND START,CMP AX,0JZ EXIT0,例5.2,JMP REPEAT,26,作业:Page193 5.15.8,27,例5.3 在附加段中,有一个首地址为LIST和未经排序的字数组。在数组的第一个字中,存放着该数组的长度,数组的首地址已存放在DI寄存器中,AX寄存器中存放着一个数。要求编制一程序:在数组中查找该数,如果找到此数,则把它从数组中删除。,分析:题目要求在未整序的字数组中删除正数n,因此,解决问题的关键是如何找出全部要删除的正数n的位置。需要考虑如下问题?(1)从那个方向查找及软件实现?(2)找到后如何删除该位置的数及软件实现?(3)如何删除全部的查找到的位置上的数?,28,del_ul proc near cld push di mov cx,es:di add di,2 repne scasw je delete pop di jmp short exitdelete:jcxz dec_cnt,next_el:mov bx,ex:di mov es:di-2,bx add di,2 loop next_eldec_cnt:pop di dec word ptr es:diexit:retdel_up endp,最后一个是,直接把长度减1,如果有多个需要删除的数,怎么办?,29,例5.4:将正数 n 插入一个已整序的正数字数组。该数组的首地址和末地址分别为ARRAY_HEAD,ARRAY_END。,分析:题目要求在已经排好序的正数数组中插入一个正数n,因此,解决问题的关键是找到要插入正数n的位置。需要考虑如下问题?(1)如何找到插入位置及软件实现?(2)如何插入正数n及软件实现?(3)数组边界问题考虑?,x dw?array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105n dw 32,30,由于数组已经排好序,因此可以将正数n依次和数组中的数进行比较,比较有个方向问题,怎样比较最简单?当遇到第一个比n小的数,记下该位置,该位置的下一个位置就是要插入n 的位置。找到插入位置后,如何在不破坏原来数据顺序基础上插入n呢?数组中将要插入数n位置后的数依次后移一个位置(两个字节),空出要插入位置,将n放入即可。在插入数时,可能遇到特殊情况,即数n比数组中所有的数都要大,或者小。若比所有的数都大,就不需要移动原数组中的数,直接插最后即可;若比所有的数都小,就将数n放在数组的首位置。,31,x dw?array_head dw 3,5,15,23,37,49,52,65,78,99array_end dw 105n dw 32,实例5.4 将正数 n 插入一个已整序的正数字数组(P166例题5.4),32,例5.5:有数组 x(x1,x2,x10)和 y(y1,y2,y10),编程计算 z(z1,z2,z10)z1=x1+y1z2=x2+y2z3=x3-y3z4=x4-y4z5=x5-y5z6=x6+y6z7=x7-y7z8=x8-y8z9=x9+y9z10=x10+y10,逻辑尺:0 0 1 1 0 1 1 1 0 01 减法0 加法,X1+Y1,X2+Y2,X3-Y3,余类推,33,x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dw 00dch;0000,0000,1101,1100 mov bx,0 mov cx,10 mov dx,logic_rulenext:mov ax,xbx shr dx,1 jc subtract add ax,ybx jmp short result;向前引用subtract:sub ax,ybxresult:mov zbx,ax add bx,2 loop next,34,总结:这种设置逻辑尺的方法非常有用。例如要传输一批数据(定义为一个数组),该数组中含有多个0元素,为了节省存储空间和传输时间,可以选用合适的数据结构。比如可以使用压缩数据及逻辑尺的方法,把所有元素按下标顺序排列,并各用1个bit表示。设0元素用0表示,非0元素用1表示。存储时只需保存非0元素(压缩数组)和逻辑尺,当进行数据传输时,若逻辑尺相应位为1,则从压缩数组中取到非0数据并传送。若逻辑尺相应位为0时,只送一个标志,在接收方直接生成数字0,这样可以提高传输效率,35,例5.6 试编制一程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存入),直到接收到第二个空格符时退出程序。,20H,20H,L,36,datarea segment buffer db 80 dup(?)flag db?datarea endsprognam segment assume cs:prognam,ds:datareastart:mov ax,datarea mov ds,ax lea bx,buffermov flag,0,next:mov ah,1 int 21h test flag,01h jnz follow cmp al,20h jnz exit mov flag,1 jmp nextfollow:cmp al,20h jz exit mov bx,al inc bx jmp nextexit:mov ah,4ch int 21h prognam ends end start,设置标志状态,0表示开始接受输入,1表示随后的正常输入,37,例:在字型无序表中找出最大数和最小数,并分别存入MAX和MIN单元。算法分析:把表中第一个元素分别作为最大数和最小数,与下一个元素比较,若下一个元素比该元素大,则把下一个元素作为最大数,继续进入下一轮比较;若下一个元素比该元素小,则把下一个元素作为最小数,继续进入下一轮比较直至遍历整个表,最后保留下来的两个数就分别是表中的最大数和最小数。本例采用DO_UNTIL结构实现。,38,程序:,STACKSG SEGMENT STACK STK DW 32 DUP(S)STACKSG ENDSDATA SEGMENTBUFFER DW 500,30,56,77,999,67,433,5675,0,9999;无序表 DW 3455,6578,32766,8,0,32560,45,889,5665,09CN DW($-BUFFER)/2;元素个数MAX DW?;存放最大数单元MIN DW?;存放最小数单元DATA ENDS,39,CODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA SI,BUFFER;初始化地址指针 MOV CX,CN;元素个数 MOV AX,SI;取第一数 MOV MAX,AX;初始化最大数 MOV MIN,AX;初始化最小数,40,COMP:ADD SI,2;修改地址指针 MOV AX,SI;取下一个数 CMP AX,MAX;与当前的最大数比较 JLE NEXT;若小于转 MOV MAX,AX;若大于则把此数作为最大数保存 JMP SHORT LOPNEXT:CMP AX,MIN;与当前的最小数比较 JGE LOP;若大于转 MOV MIN,AX;若小于则把此数作为最小数保存LOP:LOOP COMP;决定循环继续还是终止 RETMAIN ENDPCODE ENDS END MAIN,41,例:自定义一个按降序排列的字型数组,在数组中查找指定的数字,若找到在屏幕上显示“Duplication!”,否则插入该数字在适当位置并继续保持数组有序,且显示“Inserted!”。算法:先使用字符串指令进行块 查找,若找到则显示“Duplication!”后退出。若未找到则从数组中第一个数开始比较。由于数组是降序的,所以当数组中当前元素比指定数字小时,说明该数组中无指定数字,则应插入之,且显示“Inserted!”。否则把数据前移一个位置,为以后要插入的数据腾出空间,继续循环对下一个数进行比较.这是一个初始循环次数不定、根据条件控制循环的例子,42,程序:DATA SEGMENTPRT DB Duplication,$INS DB Inserted!,$X DW?;为数据移动预留空间TAB DW 889,754,589,546,52,31;降序数组CT EQU($-TAB)/2;元素个数N DW 234;要插入的数字DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA,43,PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI,TAB;装入表首址 MOV AX,N;要插入的数字 MOV CX,CT;个数 CLD REPNZ SCASW JE A;找到转 MOV SI,0COMPARE:CMP TABSI,AX;比较,44,JL B MOV BX,TABSI;元素前移为插入的数字腾位置 MOV TABSI-2,BX ADD SI,2;修改地址指针 JMP SHORT COMPAREA:MOV AH,9H LEA DX,PRT INT 21H JMP EXITB:MOV TABSI-2,AX;插入元素 MOV AH,9 LEA DX,INS INT 21HEXIT:RET MAIN ENDPCODE ENDS END MAIN,45,5.1.3 多重循环程序设计,有些比较复杂的问题使用一重循环可能无法解决,此时就需要设计多重循环程序。对于多重循环程序设计,需要注意循环初始设置、循环入口、循环控制条件的修改等;还要注意内、外循环体不能交叉;在每次通过外层循环再次进入内层循环时,内层循环的初始条件必须重新设置,46,一个简单延时程序:(双重循环)mov cx,100n_start:mov dx,0ffffhn_loop:dec dx jnz n_loop dec cx jnz n_start,47,例5.7:有一个首地址为A的N字数组,请编程使该数组中的数按照从小到大的次序排序分析:采用起泡排序算法。从第一个数据开始依次对相邻两个数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍进行(N-1)次比较后最大的数放到了最后;第二遍进行(N-2)次比较;总共最多进行(N-1)遍比较就可以完成排序还可以采用设立测试标志的方法来进行起泡排序,48,例:将首地址为A的字数组从小到大排序32,85,16,15,8(冒泡算法,多重循环),49,mov cx,5;元素个数 dec cx;比较遍数loop1:mov di,cx;比较次数 mov bx,0loop2:mov ax,Abx;相邻两数 cmp ax,Abx+2;比较 jle continue xchg ax,Abx+2;交换位置 mov Abx,axcontinue:add bx,2 loop loop2 mov cx,di loop loop1,50,作业:Page193194 5.95.16,5.2 分支程序设计,5.2.1 分支程序的结构形式,1.双分支结构类似与C语言的if_else语句;2.多分支结构类似与C语言的switch_case语句;,5.2.2 分支程序设计方法,(1)逻辑尺控制(2)条件控制(3)地址跳跃表(值与地址有对应关系的表),常用的分支方法:,在实际程序设计中,很少有程序会从头到尾都是顺序执行的,绝大部分程序在执行过程中会根据一些条件的判断决定不同的处理方式或程序流向,这就是分支的概念。程序的流向是由CS和IP中的值决定的,当程序的转移仅在同一段内进行时,只需修改偏移地址IP的值;如果程序的转移是在不同段之间进行,则段基址CS和偏移地址IP均需要修改。,两要素:一是分支前的条件判断;二是根据判断结果进行转移。,例5.9:在附加段中,有一个按从小到大顺序排列的无符号字数组,其首地址存放在DI寄存器中,数组中的第一个单元存放着数组长度。在AX中有一个无符号数,要求在数组中查找(AX),如找到,则使CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF=1。,54,data segmentarray dw 12,11,22,33,44,55,66,77,88,99,111,222,333number dw 55low_idx dw?high_idx dw?data ends,例题5.9 折半查找算法(P177),搜索前,先查找两端的元素值,56,12 11 22 33 44 55 66 77 88 99111222333,0 1 2 3 4 5 6 7 8 9101112,(si)=0ah Cf=0查找成功,(si)=10hCf=1查找失败,折半算法1,57,lea di,array mov ax,number;要查找数 cmp ax,di+2;(ax)与第一个元素比较 ja chk_last lea si,di+2 je exit;(ax)第一个元素,找到退出 stc jmp exit;(ax)最后一个元素,未找到退出,算法1,58,compare:cmp ax,bx+si je exit ja higher dec cx mov high_idx,cx jmp midhigher:inc cx mov low_idx,cx jmp midno_match:stcexit:,search:mov low_idx,1 mov bx,di mov high_idx,bx mov bx,dimid:mov cx,low_idx mov dx,high_idx cmp cx,dx ja no_match add cx,dx shr cx,1 mov si,cx shl si,1,此时返回,SI的值应为相对于首元素的地址,LEA SI,ES:BX+SI,59,12 11 22 33 44 55 66 77 88 99111222333,0 1 2 3 4 5 6 7 8 9101112,(si)=0ah(di)=0ahCf=0查找成功,(si)=2(di)=10hCf=1查找失败,折半算法2,60,算法2,idx_ok:shr si,1 test si,1 jz sub_idx inc sisub_idx:sub di,si jmp short comparehigher:cmp si,2 je no_match shr si,1 jmpshort even_idxall_done:mov si,diexit:,search:mov si,dieven_idx:test si,1 jz add_idx inc siadd_idx:add di,sicompare:cmp ax,di je all_done ja higher cmp si,2 jne idx_okno_match:stc jmp exit,根据 AL 寄存器中哪一位为 1(从低位到高位),把程序转移到 8 个 不同的程序分支(P180例题5.10),branch_table dw routine1 dw routine2 dw routine3 dw routine4 dw routine5 dw routine6 dw routine7 dw routine8,例5.10 跳跃表法应用,cmp al,0;AL为逻辑尺 je continue lea bx,branch_tableL:shr al,1;逻辑右移 jnc add1 jmp word ptrbx;段内间接转移add1:add bx,type branch_table;add bx,2 jmp Lcontinue:routine1:routine2:,寄存器间接寻址实现跳跃表法,寄存器相对寻址实现跳跃表法,cmp al,0 je continue mov si,0 L:shr al,1;逻辑右移 jnc add1 jmp branch_tablesi;段内间接转移add1:add si,type branch_table jmp Lcontinue:routine1:routine2:,基址变址寻址实现跳跃表法,cmp al,0 je continue lea bx,branch_table mov si,7*type branch_table mov cx,8L:shl al,1;逻辑左移 jnc sub1 jmp word ptr bxsi;段内间接转移sub1:sub si,type branch_table;(si)-2 loop Lcontinue:routine1:routine2:,65,小 结,顺序、分支和循环是程序的3种基本控制结构。程序隐含以顺序方式执行,除非遇到转移类指令。实现多分支结构的主要方法有逻辑分解、地址表和转移表等,地址表较为常用。循环程序的控制方法主要包括计数控制、条件控制、开关控制与逻辑尺控制等。带重复前缀的串操作指令适用于处理连续的内存单元。,66,作业:Page194 5.175.2 3,