福建农林大学汇编实验四子程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
START:MOVAH,01
INT 21H
MOVDL,AL
MOVAH,02
INT 21H
MOVAL,0
MOVAH,4CH
INT 21H
CSEGENDS
ENDSTART
【题6代码】
STACKSSEGMENTSTACK
DW128DUP(?)
STACKSENDS
DSEGSEGMENT
MSGDB0DH,0AH,'$'
【题二】
按要求把s31 s32分别汇编连接形成一个s31.exe文件,如下
汇编s31
汇编s32
Link s31 s32
形成一个s31.exe的文件
【题三】编写代码如下
运行结果如下图
BUF1=’HELLO WORLD!’
BUF2=’HOLLO WOLLD~’比较可知BUF1与BUF2中不同的字符有ER!,结果与预期一致
MOVDS, AX
LEASI, BUF1
MOVCX, LEN1
CALLCMMP
LEASI, BUF2
MOVCX, LEN2
CALLCMMP
MOVAH, 4CH
INT21H
CMMPPROC
MOVDX, SI
CMP1:CMPBYTE PTR[SI],'n'
JNENOTN
MOVAL,'y'
MOV[SI], AL
MOVAH,02H
INT21H
RET
MADDENDP
CODEENDS
ENDSTART
2)阅读S31.ASM和S32.ASM两个模块中的程序,并分别汇编,然后连接成一个可执行文件S31.EXE。
具体步骤如下:
MASM S31.ASM(分别汇编)
MASM S32.ASM
LINK S31 S32(将两个文件连接成为一个文件名为S31)
INT21H
TRANPROCNEAR;将输入的ASCII码转换成2进制数
ANDAX,0F0FH;将ASCII码转换成非压缩BCD码,
;高位在AL中
MOVBL,AH
MOVCL,10D
MULCL
ADDAL,BL
RET
TRANENDP
CODEENDS
ENDSTART
NAMES32.ASM
PUBLICDISP
MOVCX,LEN
CALL CMPP
MOVAH, 4CH
INT 21H
CMPP PROCNEAR;子程序
L1:MOVDL,[SI]
CMPDL,[DI]
JZ NEXT
MOVAH,02H
INT 21H
NEXT:INCSI
INCDI
LOOP L1
RET;子程序返回
CMPP ENDP
CODEENDS
ENDSTART
题3及4,5,6按要求编写即可
5.调试过程

6.实验结果
【题一】
实验结果如下
有上图可知,当程序运行到call语句之前,SP一直保持0000不变,而IP则一直在增加。继续单步执行程序
由上图,当程序在RET语句之前运行时,SP、IP每次都是分别按2和1递增,当运行到RET语句时,SP还是按照2来递增,而IP出现了变化,这次却减少了很多,说明指针回撤执行下一个循环。
【题4代码】
DATASEGMENT
BUF1DB'aaanaannaaan',0ah,0dh,'$'
LEN1=$-BUF1
BUF2DB'bbnnnbbbbnnn','$'
LEN2=$-BUF2
DATAENDS
CODESEGMENT
ASSUMECS: CODE, DS: DATA
START:MOVAX, DATA
CODESEGMENTPARA‘CODE’
ASSUMECS:CODE
START:MOVAH,01H
INT21H
MOVBL,AL
INT21H
MOVAH,AL
MOVAL,BL
CMPAX,3030H
JEEXIT
CALLNEAR PTR TRAN
CALLFAR PTR disp
JMPSTART
EXIT:MOVAH,4CH
IFra Baidu bibliotekT 21H
MOVAL,0
MOVAH,4CH
INT 21H
CSEGENDS
ENDSTART
MOVAH, 02H
INT21H
DECCH
JNZROLL
RET
DISPENDP
CODE1ENDS
END
5)编一个子程序:输入一个字符,显示出来。
6)编一个子程序:输入一个字符串,显示出来。
4.算法描述及实验步骤
题1:依题输入相应的代码如下,运行->调试->单步执行,对CALL语句和RET语句观察SP,IP的变化,并用D命令查看栈顶的内容。
附录:
【题3代码】
DATASEGMENT
BUF1DB'HELLO WORLD!'
LEN=$-BUF1
BUF2DB'HOLLO WOLLD~'
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX, DATA
MOVDS, AX
LEASI, BUF1
LEADI, BUF2
BUFDB20,?,20DUP(?)
DSEGENDS
CSEGSEGMENTPARA PUBLIC'CODE'
ASSUMECS:CSEG,DS:DSEG
START:MOVAX,DSEG
MOVDS,AX
LEADX,BUF
MOVAH,0AH
INT 21H
LEADX,MSG
MOVAH,09
INT 21H
LEADX,BUF+2
S31.EXE(运行)
3)编程:利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。(也可以将找到的不相等字符逐个显示,用INT 21H的02功能调用)
4)编程:子程序搜索指定字符缓冲区中是否有N,如果有用Y替代。调用子程序将BUF1,BUF2,BUF3中的N全部用Y替代。
CODE1SEGMENTPARA‘CODE’
ASSUMECS: CODE1
DISP PROC FAR
MOVBL, AL
MOVBH, 00
MOVCH, 4
ROLL:MOVCL, 4
ROLBX, CL
MOVDL, BL
ANDDL, 0FH
CMPDL, 9
JBENEXT1
ADDDL, 07H
NEXT1:ADDDL, 30H
【题四】
编写代码如下
运行结果如下图
分析:有图可知,结果将BUF1和BUF2中的n改为了y完成题目要求.
【题五】编一个子程序:输入一个字符,显示出来
编写代码如下
【题六】编一个子程序:输入一个字符串,显示出来
编写代码如下
7.总结
通过本次上机实验,学会了子程序的编写和主子程序的调用,并且掌握了在不同模块间程序的调用和调试。在本次实验中,再一次加深了对汇编程序的汇编以及连接运行的方法。
附源程序:
NAME S31.ASM
不同模块间的段间调用。从键盘输入2位非压缩BCD数,存入AX寄存器中。为了将其转换为二进制数,编写一个子程序TRAN。显示子程序DISP完成将16进制数转换为对应的ASCII码并显示该字符,显示子程序在另一模块S32中。输入数据为00时结束。
EXTRNDISP:FAR
福建农林大学计算机与信息学院实验报告
系:计算机专业:计算机科学与技术年级:2014
姓名学号:实验室号__计算机号
实验时间:2016-10-29指导教师签字:刘庆连成绩:
实验
1.实验目的
(1)学习子程序的编写,主子程序的调用;
(2)不同模块间程序的调用和调试。
2.实验内容
1)数据段中的3个字符,调用子程序将其逐个显示出来。子程序的功能是显示一个字符。单步执行,对CALL语句和RET语句观察SP,IP的变化,并用D命令查看栈顶的内容。
NOTN:INCSI
LOOPCMP1
MOVAH, 09H;显示字符串
INT21H
RET
CMMPENDP
CODEENDS
ENDSTART
【题5代码】
STACKSSEGMENTSTACK
DW128DUP(?)
STACKSENDS
CSEGSEGMENTPARA PUBLIC'CODE'
ASSUMECS:CSEG
DATASEGMENT
MAGDB‘ABC’
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVSI,0
MOVCX,3
LL:MOVDL,MAG[SI]
CALLMADD
INCSI
LOOPLL
MOVAH,4CH
INT21H
MADDPROC
相关文档
最新文档