实验三简单编程练习姓名:学号:1.在一个数据块中找出最大数。假设有数据22、46、32、72、84、16,且为不带符号的正整数,数据块的长度放在CX寄存器中,找出的最大数存放在以MAXN为符号的单元中。程序:DATASEGMENTNUMDB22,46,32,72,84,16MAXNDB?DATAENDSMAINSEGMENTASSUMECS:MAIN,DS:DATASTART:MOVAX,DATAMOVDS,AX;将DATA地址传送到DS中MOVCX,5;将长度5传送到CX中MOVAL,00;将AL置0LEABX,NUM;将NUM的偏移地址传送到BX中AGAIN:MOVAL,[BX]CMPAL,[BX+1]JNBENEXTMOVAL,[SI+1]MOVMAXN,AL;将NUM中的数进行比较,并将较大的数传送到MAXN中NEXT:INCBXMOVMAXN,ALLOOPAGAIN;重复进行AGAIN选出最大数MAINENDSENDSTART结果:[DS:0006]=54H2.求无符号字节数据之和,和数为8位二进制数。假设有数据38、55、26、12、23,数据块的长度存放在CX寄存器中,和数存放在以SUM为符号的单元中。程序:DATASEGMENTNUMDB38,55,26,12,23SUMDB?DATAENDSMAINSEGMENTASSUMECS:MAIN,DS:DATASTART:MOVAX,DATAMOVDS,AX;将DATA地址传送到DS中SUBAX,AX;将AX置零MOVCX,4;将数据块长度传送到CX中MOVAL,[BX]LEABX,NUM;将NUM的偏移地址传送到BX中AGAIN:MOVAH,[BX+1]ADCAL,AHINCBXLOOPAGAINMOVSUM,AL;将数据块中的数据进行相加,并将得到结果传送到SUM中MAINENDSENDSTART结果:[DS:0005]=9AH3.求无符号字节数据之和,和数为16位二进制数。假设有数据58、25、45、73、64、43,数据块的长度存放在CX寄存器中,和数存放在以SUM为符号的单元中。程序:DATASEGMENTNUMDB58,25,45,73,64,43SUMDW?DATAENDSMAINSEGMENTASSUMECS:MAIN,DS:DATASTART:MOVAX,DATAMOVDS,AX;将DATA地址传送到DS中SUBAX,AX;将AX置零MOVCX,4;将数据块长度传送到CX中MOVAL,[BX]LEABX,NUM;将NUM的偏移地址传送到BX中AGAIN:MOVAH,[BX+1]ADCAL,AHINCBXLOOPAGAINMOVSUM,AL;将数据块中的数据进行相加,并将得到结果传送到SUM中MAINENDSENDSTART结果:[DS:0006]=0134H4.求两个十进制数相乘的积(56093*5=?),被乘数和乘数均以非组合BCD码表示,并存放在内存中,乘积存放在以SUM为符号的单元中。程序:DATASEGMENTNUM1DB03,09,00,06,05NUM2DB05SUMDB6DUP(00)DATAENDSMAINSEGMENTASSUMECS:MAIN,DS:DATASTART:MOVAX,DATAMOVDS,AX;将DATA地址传送到DS中SUBAX,AX;将AX置零LEASI,NUM2;将NUM2的偏移地址传送到SI中MOVDL,[SI];将SI传送到DL中LEASI,NUM1;将NUM1的偏移地址传送到SI中LEADI,SUM;将SUM的偏移地址传送到DI中MOVCX,5;将数据块长度传送到CX中AGAIN:MOVAL,[SI]MULDLINCSIAAMADDAL,[DI]AAAMOV[DI],ALINCDIMOV[DI],AHLOOPAGAINMOVSUM,AL;将数据块中的数据进行相乘,并将得到结果传送到SUM中MAINENDSENDSTART结果:[DS:0006-DS:000B]中的内容分别为:05,06,04,00,08,02即56093*5=2804655.试分别用数据传送指令和串传送指令编写程序,将以STR1为首地址的字节存储单元中的数据30H、31H、32H、33H、34H、35H、36H、37H、38H、39H、40H、41H、42H、43H、44H45H,传送到以STR2为首地址的字节存储单元中。程序:数据传送:DATASEGMENTSTR1DB30H,31H,32H,33H,34HDB35H,36H,37H,38H,39HDB40H,41H,42H,43H,44H,45HCOUNTEQU$-STR1STR2DBCOUNTDUP(0)DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AX;将DATA地址传送到DS中LEASI,STR1;将STR1的偏移地址传送到SI中LEADI,STR2;将STR2的偏移地址传送到DI中MOVCX,COUNT;将数据块长度传送到CX中NEXT:MOVAL,[SI]MOV[DI],ALINCSIINCDILOOPNEXT;将STR1中的数据传送到STR2中CODEENDSENDSTART串传送:DATASEGMENTSTR1DB30H,31H,32H,33H,34HDB35H,36H,37H,38H,39HDB40H,41H,42H,43H,44H,45HCOUNTEQU$-STR1STR2DBCOUNTDUP(0)DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,ES:DATASTART:MOVAX,DATAMOVDS,AX;将DATA地址传送到DS中MOVES,AX;将DATA地址传送到ES中LEASI,STR1;将STR1的偏移地址传送到SI中LEADI,STR2;将STR2的偏移地址传送到DI中MOVCX,COUNT;将数据块长度传送到CX中CLDREPMOVSB;将STR1中的数据传送到STR2中CODEENDSENDSTART问题:1.数据传送指令和串传送指令两种传送各有何特点?答:MOV不能直接由存储器到存储器传送,必须经寄存器中转,MOVS是存储器到存储器的直接传送;MOV指令执行完后,源和目的指针不变,MOVS执行一次后,SI和DI自动变化;MOV的源位置和目标位置都是自己指定的,MOVS的源串固定用SI指出,目的串固定用DI指出;2.例题中,”CMPBL,00”指令有何作用?答:判断BL中的数是否为正数