《指令系统应用举例》由会员分享,可在线阅读,更多相关《指令系统应用举例(23页珍藏版)》请在金锄头文库上搜索。
1、 指令系统应用举例指令系统应用举例 书例书例 2.2 P63MOV SI, OFFSET BUFFER1 ;源数据块首地址的偏移量送源数据块首地址的偏移量送SIMOV DI,OFFSET BUFFER2 ;目标首址的偏移量送目标首址的偏移量送DIMOV CX,200 ;数据块长度送数据块长度送CXNEXT:MOV AL,SI ;源数据块中一个字节传到源数据块中一个字节传到ALMOV DI,AL ;AL 传送到目标地址传送到目标地址INC SI ;SI 加加1INC DI ;DI加加1DEC CX ;CX减减1JNZ NEXT ;如不等于如不等于0,转移到,转移到NEXT 书例书例 2.3 P6
2、7MOV BP,SP ;设置基址指针寄存器;设置基址指针寄存器PUSH AX ;推入;推入AX,SP减减2PUSH BX ;推入;推入BX,SP减减4PUSH CX ;推入;推入CX,SP减减6MOV AX,BP-2 ;恢复;恢复AX原来的内容原来的内容MOV BX,BP-4 ;恢复;恢复BX原来的内容原来的内容MOV CX,BP-6 ;恢复;恢复CX原来的内容原来的内容ADD SP,6 ;恢复;恢复SP原来的内容原来的内容 书例书例2.6 P75要求计算两个多字节十六进制数之和:要求计算两个多字节十六进制数之和:3B74AC60F8H+20D59E36C1H=? MOV CX,5 ;循环次数
3、送;循环次数送CX MOV SI,0 ;SI初值为初值为0 CLC ;清进位标志;清进位标志CFLOOPER:MOV AL,DATA2SI ;取一个字节加数;取一个字节加数 ADC DATA1SI,AL ;与被加数相同且送回内存区与被加数相同且送回内存区 INC SI ;SI加加1,指向下一字节,指向下一字节 DEC CX ;循环次数减;循环次数减1 JNZ LOOPER ;如不为;如不为0,转,转LOOPER ;如为;如为0,运算结束,运算结束 书例书例2.7 P77计算计算4609+3875=? 设被加数和加数的每一位数都以设被加数和加数的每一位数都以ASCII码码形式存放在内存中,低位在
4、前,高位在后。形式存放在内存中,低位在前,高位在后。 LEA SI, STRING1 ;(SI)被加数地址指针被加数地址指针 LEA BX,STRING2 ;(BX)加数地址指针加数地址指针 LEA DI, SUM ;(DI)结果地址指针结果地址指针 MOV CX,4 ;(CX)循环次数循环次数 CLC ;清进位标志;清进位标志CFNEXT:MOV AL,SI ;取一个字节被加数;取一个字节被加数 ADC AL,BX ;与加数相加;与加数相加 AAA ;ASCII调整(非压缩)调整(非压缩) MOV DI,AL ;送存;送存 INC SI ;SI加加1INC BX ;BX加加1INC DI ;
5、DI加加1DEC CX ;循环次数减;循环次数减1JNZ NEXT ;如不为;如不为0,转,转NEXT ;如为;如为0,结束运算,结束运算 书例书例2.8 P81内存数据段存放了内存数据段存放了100个带符号数,首地址为个带符号数,首地址为AREA1,要求,要求将各数取绝对值后存入以将各数取绝对值后存入以AREA2为首址的内存区。为首址的内存区。 LEA SI, AREA1 ;(SI)源地址指针源地址指针 LEA DI,AREA2 ;(DI)目标地址指针目标地址指针 MOV CX,100 ;(CX)循环次数循环次数CHECK:MOV AL,SI ;取一个带符号数到;取一个带符号数到AL OR
6、AL,AL ;AL内容不变,但使之影响标志内容不变,但使之影响标志 JNS NEXT ;若;若(SF)=0,则转,则转NEXT NEG AL ;否则求补;否则求补NEXT: MOV DI,AL ;传送到目标地址;传送到目标地址 INC SI ;源地址加;源地址加1 INC DI ;目标地址加;目标地址加1 DEC CX ;循环次数减;循环次数减1 JNZ CHECK ;如不等于;如不等于0,则转,则转CHECK ;如等于;如等于0,转换结束,转换结束 书例书例2.9 P82在内存数据段从在内存数据段从DATA开始的存储单元中分别存放了开始的存储单元中分别存放了2个个8位位无符号数,试比较它们的
7、大小,并将大者传送到无符号数,试比较它们的大小,并将大者传送到MAX单单元。元。 LEA BX,DATA ;DATA偏移地址偏移地址BX MOV AL,BX ;第一个无符号数送;第一个无符号数送AL INC BX ;BX指向第二个无符号数指向第二个无符号数 CMP AL,BX ;两个数比较;两个数比较 JNC DONE ;如(;如(CF)=0,则转,则转DONE MOV AL,BX ;否则,第;否则,第2个无符号数送个无符号数送ALDONE:MOVE MAN,AL ;较大无符号数送;较大无符号数送MAX单元单元 ;比较结束;比较结束 书例书例2.10 P95 从偏移地址从偏移地址TABLE开始
8、的内存区中,存放着开始的内存区中,存放着100个字节的十六进制数,要求将这些数个字节的十六进制数,要求将这些数进行累加,并将累加和的低位存进行累加,并将累加和的低位存SUM单元,高位存单元,高位存SUM+1单元。单元。 LEA BX,TABLE ;(BX)数据表地址指针数据表地址指针 MOV CL,100 ;(CL)数据快长度数据快长度 XOR AX,AX ;清;清AL,AHLOOPER: ADD AL,BX ;加一个数到;加一个数到AL JNC GOON ;如;如(CF)=0,转到,转到GOON INC AH ;否则,;否则,AH加加1 GOON: INC BX ;地址指针加;地址指针加1
9、DEC CL ;计数值减;计数值减1 JNZ LOOPER ;如如(CL)不为不为0,转移到,转移到LOOPER MOV SUM,AX ;否则,否则,(SUN)AL, UM+1)(AH) ;累加结束累加结束 书例书例2.11 P97将一个将一个16位无符号数乘以位无符号数乘以10。该数原来存放在以。该数原来存放在以FACTOR为为首地址的两个连续的存储单元中(低位在前,高位在后)。首地址的两个连续的存储单元中(低位在前,高位在后)。MOV AX,FACTOR ;(AX)被乘数被乘数SHL AX,1 ;(AX)=FACTOR*2MOV BX,AX ;暂存;暂存BXSHL AX,1 ; (AX)=
10、FACTOR*4 SHL AX,1 ; (AX)=FACTOR*8ADD AX,BX ; (AX)=FACTOR*10 书例书例2.12 P98 将一个将一个16位无符号数除以位无符号数除以512。该数原来存放在。该数原来存放在DIVIDAND为为首地址的两个连续的存储单元中。首地址的两个连续的存储单元中。MOV AX,DIVIDAND ;(AX)被除数被除数SHR AX,1 ; (AX)= DIVIDAND/2XCHG AL,AH ; (AL) (AH),相当于循环右移,相当于循环右移8位位CBW ;清;清AX的高的高8位,位, ;(AX)= DIVIDAND/512 书例书例2.13 P1
11、03将数据段中首地址为将数据段中首地址为BUFFER1的的200个字节传送到个字节传送到附加段首地址为附加段首地址为BURRER2的内存区中。的内存区中。LEA SI, BUFFER1 ;(SI)源串首址指针源串首址指针LEA DI,BUFFER2 ;(DI)目标串首址指针目标串首址指针MOV CX, 200 ;(CX)字节串长度字节串长度CLD ;清方向标志;清方向标志DFREP MOVSB ;传送;传送200个字节个字节 ;传送结束;传送结束 书例书例2.14 P104 比较两个字符串。找出其中第一个不相当字符串的地址。如果两字符串全部相同,比较两个字符串。找出其中第一个不相当字符串的地址
12、。如果两字符串全部相同,则转到则转到ALLMATCH进行处理。这两个字符串长度均为进行处理。这两个字符串长度均为20,首地址分别为,首地址分别为STRING1和和STRING2LEA SI,STRING1 ; (SI)字符串字符串1首地址首地址LEA DI,STRING2 ; (DI)字符串字符串2首地址首地址MOV CX,20 ; (CX)字符串长度字符串长度CLD ;清方向标志;清方向标志DFREPE CMPSB ;如相等,重复进行比较;如相等,重复进行比较JCXZ ALLMATCH ; 若若(CX)=0,跳至,跳至ALLMATCHDEC SI ;否则;否则(SI)-1DEC DI ; (
13、DI)-1JMP DONE ;跳转至;跳转至 标号标号DONEALLMATCH:MOV SI,0 MOV DI,0DONE: ;比较结束;比较结束 书例书例2.15 P105 在包含在包含100个字符的字符串中寻找第一个回车符个字符的字符串中寻找第一个回车符CR(其其ASCII码为码为ODH),找到后将其地址保留在,找到后将其地址保留在(ES:DI)中,并在屏幕上显示字符中,并在屏幕上显示字符“Y”。如果字符串中没有回车符,则在屏幕上显示。如果字符串中没有回车符,则在屏幕上显示“N”。该字符串。该字符串的首地址为的首地址为STRING。LEA DI,STRING ; (DI)字符串首地址字符串
14、首地址MOV AL,0DH ; (AL)回车符回车符MOV CX,100 ; (CX)字符串长度字符串长度CLD ;清标志位;清标志位DFREPNE SCASB ;如未找到,重复扫描;如未找到,重复扫描JZ MATCH ;如找到,转;如找到,转MATCHMOV DL,N ;字符串中无回车符,则;字符串中无回车符,则(DL)NJMP DSPY ;转到;转到DSPYMATCH:DEC DI ; (DI)-1 MOV DL,Y ; (DI)YDSPY: MOV AH,02 ;显示字符;显示字符 INT 21H ;搜索结束;搜索结束 书例书例2.16 P106 内存中以内存中以BUFFER为首地址的缓
15、冲区内有为首地址的缓冲区内有10个以不压缩个以不压缩BCD码码形式存放的十进制数,它们的值可能是形式存放的十进制数,它们的值可能是0-9中的任意一个,将这中的任意一个,将这些十进制数顺序显示在屏幕上。些十进制数顺序显示在屏幕上。 LEA SI,BUFFER ; (SI)缓冲区首地址缓冲区首地址 MOV CX,10 ; (CX)字符串长度字符串长度 CLD ;清标志位;清标志位DF MOV AH,02 ; (AH)功能号功能号GET:LODSB ;取一个;取一个BCD码到码到AL ADD AL,30H ; BCD码转换为码转换为ASCII码码 MOV DL,AL ; (DL)字符字符 INT 2
16、1H ;显示;显示 DEC CX ; (CX)-1 JNZ GET ;未完成;未完成10个字符则重复个字符则重复 书例书例2.17 P107将字符将字符“#”装入以装入以AREA为首址的为首址的100个字节中。个字节中。 LEA DI,AREAMOV AX,#MOV CX,50CLDREP STOSW 书例书例2.18 P107一个数据块由大写或小写的英文字母、数字和其他各种符号一个数据块由大写或小写的英文字母、数字和其他各种符号组成,其结束符是回车符组成,其结束符是回车符CR (其其ASCII码为码为ODH),数据块,数据块的首地址为的首地址为BLOCK1。要求将数据块传送到。要求将数据块传
17、送到BLOCK2为首地为首地址的内存区,并将其中所有英文小写字母址的内存区,并将其中所有英文小写字母(a-z)转换成相应的转换成相应的大写字母大写字母(A-Z),其余不变。,其余不变。 LEA SI,BLOCK1 ; (SI)源地址指针源地址指针 LEA DI,BLOCK2 ; (DI)目标地址指针目标地址指针 CLD ;清方向标志;清方向标志DFNEXT:LODSB ;取一个字符到;取一个字符到AL CMP AL,0DH ;是否是回车符;是否是回车符 JZ DONE ;是,转;是,转DONE CMP AL,61H ;否则,是否小于;否则,是否小于a JC OK ;是,则转是,则转OK CMP
18、 AL,7BH ;是否大于;是否大于z JNC OK ;是,则转是,则转OK SUB AL,20H ;否则,否则,AL减减20HOK: STOSB ;送存;送存 JMP NEXT ;转移到;转移到NEXTDONE: 例例2.19 P113在内存的数据段中存放了若干个在内存的数据段中存放了若干个8位带符号数,其数据块的位带符号数,其数据块的长度为长度为COUNT(不超过(不超过255),首地址为),首地址为TABLE,试统计,试统计其中正元素、负元素、零元素的个数,并分别将个数存入其中正元素、负元素、零元素的个数,并分别将个数存入PLUS、MINUS、ZERO单元。单元。XOR AL,AL ;(
19、AL)0MOV PLUS,AL ; 清清PLUS单元单元MOV MINUS,AL ;清;清MINUS单元单元MOV ZERO,AL ;清;清ZERO单元单元LEA SI,TABLE ; (SI)数据块首地址数据块首地址MOV CX,COUNT ; (CX)数据块长度数据块长度CLD ;清标志位;清标志位DFCHECK:LODSB ;取一个数到;取一个数到AL OR AL,AL ;使数据影响标志位;使数据影响标志位 JS X1 ;如为负,转;如为负,转X1 JZ X2 ;如为零,转;如为零,转X2 INC PLUS ;否则为正,;否则为正,PLUS单元加单元加1 JMP NEXTX1: INC
20、MINUS ; MINUS单元加单元加1 JMP NEXTX2: INC ZERO ; ZERO单元加单元加1NEXT: LOOP CHECK ;CX减减1,如不为,如不为0,则转,则转 CHECK 例例2.20 P113在以在以DATA为首地址的内存数据段中,存放了为首地址的内存数据段中,存放了100个个16位带位带符号数,试将其中最大和最小的带符号数找出来,分别存放符号数,试将其中最大和最小的带符号数找出来,分别存放到以到以MAX和和MIN为首地址的内存单元中。为首地址的内存单元中。 LEA SI,DATA ; (SI)数据块首地址数据块首地址 MOV CX,100 ; (CX)数据块长度
21、数据块长度 CLD ;清方向标志;清方向标志DF LODSW ;送一个;送一个16位带符号数到位带符号数到AX MOV MAX,AX ;送;送MAX单元单元 MOV MIN,AX ;送;送MIN单元单元 DEC CX ; (CX)-1NEXT: LODSW ;取下一个;取下一个16位带符号数位带符号数 CMP AX,MAX ;与;与MAX单元内容比较单元内容比较 JG GREATER ;大于;大于MAX,则转,则转GREATER CMP AX,MIN ;否则,与;否则,与MIN单元比较单元比较 JL LESS ;小于;小于MIN,转,转LESS JMP GOON ;否则,转;否则,转GOONGREATER:MOV MAX,AX ;(MAX)(AX) JMP GOON ;转;转GOONLESS: MOV MIN,AX ;(MIN)(AX)GOON: LOOP NEXT ;CX减减1,不等于,不等于0转转NEXT 作业:作业: