科学网

 找回密码
  注册

tag 标签: 汇编

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

融智学(早期作品)
geneculture 2018-10-4 18:44
珠海邹晓辉 部分论著与编著的超级连接目录: 探索与创新 融智 学 Co Intelligence Science (珠海) 邹晓辉(Zou Xiao Hui) 著 《 融智学原创文集 》( 协同智能 科学的理论与实践的初步探讨 纪实) 信息学基础研究 字本位与中文信息处理 学习与继承 英文论著汇集 (珠海) 邹晓辉(Zou Xiao Hui) 编 《 西方古代哲学家评介的英文共享平台 》(文集) 《 西方近现代哲学家评介英文共享平台 》 (文集) 《 (PHILOSOPHY OF SCIENCE) ( 科学哲学 文集) 》 《 (PHILOSOPHY OF MIND) ( 心智哲学 文集) 》 《 (PHILOSOPHY OF LOGIC) ( 逻辑哲学 文集) 》 《 (PHILOSOPHY OF LANGUAGE) ( 语言哲学 文集) 》 《 人工智能科学——普及、探讨和提高 》(文集) 《 操作系统的历史,现状与未来 》(文集) 《 程序语言的历史,现状与未来 》(文集) 《 Mathematics , Physics and Chemistry (数学、物理学和化学)》话题汇总 将陆续上载的部分: 探索与创新 融智 学 Co_Intelligence Science (珠海) 邹晓辉(Zou XiaoHui) 著 理论探讨和工程实践 信息的 概念化 处理 ——哲学分析 语义 、信息与智 (慧、力、能) ——科学分析 《 理论融智学 》(“语义、信息与智”的统一框架)   《 应用融智学 》(“产学研用算”一体化管理方法) 信息的 形式化 处理 ——技术操作 《 工程融智学 》( 自然语言理解的间接形式化方法 ) 邹晓辉早期探索文集(1976-1996回顾与 述评 ) 邹晓辉近期创新文集(1997-2006回顾与 述评 ) 邹晓辉网上对话整理 ( 2000-2006回顾与 述评) 《 信息学的历史,现状与未来 》( 述评)   《(直接采用信息这个词的) 信息科学 》(述评) (国内部分:国内学者及其文选) (国外部分:国外学者及其文选)   《(直接采用信息这个词的) 信息哲学 》(述评) (国内部分:国内学者及其文选) (国外部分:国外学者及其文选)     学习与继承 英文论著汇集 (珠海) 邹晓辉(Zou XiaoHui) 编   《the Initiators of Information Theory(信息理论创立者文集) 》 《 标准信息交换码 的历史,现状与未来》(文集)   《 数据库以及数据仓库 的历史,现状与未来》(文集)   《 计算机科学 的历史,现状与未来》(文集)   《21世纪初自然科学前沿(代表人物评传文集)》   《21世纪初经济学前沿(代表人物评传文集)》   《21世纪初数学前沿(代表人物评传文集)》   《21世纪初计算机科学前沿(代表人物评传文集) 》  
个人分类: 融智学前期探索|0 个评论
供报考“安全工程”专业的考生和家长参考的文章汇编
After50 2012-6-10 20:40
供报考“安全工程”专业的考生和家长参考的文章汇编 一年一度的高考刚刚结束,考生和家长接着又忙乎起选择高校和专业的事情。由于博主系安全工程专业的老师,自觉得有义务对本专业情况加以介绍,但绝非为安全工程专业做广告。考生和家长是否选择安全工程专业,还要依靠自己的综合判断。以下仅提供一些给有意选择安全工程专业的考生和家长做决策时的参考文章链接,这些文章都是博主的博文。 安全工程专业女生就业的谋略和智慧 http://blog.sina.com.cn/s/blog_4d19aa510100nwgo.html 我国安全工程专业人才培养模式与国外的比较 http://blog.sina.com.cn/s/blog_4d19aa510100nk52.html 我国安全工程专业高等教育的基本情况 http://blog.sina.com.cn/s/blog_4d19aa510100nk4t.html 安全工程专业就业排名 http://blog.sina.com.cn/s/blog_4d19aa510100m3e8.html 献给安全工程专业毕业生找工作的 12 条建议 http://blog.sina.com.cn/s/blog_4d19aa510100lae6.html 安全类专业研究生的就业情况 http://blog.sina.com.cn/s/blog_4d19aa510100jpxy.html 中南大学安全工程专业本科毕业生就业单位行业与单位性质 http://blog.sina.com.cn/s/blog_4d19aa510100izo2.html 中南大学安全工程本科专业接受全国工程专业认证现场考查 http://blog.sina.com.cn/s/blog_4d19aa510102e6eg.html 安全工程专业的优劣势及其扬长避短 http://blog.sina.com.cn/s/blog_4d19aa510100bpq5.html 中南大学安全工程专业本科人才培养方案( 2012 版) http://blog.sina.com.cn/s/blog_4d19aa510102e74n.html 中南大学安全工程专业本科生培养方案 http://blog.sina.com.cn/s/blog_4d19aa510100iyp3.html 我国安全工程专业人才的培养模式 http://blog.sina.com.cn/s/blog_4d19aa510100nk4x.html 国外安全科学与安全学科的发展简况 http://blog.sina.com.cn/s/blog_4d19aa510101823q.html 普通高等学校本科专业目录 http://blog.sina.com.cn/s/blog_4d19aa510100r12e.html 美国高校安全健康类专业一览 http://blog.sina.com.cn/s/blog_4d19aa5101000blk.html 更多链接 http://blog.sina.com.cn/safetyculture
个人分类: 教学资源|3497 次阅读|0 个评论
第八届国际地面沉降学术研讨会论文摘要全集PDF文本
热度 2 gongshiliang 2010-11-1 23:48
第八届国际地面沉降学术研讨会 ( Eighth International Symposium on Land Subsidence , EISOLS 20 10 ) 已于2010年10月16日~24日在墨西哥举行。在此提供本届会议论文摘要全集的PDF文本,供参阅。其中含会议日程安排等相关资讯的详尽信息,文集后还附有论文作者索引(P83-85),曾提交材料并被会议接受的作者,可在文集中方便地查找到自己的文章。 另外,国际水文科学协会(IAHS)以339连续系列号,出版本届会议的论文全文。在此也附上该文集的目录页,供研究参阅。 【 1 】 会议论文摘要 PDF 文本 (本人的三篇材料分别在第14页、第65页、第71页;学术交流安排在第iv、vii、x页的Oral与Poster日程表内) 【 2 】 会议论文集目录 PDF 文本 (本人的两篇材料分别刊在第102页、第419页) 【3】 会议日程安排 PDF 文本 【4】 会议学术交流 PDF 文本 (本人的三篇材料分别被安排为Oral:10月18日18:00-18:20、10月22日10:00-10:20;Poster:S5.3)
个人分类: 地面沉降|4198 次阅读|3 个评论
一个简单的加法程序,一些指令的思考
Kupeprntlkn 2010-9-15 11:38
今天上午又重新回头看了下已前的一个加法程序,比以前思考多了好多东西,有些东西原来一直没理解透彻 下面是这个程序,中间省掉一些东西 求 W = 5X + 10Y 3Z 法一: .bss X,1 .bss Y,1 .bss Z,1 .bss W,1 SPLK #0,X SPLK #0,Y SPLK #0,Z SPLK #0,W LT X ;X 装载 TREG MPY #5 ; 计算 5X PAC ; 放到累加器中 LTA Y ; 装载 Z 到 TREG ,ACC=ACC+5X MPY #10 ; 计算 10Y APAC ;ACC=ACC+10Y LTA Z ; 装载 Z 到 TREG , ACC=ACC+10Y MPY #3 ; 计算 3Z SPAC ; ACC= ACC-3Z SACH W 法二: MAR *,AR2 ; 设当前 AR LAR AR2, #X ;#X 相当于 C 中的 X LT * ;X 装载 TREG MPY #5 ; 计算 5X LAR AR2, #Y LTP * ; 装载 Y 到 TREG ,并把 5X 送入 ACC MAY #10 LAR AR2, #Z LTA * ; 装载 Z 到 TREG ,并 ACC=ACC+10Y MPY #3 SPAC ; ACC= ACC-3Z LAR AR2, #W SACL *+ ; 保存结果 SACH * 一些指令说明: MAR 修改辅助寄存器 MAR *+,AR3 LAR 装载辅助寄存器 LT ---- 装载 TREG 临时寄存器 LTP--- 装载 TREG 且保存 PREG 到 ACC LTA---- 装载 TREG 且累加产次结果 MPY--- 乘法 MPYA--- 乘且累加 MPYS--- 乘减去前次乘积后在乘 APAC---PREG 加到累加器 这样的话通过对比程序,就可以非常好的理解这几个指令的用法,这次算是真真理解了
个人分类: 科研相关|1638 次阅读|0 个评论
最简单的语言和最复杂的语言
热度 1 马红孺 2010-5-5 20:57
最近在学习 Matlab, 据说这是一个功能强大,易学易用的软件。学得很吃力,有那么多函数,怎么都记不住。 记得大学时开了一门课,叫FORTRAN程序设计,一学期,可能是36学时(或54?),没有见过计算机, 什么也没学会,只记得那位老师把FORTRAN读成 伐儿犬。大四做毕设,需要算一个定积分,开始在程序 纸上写程序,送给穿孔员做卡片,再把一叠卡片交给操作员,在机房外面等结果,才开始对Fortran有点认识。 研一时,导师买了一台IBM PC,8086 cpu,128k 内存(后扩充到384k),两个320k的5吋软驱, DOS1.0操作系统,带一个BASIC程序。开始用Basic算题。过了一阵,升级到dos2.0,又买了 Fortran编译器,突然发现用Fortran比用Basic快了很多,于是知道了编译语言和解释语言的差别。 在导师的带领下,我们一帮师兄弟在这台机器上制造了50余篇文章,还拿了一个自然科学四等奖。 过了一阵,感觉Fortran还是不够快,于是便拿着Dos2.0的说明书,用Debug写汇编程序,果然速度 又有提高。 再后来,计算机不断升级,但一直用Fortran写程序,从Fortran 4, 再到Fortran 77。 在用了10多年Fortran后,开始带学生了,突然发现学生竟然不懂Fortran,而是用C写程序。 为了与时俱进,借着给学生看程序的机会学会了C编程,后来为了赶时髦,又写过一点Java 程序。 比较起来,汇编语言是最简单的,学起来最容易,上手也最快,但要写一个大一点的程序, 需要付出的劳动最大。 Fortran和C差不多, Java稍为复杂一些,主要是比Fortran和C多了一些 概念。感觉最复杂的是 Matlab,折腾了两个星期了,还是记不住那些函数和命令。
个人分类: 胡言乱语|13865 次阅读|12 个评论
汇编语言实验园地_10
求新 2009-2-16 12:30
实验9程序与实验10实验课题 实验10 利用子程序进行串处理及有关日期的程序设计 一、实验内容:利用子程序结构设计从串中查找一个字符的所有位置、查找一个字符串。宏汇编程序设计。 二、实验目的:1. 学习结构化程序设计方法。 2. 如何在一个串中查找到一个字符的所有位置。 3. 如何在一个串中查找到一个另一个字符串。 4. 认识宏的概念,学习宏汇编程序设计方法 三、实验题目 1. 要求自行设定二个字类型的串STRING1与STRING2的内容,用程序对这二个串进行比较,如果相等,0送BX,否则,0FFFFH送BX。设串长为COUNT。最后分别以16进制形式显示BX、STRING1与STRING2的内容。 思考:本题如果不借助串比较指令来做,需要怎样设计?要考虑一个串和另一个串不相同但前面有部分字符相同的情况。 以下两题为实验8第1题利用子程序结构求解的设计参考。 2. 已知程序段如下,将它补充完整,使能将结果(BX的值)以16进制形式在屏幕上显示,根据显示情况分析说明其功能是什么?要求将16进制显示程序段利用子程序进行设计。 DATA SEGMENT BUF DB AABAAAAABBCD COUNT EQU $-BUF DATA ENDS MOV AL, A MOV DI,OFFSET BUF MOV CX,COUNT DEC DI NEXT: INC DI CMP AL, LOOPE NEXT MOV BX,DI JNZ EXIT MOV BX,0FFFFH ;当ZF=1,CX=0时退出循环 EXIT:. 3. 对在STRING中搜索A的程序段进行补充设计,要求对设计加详细注释。要求自行设定一个长度COUNT的字节类型的串STRING的内容,用循环程序对这个串进行搜索,如果搜索到字节类型数据A,显示当前位置(字长)。STRING、COUNT、A的内容自行设计。 LEA DI,STRING MOV AL,A MOV CX,COUNT CLD REPNE SCASB JZ OK OK: 4. 在一个串中查找一个字符,显示查到该字符的次数。 5 用串指令在一个串中查找一个字符,显示所有查到位置的地址。如果没有欲查字符,显示-1。 6.在一个串中查找另一串,如果找到,将查到串的首地址存到DI中。 7.求编写显示系统的当前日期和时间的程序。要求程序运行时显示的信息格式为: Current date is 10-30-2008. Current time is 10:23:26.12 相关的DOS功能调用: 【获取系统当前日期】 调用指令:INT 21H 功 能 号:2AH 入口参数:无 出口参数:CX = 年(范围1980~2099) DH = 月(1~12) DL = 日 【获取系统当前时间】 调用指令:INT 21H 功 能 号:2CH 入口参数:无 出口参数: CH = 小时(0~23) CL = 分(0~59) DH = 秒(0~59) DL = 百分之一秒(0~99) 8. 设计一个万年历程序。已知2008年1月1日为星期二,求2008年之后21世纪的某年某月某日是星期几?不考虑输入错误。 分析:假设通过键盘分别输入公元年份(输入末二位)、月份(二位)、日期(二位),可以利用前面的子程序分别变成二进制数。再计算输入日期与2008年1月1日之间相差日数X,将X除以7的余数加2就代表星期几,7代表星期日,1代表星期1,。而要计算相差日数X,必须考虑闰年问题:4年一闰、百年不闰、400年闰。非闰年365天,2月份28天;闰年366天, 2月份29天。可以先分析年份之差,对每一年判断是否闰年,再加366或365;再分析月份之差,求出所求年内距离1月1日的天数。为了能用一个程序计算各个月的情况,设计一个表:ruler=31,28,31,30,31,30,31,31,30,31,30,31,每一个值代表一个月是大月还是小月,1表示31天,0表示30天,利用间址查表求天数。2月单独计算。为求程序清晰,分别设计了分析闰年、月份二个子程序,在求解星期几的程序中调用。 实验10参考程序段 1. 用循环指令在一个串中查找一个字符,第一次查到该字符时将地址放在DI中。 MOV AX,DATA MOV DS,AX MOV AL, 'A' MOV DI,OFFSET BUF MOV DX,0 MOV CX,COUNT DEC DI NEXT: INC DI CMP AL, JZ NEXT1 LOOP NEXT NEXT1: 2. 用串指令在一个串中查找一个字符,查到第一个时将位置放在DI中。 MOV AX,DATA MOV DS,AX MOV ES,AX MOV AL, 'A' MOV DI,OFFSET BUF MOV CX,COUNT REPNE SCASB JNZ EXIT DEC DI ;找到的存放地址放在DI中 3.在DAT1串中查找ADD2串的第1个字符(串长COUNT2),如果找到,将剩余串的首地址存到ADD1中,剩余串长度存到ADD2中。 MOV AX,DATA MOV DS,AX MOV ES,AX MOV ADD1,OFFSET DAT1 ;立即数传存储器 MOV AL,X ;取欲查之字符串第1个字符 MOV ADD2,COUNT2 CLD BACK1: MOV DI,ADD1 ;取欲查字串首地址 MOV CX,ADD2 ;取欲查字串长度 REPNE SCASB ;查找 MOV ADD1,DI ;保存剩余串首地址 MOV ADD2,CX ;保存剩余串长度 4.求系统的当前日期和时间分别放在DX与CX中的程序。假使在数据区FNAME保存一个文件的名字。其中DX 中存年月日的格式: 0-4位:日,5-8位:月,9-15位:年份-1980。CX中所存时间的格式: 0-4位:秒/2,5-10位:分,11-15位:时 MOV DX, OFFSET FNAME MOV AL, 2 ; 读写方式 MOV AH, 3DH ;打开文件 INT 21H MOV BX, AX MOV AH, 57H ; 读\改日期 MOV AL,0 ;0 表示读出时间,1表示改写时间 INT 21H MOV DI,CX 5.求以十进制方式显示DX(日期)内容的宏。 AXTOBCD1 MACRO PUSH SI PUSH DI PUSH CX MOV SI,DX ;DX 中存年月日 0-4位:日,5-8位:月,9-15位:年份-1980 ;保存CX中所存时间 0-4位:秒/2,5-10位:分,11-15位:时 MOV CL,7 ;年 ROL SI,CL MOV DX,SI AND DX,7FH ADD DX,1980 AXTOBCD DX MOV DL,'.' MOV AH,2 INT 21H MOV CL,4 ;月 ROL SI,CL MOV DX,SI AND DX,0FH AXTOBCD DX MOV DL,'.' MOV AH,2 INT 21H MOV CL,5 ;日 ROL SI,CL MOV DX,SI AND DX,1FH AXTOBCD DX MOV DL,'.' MOV AH,2 INT 21H POP CX POP DI POP SI ENDM 6.求以十进制方式显示DI(时间)内容的宏。 AXTOBCD2 MACRO PUSH SI PUSH DI PUSH CX MOV CL,5 ;时 ROL DI,CL MOV DX,DI AND DX,1FH AXTOBCD DX MOV DL,'.' MOV AH,2 INT 21H MOV CL,6 ;分 ROL DI,CL MOV DX,DI AND DX,3FH AXTOBCD DX MOV DL,'.' MOV AH,2 INT 21H MOV CL,5 ;秒 ROL DI,CL MOV DX,DI AND DX,1FH SHL DX,1 AXTOBCD DX MOV DL,'.' MOV AH,2 INT 21H POP CX POP DI POP SI ENDM 7. 求从键盘输入二个十进制数字变成二进制数子程序 ;子程序名:IMPOR ;程序功能:从键盘输入二个十进制数字变成二进制数 ;入口参数: ;出口参数: 二进制数:BX ;使用寄存器:AX IMPOR PROC MOV AH,1H INT 21H ;键盘输入1个字符,不考虑输入错 SUB AL,30H MOV BL,10 MUL BL MOV BL,AL MOV AH,01H INT 21H ;键盘输入第二个数字 SUB AL,30H ADD AL,BL EXIT: MOV AH,0 MOV BX,AX RET IMPOR ENDP 8. 求AX中数表示的某一年份的日数的子程序 ;子程序名:LEAPY ;程序功能:求AX中数表示的年份的日数 ;入口参数:年份:CX ;出口参数:该年日数:AX ;使用寄存器:DX、BX LEAPY PROC MOV AX,CX ;保存DI到AX MOV DX,0 MOV BX,4 DIV BX CMP DX,0 JNZ DISP3 ;不能整除4,不是闰年 MOV AX, CX MOV BX,100 DIV BX CMP DX,0 JNZ DISP4 ;不能整除100,是闰年 MOV AX, CX MOV BX,400 DIV BX CMP DX,0 JZ DISP4 ;能整除400,是闰年 DISP3: MOV AX,365 MOV BYTE PTR Y,0 ;置非闰年标志 JMP EXIT1 DISP4: MOV AX,366 MOV BYTE PTR Y,1 ;置闰年标志 EXIT1: RET LEAPY ENDP 实验9部分参考程序 1、在数据区中有如下定义,要求首先将有关常量存放到数据区BUF中,再编一个循环程序,使依次以10进制形式显示各变量的值(不要求显示变量名)。 NUM1EQU25*4-50 NUM2EQUNUM1/7 VAR1DB1,2,3,4,5 VAR2DB'12345' NUM4EQUVAR2-VAR1 NUM5EQU0FH BUF DB 7 DUP(?) ;程序1解:以十进制形式显示各数(循环方式) DATA SEGMENT NUM1EQU25*4-50 NUM2EQUNUM1/7 VAR1DB1,2,3,4,5 VAR2DB'12345' NUM4EQUVAR2-VAR1 NUM5EQU0FH BUF DB 7 DUP(?) D1 DB ?,?,?,?,?,? ;根据子程序要求建立显示数据区 DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF ;将有关数据放BUF数据区使方便循环求解 MOV ,BYTE PTR NUM1 INC SI MOV ,BYTE PTR NUM2 INC SI MOV AL,VAR1 MOV ,AL INC SI MOV AL,VAR2 MOV ,AL INC SI MOV ,BYTE PTR NUM4 INC SI MOV ,BYTE PTR NUM5 MOV SI,OFFSET BUF ;准备从BUF数据区依次取数显示 MOV DI,OFFSET D1+5 ;根据子程序要求将DI指向显示数据区尾部 MOV BP,6 ;共计显示6个数据 NEXT: MOV AH,0 ;根据子程序要求将欲显示数据取到AX中 MOV AL, ;显示数据为字节类型,而AX为字类型 CALL P1 ;调用显示子程序 INC SI DEC BP ;共显示6个数据,由BP决定循环次数 JNZ NEXT MOV AH,4CH INT 21H ;子程序名:p1 ;功能: 以十进制形式显示任意字 ;输入参数: 显示字在AX中。要求在数据区建5字节的显示数据区, ;要求用DI指向其尾部。 ;输出参数: ;* * * * * * * P1 PROC MOV BX,10 ;准备除以10 CHANGE10: MOV DX,0 ;将除数的高16位(在DX中)清0,DX存放余数 DIV BX ;DX,AX除以BX (BX=10) ADD DL,30H ;余数变为ASCII码值 MOV BYTE PTR ,DL ;存储十进制数 DEC DI ;到上一单元 CMP AX,0 ;是否为0? JNZ CHANGE10 ;不为0转CHANGE10 MOV CX,5 ;准备连续显示5个数 CHANGE11:MOV DL,BYTE PTR ;取出存放在BUF中的十进制数到DL供显示 MOV AH,2 ;显示1个字符 INT 21H INC DI LOOP CHANGE11 RET P1 ENDP CODE ENDS END START 2. 利用子程序结构将八位无符号二进制数转换为十进制数的ASCII码并显示。 DATA SEGMENT BIN DB 11111111B ASC DB 3 DUP(?),$ DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START:MOV AX,DATA ;给数据段寄存器DS赋值 MOV DS,AX MOV AL,BIN MOV BX,OFFSET ASC ADD BX,2 ;指向存放ASCII码值结果的存贮单元末地址 CALL TRANSFORM ;转子程序实现转换 LEA DX,ASC MOV AH,9 INT 21H MOV AH,4CH ;中断返回DOS状态 INT 21H ;* * * * * * * ;子程序名:TRANSFORM ;功能:将八位无符号二进制数转换为十进制数ASCII码 ;入口参数:八位二进制数=AL ; 存放ASCII码值末地址=BX ;出口参数:在ASC开始的存贮单元中 ;* * * * * * * TRANSFORM PROC NEAR PUSH CX PUSH DX MOV CX,3 MOV DL,10 AGAIN:MOV AH,0 DIV DL ADD AH,30H MOV ,AH DEC BX LOOP AGAIN POP DX POP CX RET TRANSFORM ENDP CODE ENDS END START 说明:转换子程序中用到了AX(AH,AL),BX,CX,DX(DH,DL)四个16位的寄存器。为什么进入子程序后,只对CX,DX寄存器作了压栈保护,而对AX,BX 寄存器没有呢?原因在于:AX,BX是用于参数传递目的的两个寄存器,而CX,DX却不是。进入子程序中压栈保护所用的寄存器一般指不用于参数传递目的的寄存器,所以对CX,DX作了压栈保护,而对AX,BX却没有。 另外,此题也可不用除法指令,而采用一连串的相减来实现,思路为:八位二进制数能够减去100的次数,就是转换的十进制数百位;同理,从余下的二进制数中再减去10的次数,便是十进制的十位;最后余下的就是十进制数个位。有兴趣的同学可自己试着实现。 结合上题与本题可以总结子程序的格式,子程序所放的位置,子程序的调用方法。 调用子程序命令为: CALL 子程序以 子程序名 PROC 开始。 例如: TRANSFORM PROC 后面的 NEAR 表示在同一段内,可以省略,否则要用FAR。子程序结尾为: RET 子程序名 ENDP 例如,本子程序结尾: RET TRANSFORM ENDP 每个子程序开始应当给出说明:子程序名、功能、入口参数、出口参数、使用寄存器。既便于自己理解,也方便之后其他程序调用。使用寄存器只列举在本程序中使用了但未在子程序中保护且不是入口参数和出口参数中声明了的寄存器。 子程序用CALL命令调用,格式: CALL 子程序名 子程序不能在代码中随意放,初学建议放在MOV AH,4CH 和 INT 21H 这二句之后。 3. 用子程序形式求解实验7第3题:在内存的源数据区SOURCE处有若干个ASCII码字符,要求将其中的英文大写字母变换为小写字母,其它字符不变换,并存放到结果数据区DEST处。 分析:英文大写字母AZ,ASCII码值为41H5AH。相应的小写字母为az,ASCII码值为61H7AH。英文大写字母要转换为相应的小写字母只要ASCII码值加20H即可。 例如:B─b 42H+20H=62H 我们将转换这一过程用子程序TRANBL来实现,参数传递借助存贮单元,其算法流程图如右图所示。 完整程序如下所示: DATA SEGMENT SOURCE DB 'BEIjin2008OLYMPIC' COUNT EQU $-SOURCE ;字符个数 DEST DB COUNT DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX CALL TRANBL MOV AH,4CH INT 21H ;* * * * * * * ;子程序名:TRANBL ;功能:大写字母转换为小写字母 ;输入参数:数据区SOURCE处,字符个数由COUNT指明 ;输出参数: 输出数在数据区DEST处 ;* * * * * * * TRANBL PROC NEAR PUSH AX PUSH CX PUSH SI PUSH DI MOV SI, OFFSET SOURCE MOV DI, OFFSET DEST MOV CX,COUNT AGAIN:MOV AL, CMP AL,41H ;与大写字母A比较 JB NEXT CMP AL,5AH ;与大写字母Z比较 JA NEXT ADD AL,20H ;转换 NEXT:MOV ,AL INC SI INC DI LOOP AGAIN POP DI POP SI POP CX POP AX RET TRANBL ENDP CODE ENDS END START 6. 求将一个16位二进制数转换为任意P(0到19)进制数,P从键盘输入并显示(超过9的数字按:10用A,11用B,,19用I表示)。 分析:在前面例子中已经给出了16位二进制数转换为十进制、十六进制的例子,方法都是依次除进制数、取余、倒写。转换为任意P进制数的问题,只是将这些例题中的除数要更换为P的具体值。可以将这些转换程序改写成子程序,子程序中要用到寄存器DI、AX,使用寄存器不多,故设计P从主程序经BX带入、二进制数从主程序经SI带入。为具有实用价值,本题所涉及的P值及二进制数均从键盘输入,输入的都是ASCII码,需要变成二进制数,该工作分别设计子程序完成。 程序设计如下: DATA SEGMENT CHAR_BUF DB 6 ;缓冲区最大长度 DB ? ;实际输入字符个数 DB 6 DUP(0) ;输入缓冲区 BUF DB 17 DUP(0) ;输出缓冲区 CLEW1 DB 'PLEASE INPUT ALGORI X(0....65535) :', '$' ;提示信息1 CLEW2 DB 0DH,0AH,'PLEASE INPUT CARRY P(0....19) :', '$' ;提示信息2 ENTER1 DB 0DH,0AH, '$' ;回车换行 DATA ENDS STACK SEGMENT STACK DB 200 DUP(?) STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK START:MOV AX,DATA MOV DS,AX MOV DX,OFFSET CLEW1 ;提示信息1 MOV AH,9 INT 21H CALL IMPOR1 ;输入二进制数子程序 MOV DX,OFFSET CLEW2 ;提示信息2 MOV AH,9 INT 21H CALL IMPOR2 ;输入进制数P子程序 MOV DX,OFFSET ENTER1 ;回车换行 MOV AH,9 INT 21H MOV DI, OFFSET BUF ;根据VERSIO入口要求使指针DI指向BUF缓冲区 ADD DI,17 ;假定BUF从0起准备17个单元,DI指向BUF尾 MOV BYTE PTR ,$ ; 所有余数的最后加$ CALL VERSIO ;转换并显示子程序 MOV AH,4CH INT 21H ;子程序名:IMPOR1 ;程序功能:从键盘输入至多5个十进制数字变成二进制数(0到65535),回车表示输完 ;入口参数:缓冲区首址:CHAR_BUF ;出口参数: 从键盘输入的数:SI ;使用寄存器:DI,DX,BX,CX,AX IMPOR1 PROC NEAR INPUT: MOV DX,OFFSET CHAR_BUF MOV AH,0AH INT 21H ;键盘输入字符串 MOV DI,OFFSET CHAR_BUF MOV CL, ;取实际输入串长度 MOV CH,0 MOV AX,0 ;准备存放结果 MOV BX,10 ;乘10的乘数 MOV DH,0 ;清DX高8位 CHANGE: MUL BX ;(AX)乘10 MOV DL, ;取一个字符 SUB DL,30H ;变成数字 ADD AX,DX INC DI LOOP CHANGE MOV SI,AX ;带出结果 RET IMPOR1 ENDP ;子程序名:IMPOR2 ;程序功能:从键盘输入至多二个十进制数字变成进制数P(219) ;入口参数: ;出口参数: 进制数P:BX ;使用寄存器:AX IMPOR2 PROC NEAR MOV AH,01H INT 21H ;键盘输入1个字符,不考虑输入错 SUB AL,30H CMP AL,1 ;如果第1个字符输入大于1,表示只1位 JA EXIT MOV BL,10 MUL BL MOV BL,AL MOV AH,01H INT 21H ;键盘输入第二个数字 SUB AL,30H ADD AL,BL EXIT: MOV AH,0 MOV BX,AX RET IMPOR2 ENDP ;子程序名:VERSIO ;程序功能:将16 位二进制数转换为P进制数并显示 ;入口参数:数组BUF首址: DI,进制数P:BX,存放二进制数:SI ;出口参数: ;使用寄存器:AX VERSIO PROC NEAR MOV AX,SI CHANGE1: DEC DI ;指针向前移 DIV BL ;(AX)除以P余数在AH中 ADD AH,30H ;余数变为对应的ASCII码值 CMP AH,39H ;是否是A-F JBE NEXT ADD AH,7 ;如果是A-F,再加7 NEXT: MOV BYTE PTR ,AH ;保存转换后的十六进制数结果 MOV AH,0 CMP AL,0 ;判断商是否为0? JNZ CHANGE1 ;不为0转CHANGE1 MOV DX,DI MOV AH,9 INT 21H RET VERSIO ENDP CODE ENDS END START 7. 求一个小于65535的整数N的因数分解,即将一个整数分解成质数的乘积。 分析:因数分解的方法是从I=2起,看能否整除N,如果能,则I为一个质数,记下整除后的数代换N并继续整除到不能整除为止。再将I加1后继续,,直到I大于被除数为止。 ;设数据区如下,求分解为质数放在PRIMEN中并显示。 DATA SEGMENT M1 DW 10920 M2 DW 0 PRIMEN DW 10 DUP(0) M DB 0 d db 5 dup(0) DATA ENDS STACK SEGMENT STACK DB 200 DUP(?) STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK START:MOV AX,DATA MOV DS,AX CALL PRIME ;转分解质数子程序 LEA DI,D+5 ;指向显示数据区尾地址 LEA SI,PRIMEN ;指向质数数据区首地址 MOV CL,M ;欲显示的质数个数 MOV CH,0 LOOP1:MOV AX, ;取显示数据 CALL P1 ADD SI,2 LOOP LOOP1 MOV AH,4CH INT 21H ;子程序名:PRIME ;程序功能:将字数据分解为质数 ;入口参数:字数据:变量M1 ;出口参数: 质数数组:PRIMEN ; 数组元素个数:M ;使用寄存器:AX PRIME PROC MOV DI,OFFSET PRIMEN MOV AX,M1 MOV M2,AX MOV CL,0 DISP1: MOV BX,2 ;从2开始分析质数 DISP2: MOV AX,M2 MOV DX,0 DIV BX CMP DX,0 ;余数是否为0? JNE DISP4 MOV ,BX ;保存一个质数 ADD DI,2 ;准备存放下一个质数 MOV M2,AX INC CL DISP3: MOV DX,0 DIV BX CMP DX,0 ;继续取出同一个质数不再保存 JNE DISP4 MOV M2,AX JMP DISP3 DISP4: CMP BX,M2 JA EXIT INC BX JMP DISP2 EXIT: MOV M,CL RET PRIME ENDP ;子程序名:p1 ;功能: 以十进制形式显示任意字 ;输入参数: 显示字在AX中。要求在数据区建5字节的显示数据区, ;要求用DI指向其尾部。 ;输出参数: ;* * * * * * * P1 PROC PUSH BX PUSH DX PUSH DI PUSH CX MOV BX,10 ;准备除以10 CHANGE10: MOV DX,0 ;将除数的高16位(在DX中)清0,DX存放余数 DIV BX ;DX,AX除以BX (BX=10) ADD DL,30H ;余数变为ASCII码值 MOV BYTE PTR ,DL ;存储十进制数 DEC DI ;到上一单元 CMP AX,0 ;是否为0? JNZ CHANGE10 ;不为0转CHANGE10 MOV CX,5 ;准备连续显示5个数 CHANGE11:MOV DL,BYTE PTR ;取出存放在BUF中的十进制数到DL供显示 MOV AH,2 ;显示1个字符 INT 21H INC DI LOOP CHANGE11 POP CX POP DI POP DX POP BX RET P1 ENDP CODE ENDS END START 8. 计算:X的平方根与有的平方根的和 其中x、y为整型数据,分别存放在XBUF和YBUF单元中,所得结果f存放在FBUF中。要求将FBUF中数据在屏幕上显示。 分析:求一个整数平方根可以通过将该整数依次减去1、3、5、7(n-1)的奇数,所够减的次数即为平方根值。 例如求16的平方根时可这样进行: 16-1=15 够减1次 15-3=12 够减2次 12-5=7 够减3次 7-7=0 够减4次 所以16=4 求平方根的过程我们用子程序SQROOT来实现,参数的传递借助堆栈。求平方根子程序算法流程图如图所示。 DATA SEGMENT XBUF DW 81 YBUF DW 100 FBUF DW ? DATA ENDS STACK SEGMENT TOP DW 20 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA ;给DS赋值 MOV DS,AX MOV SI,XBUF CALL SQROOT MOV AX,SI MOV SI,YBUF CALL SQROOT ADD SI,AX CALL DISPLAY16 MOV AH,4CH INT 21H ;* * * * * * * ;子程序名:SQROOT ;功能:求平方根运算 ;输入参数:SI ;输出参数:SI ;* * * * * * * SQROOT PROC NEAR PUSH AX PUSH BX PUSH CX MOV AX,SI ;取被开方数 SUB CX,CX ;CX置0 AGAIN:MOV BX,CX ;下面三条指令使BX=2*CX+1 ADD BX,BX INC BX SUB AX,BX JC OVER ;不够减转OVER INC CX JMP AGAIN OVER:MOV SI,CX ;平方根放回原堆栈区 POP CX POP BX POP AX RET SQROOT ENDP ;子程序名:DISPLAY16 ;功能:以移位方式显示16进制数 ;占用寄存器:BX,CL,AX,DX ;输入参数:要显示数据在SI中 ;输出参数:无 DISPLAY16 PROC MOV BX,4 ;每个字显示4个16进制字符 CHANGE10: MOV CL,4 ;准备左移4位(除以16) ROL SI,CL ;SI循环移4位 MOV DX,SI ;转存到DX AND DX,0FH ;清高12位 ADD DL,30H ;一个16进制数变为ASCII码值 CMP DL,3AH ;是否小于10? JB CHANGE12 ;如果小于10转显示 ADD DL,7 ;否则为A到F之间数,加7 CHANGE12: MOV AH,2 ;显示1个字符 INT 21H DEC BX ;处理下一个字符 CMP BX,0 ;是否为0? JNZ CHANGE10 ;不为0转CHANGE10 RET DISPLAY16 ENDP CODE ENDS END START 本题如果采用堆栈传递参数的程序如下所示,请注意堆栈的变化。 DATA SEGMENT XBUF DW 81 YBUF DW 100 FBUF DW ? DATA ENDS STACK SEGMENT TOP DW 20 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA ;给DS赋值 MOV DS,AX MOV AX,STACK ;给SS赋值 MOV SS,AX MOV SP,SIZE TOP ;确定SP的指向位置 MOV AX,XBUF ;取被开方数X PUSH AX ;压入堆栈 CALL SQROOT POP AX ;取X平反根暂存AX中 MOV DX,YBUF ;取被开方数Y PUSH DX ;压入堆栈 CALL SQROOT POP DX ;取Y平反根存入DX中 ADD AX ,DX ; + MOV FBUF,AX ;送入FBUF单元 MOV SI,FBUF CALL DISPLAY16 MOV AH,4CH INT 21H ;* * * * * * * ;子程序名:SQROOT ;功能:求平方根运算 ;输入参数:压入堆栈区 ;输出参数:位于堆栈区 ;* * * * * * * SQROOT PROC NEAR PUSH BP MOV BP,SP ;定位 PUSH AX PUSH BX PUSH CX MOV AX, ;取被开方数 SUB CX,CX ;CX置0 AGAIN:MOV BX,CX ;下面三条指令使BX=2*CX+1 ADD BX,BX INC BX SUB AX,BX JC OVER ;不够减转OVER INC CX JMP AGAIN OVER:MOV ,CX ;平方根放回原堆栈区 POP CX POP BX POP AX POP BP RET SQROOT ENDP ;子程序名:DISPLAY16 ;功能:以移位方式显示16进制数 ;占用寄存器:BX,CL,AX,DX ;输入参数:要显示数据在SI中 ;输出参数:无 DISPLAY16 PROC MOV BX,4 ;每个字显示4个16进制字符 CHANGE10: MOV CL,4 ;准备左移4位(除以16) ROL SI,CL ;SI循环移4位 MOV DX,SI ;转存到DX AND DX,0FH ;清高12位 ADD DL,30H ;一个16进制数变为ASCII码值 CMP DL,3AH ;是否小于10? JB CHANGE12 ;如果小于10转显示 ADD DL,7 ;否则为A到F之间数,加7 CHANGE12: MOV AH,2 ;显示1个字符 INT 21H DEC BX ;处理下一个字符 CMP BX,0 ;是否为0? JNZ CHANGE10 ;不为0转CHANGE10 RET DISPLAY16 ENDP CODE ENDS END START 思考:请编写求解一元二次方程AX2+BX+C=0的程序。
个人分类: 生活点滴|10148 次阅读|3 个评论
汇编语言实验手册详细目录
热度 1 求新 2009-2-16 12:27
实验手册详细目录 实验 1 认识性实验 1. 显示数据区中的一个字符 2. 显示数据区中的一个十进制数字 3.10 以内的加法程序并显示结果 4. 以二进制形式显示一个字符的 ASCII 码 实验 2 数据转换实验 1. 二进制数转换为十进制数。将 D0 起字单元中存放的 16 位二进制数转换为十进制数 , 并将其 ASCII 码存入 DI 所指向的缓冲区 BUF 中 , 最后显示出来。 2.ASCII 码表示的十进制数转换为二进制数并显示。将 SI 指向的缓冲区 BUF 中保存的五位 ASCII 码十进制数( 0-65535 )转换成对应的二进制数并存放在 DX 中 , 再以二进制形式显示。 3. 二进制数到十六进制数的转换 4.ASCII 码表示的十六进制数到二进制数的转换。从键盘输入四位十六进制数 , 将其转换十六位二进制数 , 并保存在 DX 寄存器中 , 再显示。 实验 3 简单数据运算程序设计 1. 求计算二个字类型无符号数的和并以十进制形式显示。设和的大小不超过 16 位二进制数。 2. 如果要将二进制数的和以十六进制形式显示,求修改以下实验程序,补充数据区设计,使能上机实现。 3. 检查 4 个输入的数 , 如果是 16 进制数字就保留并显示 , 否则停止输入并退出。 4. 求一个数 X 的 9-X 并显示。 5. 求解二元一次方程组: A1X+B1Y=C1 A2X+B2Y=C2 实验 4 涉及压缩 BCD 码数据的转换程序及 DEBUG 练习 1. 按如下步骤操作,了解 DEBUG 命令及其使用方法。 2. 在编译与连接生成执行程序之后利用 DEBUG 调试该程序,了解不同变量数据存储情况,了解变量的三种含义及用法,了解加法、乘法运算方法及对标志位的影响。 3. 检查下面那些指令是错误的 , 说明原因并改正。 4. 十进制数的 ASCII 码转换为压缩型 BCD 码 5. 压缩 BCD 码转换为十进制数的 ASCII 码 6. 二进制数转换为压缩 BCD 码 7. 压缩 BCD 码转换为二进制数 实验 5 算术运算程序设计 1. 单步运行以下 8 位 2 进制数加法: 88H+0CH ; 0CEH+ 0C 4H ; 0CEH+84H 与 16 位 2 进制数加法: 9588H+720CH ; 9588H+0B284H 运算程序,对每次运算分析其对标志位的影响。记录实验结果,并与分析结果比较。 2. 分析以下程序功能是什么?分析其每一次算术运算对标志位的影响。记录实验结果,并与分析结果比较。 3. 已知数据存储区如下所示, DN1 与 DN2 均为双字,自编程序段:计算 DN1+DN2 ,将结果放到 DSUM 中。上机验证,报告其中各进行算术运算后对标志位影响的情况。 4. 修改上面的程序,将运行结果以 16 进制形式在屏幕上显示。 5. 按下列要求编写指令序列上机实现 1 )清除 DH 中最低 3 位而不改变其他位,结果存入 BH 。 2 )将 DL 中最高 3 位置 1 而不改变其他位。 3 )将 AX 中 0~3 位置 1 、 7~9 位取反、其他位清 0 。 4 )检查 BX 中第 2 、 5 、 9 位是否至少有 1 位是 1 。 5 )检查 CX 中第 1 、 6 、 11 位是否同时为 1 。 6 )检查 BX 中第 0 、 2 、 9 、 13 位是否至少有 1 位是 0 。 7 )检查 DX 中第 1 、 4 、 11 、 14 位是否同时是 0 。 6. 编写指令序列实现: 1 )右移 DL 3 位,并将 0 移入最高位。 2 )将 AL 左移一位,将 0 移入最低位。 3 ) DX 右移 6 位且保持正负特性不变。 4 )将 AL 中压缩 BCD 码变成 AX 中的非压缩 BCD 码。 7 .设 A,B,C 为 8 位带符号数 ,D 为 16 位带符号数,计算算术表达式 ((A*B-32486H)+C)/D 的值,结果中的商存放到( AX )寄存器中(假设 D 的值足够大),余数存放到( DX )寄存器中。 附:供参考程序段: 1. 双字加法程序段 2. 16 进制形式在屏幕上显示二进制数据程序段 3. 清除 DH 中最低 3 位而不改变其他位,结果存入 BH 。 4. 将 DL 中最高 3 位置 1 而不改变其他位,结果存入 BH 。 5. 将 AX 中 0~3 位置 1 、 7~9 位取反、其他位清 0 。 6. 检查 BX 中第 2 、 5 、 9 位是否至少有 1 位是 1 。 7. 检查 CX 中第 1 、 6 、 11 位是否同时为 1 。 8. 检查 BX 中第 0 、 2 、 9 、 13 位是否至少有 1 位是 0 。 9. 检查 DX 中第 1 、 4 、 11 、 14 位是否同时是 0 。 10. 右移 DL 3 位,并将 0 移入最高位。 11. 将 AL 左移一位,将 0 移入最低位。 12. DX 右移 6 位且保持正负特性不变。 13. 将 AL 中压缩 BCD 码变成 AX 中的非压缩 BCD 码。 实验 6 自编有关双精度数据运算及逻辑运算、移位程序 1. 设数据区有双精度数据 A 、 B 定义例如: A DD 2A 3D0B2CH B DD 2573ADEH 求自编程序 , 计算 A 与 B 的和与差 , 并用二进制形式分别显示。 2. 设数据区有双精度数据 A 、 B 定义如上 , 求自编程序 , 计算 A 与 B 的积 , 并用十六进制形式显示。 3. 自编程序,任意设 AX 的值,求将其中 1 、 3 、 5 位清 0 , 2 、 4 、 9 位置 1 , 6 、 7 位求反。分别用二进制形式显示原数据及处理后的数据。 4. 自编程序,任意设 4 位压缩 BCD 码数据放到 AX 中,求用移位方法及 2 号 DOS 中断显示其值。 5. 设数据区有压缩 BCD 码数据 A 、 B 定义例如: A DW 2937H B DW 877H 求自编程序 , 计算 A 与 B 的和 , 并用十进制形式显示。 6. 设数据区有非压缩 BCD 码数据 A 、 B 定义例如: A DW 0907H B DW 0807H 求自编程序 , 计算 A 与 B 的和 , 并用十进制形式显示。 7. 设计求两个二位压缩 BCD 码的乘积(用压缩 BCD 码表示)的程序。(例如 86H*39H ,结果为 3354H ) 8. 设计求四位压缩 BCD 码除以二位压缩 BCD 码表示的程序。(例如 8390H 29H ,结果为 289H 余 9 ) 9. 设数据区有双精度数据 A 、字类型数据 B , 求自编程序 , 计算 A/B 的商与余数,各用十进制形式显示。 10. 设数据区有双精度数据 A 、 B , 求自编程序 , 计算 A/B 的商与余数。,各用十进制形式显示。 供参考的程序段: (1) 以二进制形式显示任意字符的 ASCII 码(要求在数据区设置 A , DB 类型) (2) 二进制数转换为十进制数。 要求在数据区设置 BUF DB 10 DUP(0) 和 D0 ,例如 D0 DW 1234 (3) 二进制数转换为压缩型 BCD 码,要求在数据区有 ASC_BUF 数据, DB 类型,共 16 个单元,要转换的数据要放到 DX 中。 (4) 压缩型 BCD 码转换为二进制数,要转换的数据要放到 DX 中。 (5) 压缩型 BCD 码的加法运算 (6) 单字节压缩 BCD 码的减法运算 (7) 单字压缩 BCD 码的减法运算 ; 已知 AX = 1234H 、 BX = 4612H, 计算 1234 - 4612 的差 (8) 非压缩 BCD 码的加法运算 (9) 非压缩 BCD 码的减法运算 (10) 一位非压缩 BCD 码的乘法运算 (11) 非压缩 BCD 码的除法运算 (12) 两个二位压缩 BCD 码的乘积(用压缩 BCD 码表示)。 (13) 设计求四位压缩 BCD 码除以二位压缩 BCD 码表示的程序。(例如 8390H 29H ,结果为 289H 余 9 ) (14) 双字加法 (15) 双字除单字除法(设被除数在 DX AX 中,除数在 BX 中,在数据区中准备字类型 3 个字数据区 C : C DW ?,?,? ) (16) 双精度数减法 实验 7 循环程序设计练习 1. 求利用 2 号中断接受从键盘输入的最多 4 个 16 进制数字组成一个 16 进制数,并依次用十六进制、十进制显示的程序。 2. 接上题,求将字变量 BUF 的值乘以上述 16 进制数,再用十六进制数显示的程序。 3. 在内存的源数据区 SOURCE 处有若干个 ASCII 码字符,要求将其中的英文大写字母转换为小写字母,其它字符不转换,并存放到结果数据区 DEST 处。已知数据区如下。 DATA SEGMENT SOURCE DB BEIjin2008OLYMPIC COUNT EQU $-SOURCE ;字符个数 DEST DB COUNT DUP(?) DATA ENDS 4. 修改上述程序:将输入到数据区 DEST 处的字符串在屏幕上显示出来。 5. 将以下参考程序段中第 3 到 9 题补充完整再上机验证。 供参考的程序段: (1) 二进制数转换为十六进制数显示。 (2)ASCII 码表示的十进制数转换为二进制数并显示。要求在数据区设置要求显示的 BUF 数据, DB 类型 (3) 以移位方式显示 16 进制数 ( 要求在数据区设置用来变十六进制数的数 D0 ,例如 D0 DW 1234h) (4)ASCII 码表示的十六进制数到二进制数的转换 (5) 十进制数的 ASCII 码转换为压缩型 BCD 码。要求在数据区有 ASC_BUF 、 BCDBUF 二个数据集,由若干个十进制数的 ASCII 码字符组成,要定义其长度放到 COUNT 中。 (6)BCD 码转换为十进制数的 ASCII 码,要求在数据区有 ASC_BUF 数据, DB 类型,共 3 个数据。 (7) 双字除 10 取余求变 10 进制数(设双字在 DX AX 中,除数 10 在 BX 中,在数据区中准备字节类型 10 个字数据区 D : D DB 10 DUP(?) ) (8) 利用 10 号 DOS 中断输入 1 到 10 个 10 进制数,求变成 2 进制数存到 DX AX 中。 (9) 在数据区 SOURCE 处有 20 个字节无符号数,计算其累加和。 实验 8 用循环程序设计方法解串操作问题实验 1 、如果有字节变量 X ,存放一个字母,在 DEST 数据区存放有一字符串,求在该字符串中查找该字母,如果找到,显示该字母及该字母所在位置的偏移地址。 2 、接上题,如果有字变量 X ,存放二个字母,求在 DEST 数据区查找该二字母,如果找到,显示该字母所在位置的偏移地址。 (附实现程序) 3 、在数据区 SOURCE 处有 20 个字节无符号数,计算其累加和,结果存放在符号地址 RESULT 字单元处并在屏幕上显示。 (附实现程序) 4 、 从键盘输入一个字符串,然后在下一行以相反的顺序显示出来。 (附实现程序) 5 、有一个长度 COUNT 的字节类型的串 BUF ,用程序对这个串进行从小到大的排序,要求分别用气泡法、选择法、插入法完成。 (附实现程序) 6 、假设待匹配的元素存放在 KEY 单元中,且 LIST 表为一个所有元素已按从小到大顺序排列的有序表。编制程序实现在 LIST 表中用折半查找法查找是否有与 KEY 单元中的内容相匹配的元素,若查找到将其在表中的地址存入 ADR 单元;若未找到则将 ADR 单元置全 1 。 (附实现程序) 7 、比较 A 、 B 两个串的大小,如果 A 串大,显示 A ;如果 B 串大,显示 B ;否则,显示 E 。 实验 9 利用子程序实现数据变换与数据处理的程序设计 1. 在数据区中有如下定义 , 要求首先将有关常量存放到数据区 BUF 中,再编一个循环程序 , 使依次以 10 进制形式显示各变量的值(不要求显示变量名)。要求将 10 进制形式显示程序段利用子程序进行设计。 (附实现程序) NUM1 EQU 25*4-50 NUM2 EQU NUM1/7 VAR1 DB 1,2,3,4,5 VAR2 DB '12345' NUM4 EQU VAR2-VAR1 NUM5 EQU 0FH BUF DB 7 DUP(?) 2. 利用子程序结构将八位无符号二进制数转换为十进制数的 ASCII 码并显示。 (附实现程序) 3. 用子程序形式求解实验 7 第 3 题:在内存的源数据区 SOURCE 处有若干个 ASCII 码字符,要求将其中的英文大写字母变换为小写字母,其它字符不变换,并存放到结果数据区 DEST 处。 (附实现程序) 4. 修改上述程序:利用 9 号系统功能调用将输入到数据区 DEST 处的字符串在屏幕上显示出来。 5. 用子程序形式求解实验 8 第 3 题:在数据区 SOURCE 处有 20 个字节无符号数,计算其累加和,结果存放在符号地址 RESULT 字单元处。要求以 16 进制形式在屏幕上显示结果。 6. 求将一个 16 位二进制数转换为任意 P ( 0 到 19 )进制数, P 从键盘输入并显示(超过 9 的数字按: 10 用 A , 11 用 B ,, 19 用 I 表示)。 (附实现程序) 7. 求一个小于 65535 的整数 N 的因数分解,即将一个整数分解成质数的乘积。 分析:因数分解的方法是从 I=2 起,看能否整除 N ,如果能,则 I 为一个质数,记下整除后的数代换 N 并继续整除到不能整除为止。再将 I 加 1 后继续,,直到 I 大于被除数为止。 (附实现程序) 8. 计算: f= + 其中 x 、 y 为整型数据,分别存放在 XBUF 和 YBUF 单元中,所得结果 f 存放在 FBUF 中。要求将 FBUF 中数据在屏幕上显示。 (附实现程序) 实验 10 利用子程序进行串处理及有关日期的程序设计 1. 要求自行设定二个字类型的串 STRING1 与 STRING2 的内容,用程序对这二个串进行比较,如果相等, 0 送 BX ,否则, 0FFFFH 送 BX 。设串长为 COUNT 。最后分别以 16 进制形式显示 BX 、 STRING1 与 STRING2 的内容。 2. 已知程序段如下 , 将它补充完整 , 使能将结果( BX 的值)以 16 进制形式在屏幕上显示 , 根据显示情况分析说明其功能是什么?要求将 16 进制显示程序段利用子程序进行设计。 (附实现程序) 3. 对程序段进行补充设计,要求对设计加详细注释。要求自行设定一个长度 COUNT 的字节类型的串 STRING 的内容,用程序对这个串进行搜索,如果搜索到字节类型数据 A ,显示当前位置(字长)。 STRING 、 COUNT 、 A 的内容自行设计。 4. 在一个串中查找一个字符,显示查到该字符的次数。 (附实现程序) 5. 在一个串中查找一个字符,显示所有查到位置的地址。如果没有欲查字符,显示 -1 。 (附实现程序) 6 .在一个串中查找另一串,如果找到,将查到串的首地址存到 DI 中。 (附实现程序) 7 .求编写显示系统的当前日期和时间的程序。要求程序运行时显示的信息格式为: Current date is 10-30-2008 . Current time is 10:23:26.12 (附实现程序) 8. 设计一个万年历程序。已知 2008 年 1 月 1 日 为星期二,求 2008 年之后 21 世纪的某年某月某日是星期几?不考虑输入错误。 (附实现程序) 实验 11 宏汇编程序设计 1. 求三个字节变量 x, y, Z 的值的平均值,并显示其整数部分。 (附实现程序) 2. 编一个菜单程序,在屏幕上显示各菜单项提示,当用户选择并输入 1 或 2 时调用相应宏程序 MACRO1 或 MACRO2 。 MACRO1 将字符串中小写字变大写。 MACRO2 将字符串中大写字变小写。 (附实现程序) 3. 设计从键盘输入 A 、 B 二个数,求其和并显示的程序( A 与 B 的和不大于 65535 )。要求将其中键盘输入、求和、显示的程序分别用宏程序实现。 (附实现程序) 4. 求建立宏库 MACRO1.lib : 5. 将实验 6 、 7 、 8 中供参考的程序段改造成宏程序,并添加到宏库 MACRO1.lib 中去。要求宏体开始处将其中与输入、输出参数无关的所以涉及的寄存器中数据压入堆栈保护。 实验 12 递归程序与浮点运算 1. 利用递归程序求数组最大值。 (附实现程序) 2. 有二个正整数 M 、 N ( M=N ),求它们的最大公约数,放到 DIVISO 中。 (附实现程序) 3. 斐波那契的兔子问题:假定小兔子一个月后可以长成大兔子,二个月及之后的大兔子每个月都会生出一对小兔子。如果年初养了一对小兔子,问到年底时将有多少对兔子 ? (附实现程序) 4. 求 Hanoi 塔的递归程序 (附实现程序) 5. 假设有两个浮点数,其中被加数在双字变量 BUF1 中,加数在双字变量 BUF2 中。试计算其和并置于 BUF3 中。 (附实现程序) 实验 13 BIOS 功能调用程序设计 1. 读键盘,把用户所按键显示出来,若用户按下 SHIFT 键,则结束运行。写出完成该功能的程序。 (附实现程序) 2. 单色文本显示方式举例。在屏幕上的第 9 行第 16 列的位置显示一个黑桃(对应的 ASCII 码为 06H ),要求黑桃为黑色且闪动,背景选为白色(即白底黑字)。 (附实现程序) 3. 彩色文本显示方式举例。以蓝色为背景,在 10 行 20 23 列显示四个梅花( ASCII 码为 5 ) , 梅花的颜色分别选为红、绿、黄和黑色。 (附实现程序) 4. 彩色图形显示方式举例。在屏幕中间显示彩色的梯子。 (附实现程序) 5 .在数据区设置变量 X ,其值为 20 到 40 之间数,求在屏幕中心显示一个正方形,边长等于 X 。 6. 如果已知二个点的坐标( X1 , Y1 )与( X2 , Y2 ),画出连接这两点的连线,假设 X2X1 。 (附实现程序) 7. 在屏幕上设置鼠标位置。 (附实现程序) 8. 已知汉字字模如图所示,求显示该二汉字。如果欲将其长宽均放大一倍,求显示。如果长宽缩小一半,求显示。说明出现的问题。 (附显示汉字实现程序) 实验 14 有关声音的程序设计 1. 编写通用发声子程序,它能利用定时器发出指定频率的声音。在 DI 中存放指定的发声频率,利用 BX 控制延时时间的计数初始值 (附实现程序) 2. 试编写发声程序,利用定时器发出音乐 1234567 ⅰ。 (附实现程序) 3. 设计一个虚拟钢琴程序,手按键盘,根据键盘输入的数据进行演奏。 (附实现程序) 4 .编写一个游戏程序,实现如下功能:( 1 )首先用蓝色清屏。( 2 ) 在在屏幕中央显示由字符串 -============# 组成的黄色的小蛇, # 为蛇头, - 为蛇尾。( 3 ) 按下方向键可以控制上述小蛇按蛇行方式在屏幕上行走。 (附实现程序) 实验 15 文件处理 1. 利用顺序存取方式建立一个文件 FILE1.DAT ,再将预先存放在数据区中的数据顺序写到文件中。 (附实现程序) 2. 从文件 FILE1.DAT 读入一条记录再写入到文件 FILE2.DAT 中。 (附实现程序) 3. 利用随机存取方式建立一个文件 FILE1.DAT ,从键盘输入数据存放在数据区中,再将存放在数据区中的数据写到文件中。 (附实现程序) 4. 求编程序:从键盘输入 20H 个字符到利用扩充文件管理方式建立的文件 FILE1.DAT 。 (附实现程序) 5. 求编程序:将数据从文件 FILE1.DAT 读取 10H 个字符到文件 FILE2.DAT 中。 (附实现程序) 6. 利用扩充文件管理方式从文件 FILE1.DAT 中读出全部内容,再转存到文件 FILE2.DAT 的原内容的后面。 (附实现程序) 7. 从文件 FILE1.DAT 中读出从 N1 起 , 长度为 N2 的字符串 , 在屏幕上显示。 N1 , N2 为十进制数。 (附实现程序) 8. 读出文件 FILE1.DAT 的内容,在屏幕上显示。每次读 1200 个字符,文件最大 64K 。 (附实现程序) 9. 设数据区中有定义: DATA1 DB 100H DUP(0) ; FNAME DB 'FILE1.DAT' ; FCB1 DB 100H DUP(0) 。求利用顺序或随机存取方式建立一个文件 FILE1.DAT ,再将数据区 DATA 中的数据写到文件中。以下给出程序段,请补充完整并上机验证。 10. 查出 C 盘上所有文件名并写入到文件 FilEl.DAT 中。 (附实现程序) 11. 读出 D 盘目录 MASM5 中的文件 FILE1.DAT 的日期与时间。 (附实现程序) 12. 求显示某文件夹下文件目录名称。 (附实现程序) 实验 16 结构类型及其他程序设计 1. 设成绩表数据按如下结构组织。所有数据按左靠齐存放。求填写各人分数排名。 学号(长度: 5 ) 姓名(长度: 8 ) 分数(长度: 1 ) 排名(长度: 2 ) (附实现程序) 2. 设成绩表数据按如下结构组织。所有数据按左靠齐存放,求按分数排名对记录排序。 ; 学号(长度: 5 ) 姓名(长度: 10 ) 分数(长度: 1 ) (附实现程序) 3. 设成绩表数据结构与第二题相同。求录入一条新记录到所有记录之后的程序。 (附实现程序) 4. 设成绩表数据结构与第二题相同。求根据姓名查找并删除所查到记录的程序。 (附实现程序) 5. 已知数据表结构如表所示,数据从文件 FILE1.DBF 起始位置开始,均以 ASCII 码形式存放,每列中的数据长度相同,见标在表中的数据。各行的长度也为定值,等于各列长度之和。求设计依次显示表中各人年龄的程序,年龄以二位 ASCII 码形式存放。(附实现程序) 数据表结构 序号(长度: 4 ) 姓名(长度: 8 ) 年龄(长度: 2 ) 1 Chen 23 2 Wang 25 6. 已知数据表结构及文件结构与上题相同,求编修改程序:根据键盘输入的人的姓名查找行(记录),再将键盘输入的数据去修改表中年龄数据。 (附实现程序) 7. 计算 B/A 的值。利用条件汇编判断 A 是否为 0 后再处理。(附实现程序) 8. 编写在内存中驻留时钟显示的程序 (附实现程序) 9. 编写驻留内存显示键盘缓冲区数据程序 (附实现程序) 附录 输入输出程序设计 1 、已知 8279 与 LED 显示器及小键盘连接如图所示, 8279 的片选 CS79 连至译码处的 210~217 。 8279 工作方式为:左边输入,八位显示,外部译码,双键互锁。求设计程序:( 1 )将键盘接收到的字符送到计算机的显示器上显示。( 2 )在数据区定义二个压缩 BCD 码,求和后在 LED 上显示。 2 、某实验系统将 8255 的片选 CS55 连至译码处的 200~207 。 8255 的 PA 口分接 4 个四个双色灯按要求发光。双色灯接法如下图所示。双色 LED 是由一个红色 LED 管芯和一个绿色 LED 管信封装在一起,公用负端。当红色正端加高电平,绿色正端加低电平时,红灯亮;红色正端加低电平,绿色正端加高电平时,绿灯亮;两端都加高电平时,黄灯亮。求设计程序:状态 1 为:南绿东红北黄西黄灯;延时后状态 2 :南黄东绿北红西黄灯;再延时后状态 3 :南黄东黄北绿西红灯;再延时后状态 4 :南红东黄北黄西绿灯;再反复循环至状态 1 。 3 、编写一个程序完成两台计算机通过 COM2 端口进行串行数据通信。要求从一台计算机上输入字符传送到另一台计算机上,若按下 ESC 键,则退出程序。 COM2 端口初始化为 4800 波特 / 秒, 8 位数据位,无校验, 1 位终止位。 4 、在 A 、 B 两台微机之间实现串行通信, A 机发送, B 机接收。要求把 A 机中的 200 个字符传送到 B 机中。 分析: CPU 与 8251 之间采用查询方式控制数据传输过程,异步传送。发送方 CPU 每查询到 TXRDY 有效,则向 8251A 并行输出一个字节数据;接收方 CPU 每查询到 RXRDY 有效,则从 8251 接收一个字节数据,一直进行到全部数据传送完毕为止。假设传送时数据位为 2 位、 1 位停止位、波特率因子为 64 、偶校验。 8251 的命令 / 状态端口地址为 309H ,数据端口为 308H 。
个人分类: 生活点滴|12688 次阅读|3 个评论
汇编语言实验手册前言
求新 2009-2-16 12:25
实 验 手 册 《汇编语言程序设计》配套教学资料 程学先 林姗 程传庆 前 言 本手册为配合汇编语言程序设计课程的教学而设计,为机械工业出版社出版、我们所编写的《汇编语言程序设计》配套教学资料。本手册包括教材全部软件设计课程内容的实验。关于接口部分实验,需根据所选用实验器材决定,例如如果采用超想-30000TC综合实验/仿真系统组织实验,该系统配有实验讲义,可以按其实验讲义安排实验内容。 本手册由浅入深、由简单到复杂,共安排16组实验,108道题,大多数实验题都提供了实现程序,而且为电子版,可以直接复制、编译、运行,目的是节省代码录入与调试的时间,以往汇编实验一般要求完成20余道实验题,采用电子版实验教材使能在有限时间内更多地接触应用程序,更好地配合理论的学习,深入掌握汇编程序设计的基本理论、基本概念与基本方法。但是,过于简单的操作不利于对程序的理解、不利于培养创新精神、不利于记忆,也防碍培养程序调试的能力。因此,希望读者正确对待本手册,在进入实验后,即使是对于有实现程序的题,也要尽量争取独立完成,再与参考答案对照。有些题可以先简单阅看参考答案,再设法自己编程调试并完成。即使是直接复制,在运行之后,也要认真对照程序,分析程序的结构,了解程序运行过程,记忆其算法、程序设计方法与设计技巧。 为了取得最大成效,建议本手册不直接完整地发到学生手中,而只由教师掌握,根据教学进度与培养的需要,分次拷贝给学生。本手册前四个实验为认识性实验,可以直接复制拷贝原程序,上机编译执行,再分析程序结构与编译执行过程,对汇编语言程序建立感性认识。实验5到8为基本汇编程序设计,手册中提供了一些常用程序段,作为完成实验题的素材,使能快速完成有关实验题。这些程序段也要求学习者背记并熟练掌握。实验9之后为综合性较强练习题,包括极少量难度较大的题,排版时将题与参考程序分开,建议教师先提供实验题,在学生充分研讨后再提供参考程序,以期最有效地调动学生学习积极性与能动性,培养独立思考精神与创新精神。 本手册将提交机械工业出版社网站,向教师发布。为配合本学期教学,将在本博客上按周刊出当周实验内容,请读者跟着进度安排学习。 特别欢迎老师与同学对本手册提出宝贵意见,我们将选择新的实验内容及有关实验题的新的解法补充到将来更新的实验手册中,同时将提供者加入到新版实验手册的作者群中。 目 录 前 言1 实验1 认识性实验5 实验2 数据转换实验8 实验3 简单数据运算程序设计13 实验4 涉及压缩BCD码数据的转换程序及DEBUG练习16 实验5 算术运算程序设计25 实验6 自编有关双精度数据运算及逻辑运算、移位程序31 实验7 循环程序设计练习38 实验8 用循环程序设计方法解串操作问题实验45 实验9 利用子程序实现数据变换与数据处理的程序设计52 实验10 利用子程序进行串处理及有关日期的程序设计72 实验11 宏汇编程序设计84 实验12 递归程序与浮点运算92 实验13 BIOS功能调用程序设计106 实验14 有关声音的程序设计119 实验15 文件处理129 实验16 结构、条件汇编与驻留程序设计147 附录 输入输出程序设计164
个人分类: 生活点滴|6379 次阅读|1 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-21 20:36

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部