微机作业文档格式.docx
《微机作业文档格式.docx》由会员分享,可在线阅读,更多相关《微机作业文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
2.3程序框图9
2.4程序代码9
2.5程序结果为11
3、第13.3题11
3.1题目分析12
3.2寄存器及主存的应用说明12
3.3程序框图14
3.4程序代码14
3.5程序结果17
1、第13.1题
请将内存中SOURCE处的10个字型有符号数分成正数数组PLUS和负数数组MINUS,并统计这两个数组的数据个数,结果分别存放到字节变量PNUM(存正数个数)和MNUM(存负数个数)中。
1.1题目分析
本题应该先给三变量数组赋予地址,设循环变量CX=10,然后依次判断SOURCE处的字型有符号数的正负,若为正则存放到PNUM,字节变量PNUM+1,DI+2,SI+2;
若为负存入MINUS,字节变量MNUM+1,DI+2,SI+2,循环10次。
本题利用LODSW,STOSW,XCHG等语句操作,可以使结构精简,程序代码少。
预期结果:
SOURCE=1E00H,9100H,7400H,9700H,4200H,3000H,8100H,3F00H,1800H,2500H
PLUS=1E00H,7400H,4200H,3000H,3F00H,1800H,2500H,0000H,0000H,0000H
MINUS=9100H,9700H,8100H,0000H,0000H,0000H,0000H,0000H,0000H,0000H
PNUM=07H
MNUM=03H
1.2寄存器及主存的应用说明
依次定义了数据的存储模式,堆栈段,数据段。
数据段中定义要求的数组,计算机为其分配存储空间。
本题中用到了通用寄存器中的数据寄存器BX、AX;
变址寄存器SI、DI;
段寄存器DS、ES。
BX、SI、DI分别存储MINUS、SOURCE、PLUS数组的偏移地址。
数据段寄存器DS与SI联用寻址数据段中的源操作数,附加段寄存器ES与DI联用寻址附加段中的目的操作数,同时SI和DI能够自动增量或减量。
1.3程序框图
1.4程序代码
.MODELSMALL
.STACK
.DATA
SOURCEDW1E00H,9100H,7400H,9700H,4200H,3000H,8100H,3F00H,1800H,2500H
COUNTEQU($-SOURCE)/2
PLUSDWCOUNTDUP(?
)
MINUSDWCOUNTDUP(?
PNUMDB0
MNUMDB0
.CODE
.STARTUP
MOVSI,OFFSETSOURCE;
给SI赋予SOURCE的偏移地址
MOVDI,OFFSETPLUS;
给DI赋予PLUS的偏移地址
MOVBX,OFFSETMINUS;
给BX赋予MINUS的偏移地址
MOVAX,DS;
所有数据都在数据段中,故设置ES=DS
MOVES,AX
MOVCX,COUNT;
给循环变量CX赋值
CLD
AGAIN:
LODSW;
字串读取:
ALDS:
[SI];
然后:
SISI+2
CMPAX,0;
检测符号位,判断是正是负
JLFUSHU;
小于0,是负数,转向FUSHU
JZNEXT;
等于0,不处理,跳转到NEXT
STOSW;
大于0,是正数,存入PLUS;
DIDI+2
INCPNUM;
字节变量PNUM+1
JMPNEXT:
跳转到NEXT
FUSHU:
XCHGBX,DI
把负数存入MINUS;
INCMNUM;
字节变量MNUM+1
NEXT:
LOOPAGAIN
.EXIT
END
1.5程序结果为?
2、第13.2题
对一个由可打印的ASCⅡ组成的字符串(其ASCⅡ码值在20H-7FH之间,最后以00H结束),可按照如下办法对其进行压缩:
从字符串首开始向后扫描,若某字符串单独出现则该字符不变;
若某字符连续出现N次,则该字符用ESC(1BH),N,原字符共3个字节来代替,设内存中SOURC处有一个按上述方法进行压缩的字符串,以00H结束。
现要求对其进行解压缩,假定解压后的字符串长度不超过100.处理结果存放到RESULT处。
2.1题目分析
本题应先判断给出的字符里是否有1BH,若有则得N值,进而得到连续字符,若无直接送到目标地址,继续搜寻,直到扫描到00H为止,并将最终结果存储在规定的内存单元中。
本题的注意事项是扫描到1BH之后,如何获得连续字符。
SOURCE=41H,1BH,06H,43H,61H,00H
RESULT=41H,43H,43H,43H,43H,43H,43H,61H,00H
2.2寄存器及主存的应用说明
变址寄存器SI。
BX、SI分别存储SOURCE、RESULT数组的偏移地址。
AX寄存器常用于算术运算、逻辑运算以及外设传送信息等。
2.3程序框图
2.4程序代码
SOURCEDB41H,1BH,06H,43H,61H,00H
RESULTDB100DUP(?
MOVBX,OFFSETSOURCE;
给BX赋予SOURCE的偏移地址
MOVSI,OFFSETRESULT;
给SI赋予RESULT的偏移地址
MOVAL,[BX]:
将SOURCE的值传递给AL
CMPAL,1BH;
检测字符1BH
JEWEI;
若有字符1BH,则跳转到WEI
MOV[SI],AL;
若无字符1BH,则将AL内容送到RESULT
CMPAL,0
JEOVER;
若有字符00H,则结束循环
INCBX;
BX+1
INCSI;
SI+1
JMPAGAIN
WEI:
MOVCH,0
MOVCL,[BX];
取CX=N
INCBX
FENG:
MOVAL,[BX]
将BX里的值赋给RESULT
LOOPFENG;
循环N次
JMPAGAIN;
跳转到AGAIN
OVER
2.5程序结果为
SOURCE=41H,1BH,06H,43H,61H,00H
3、第13.3题
内存中NUMA和NUMB处各存放着10个字节型有符号数,分别为Ak和Bk(k=0,1,…,9)。
从键盘输入一个字符,若输入的字符为‘+’,则计算Ck=∣Ak∣+∣Bk∣,结果保存到字型变量NUMC处,程序结束;
若输入的字符为‘*’,则计算Ck=∣Ak∣*∣Bk∣,结果保存到字型变量NUMC处,程序结束;
若输入的是其他字符,则在下一行显示‘ERROR’,程序结束。
3.1题目分析
本题应先判断输入的字符是否为*或+,并进行对应的操作,若为*或/+,为两个字型有符号数的绝对值(正数取本身,负数则取反加1变为绝对值)相乘或相加,即用到乘法指令mulr16/m16或adddest,src,并将结果存储在规定的内存单元中。
本题的注意事项在于其乘数为字型有符号数,题目要求取反,乘积为双字,需要控制其结果存储的位置,以达到规定要求。
NUMC=0080H,0090H,0078H,004DH,004CH,00A2H,00DEH,0087H,002FH,00D0H;
’+’
NUMC=0700H,086FH,072CH,044EH,0000H,16FDH,2FA8H,0C4EH,0138H,295FH;
’*’
3.2寄存器及主存的应用说明
本题中用到了通用寄存器中的数据寄存器BX、AX、CX;
变址寄存器SI、DI。
BX、SI、DI分别存储NUMA、NUMB、NUMC数组的偏移地址。
变址寄存器SI和DI,常用于存储器变址寻址方式时提供地址。
CX为计数寄存器,常用于计数控制循环程序中。
3.3程序框图
3.4程序代码
NUMADB10H,11H,12H,13H,00H,95H,86H,97H,08H,89H
COUNTEQU$-NUMA
NUMBDB90H,81H,66H,3AH,4CH,37H,64H,1EH,27H,59H
NUMCDWCOUNTDUP(?
ERRORDB0DH,0AH,'
ERROR!
$'
MOVSI,OFFSETNUMA;
给SI赋予NUMA的偏移地址
MOVDI,OFFSETNUMB;
给DI赋予NUMB的偏移地址
MOVBX,OFFSETNUMC;
给BX赋予NUMC的偏移地址
循环次数CX=10
MOVAH,01H
INT21H;
输入一个字符
CMPAL,'
+'
;
比较AL与+
JZWEI;
相等,跳转到WEI
CMPAL,’*’;
比较AL与*
JZFENG;
相等,跳转到FENG
MOVAH,09H
MOVDX,OFFSETERROR;
显示ERROR
JMPDONE;
跳转到DONE
CMPBYTEPTR[SI],0;
比较SI中字节型数据与0的大小
JLF1;
小于0跳转到F1
CMPBYTEPTR[DI],0;
比较DI中字节型数据与0的大小
JLF2;
小于0跳转到F2
MOVAL,[SI];
将SI中的偏移地址移动到AL中
ADDAL,[DI];
将DI中的偏移地址与AL中的偏
移地址相加并移动到AL中去
MOVAH,0;
AH置0
MOV[BX],AX;
将AX移动到BX中去并存为BX的偏移地址
SI加1
INCDI;
DI加1
ADDBX,2;
将2与BX相加并移动到BX中去
LOOPWEI;
循环WEI
F1:
NEGBYTEPTR[SI];
将SI偏移地址中的字节型数据求反
JMPWEI;
跳转到WEI
F2:
NEGBYTEPTR[DI];
将DI偏移地址中的字节型数据求反
JLF3;
小于0跳转到F3
JLF4;
小于0跳转到F4
将SI中的偏移地址转移到AL中去
MULBYTEPTR[DI];
无符号数字节型数据相乘
将AX移动到BX中去并存为BX的偏移地址
将2加到BX中去
循环FENG
F3:
JMPFENG;
跳转到FENG
F4:
DONE:
3.5程序结果
程序结果为