合肥工业大学2021汇编语言程序设计上机实验一
实验一 基本汇编程序设计
- 实验目的
1、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程;
2、掌握基本汇编语言程序设计方法。
3、熟悉DOSBOX下运行dos程序方法;
4、熟悉debug调式程序的基本方法;
- 实验内容
1、数据段中X、Y、Z、V均为字变量,存放的是16位带符号数。编写汇编语言程序计算表达式值(V–(X*Y+Z-720))/X。要求:
(1)使用MASM和LINK生成可执行程序后,使用Debug装入内存;
(2)使用U、D命令查看代码段和数据段的内容,特别注意变量在代码段中的形式;使用G命令执行代码,并查看结果;
(3)用E命令修改各个命令的内容,再次用G命令执行。
2、BL中的只有一位为1。编写程序测试,并输出提示信息“The X Bit is 1”,要求:
(1)使用地址表实现分支功能,在分支中输出提示信息;
(2)程序直接执行,不需要再使用debug。
3、编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数字数),要求:
(1)输入参数通过堆栈传送,输出参数通过AX传送;
(2)结果需要输出到屏幕上。
- 实验过程和程序
1:
详细过程:由题目中“字变量”和“带符号数”的条件,所以在定义数据段时,为X、Y、Z、V分配一个字的空间;然后定义res和rem这两个字单元用来分别存放运算结果的整数部分和小数部分。分别对X、Y、Z、V赋初值或是在DEBUG环境下通过E命令修改初值,如此就可以用不同的数据来验证程序。在有符号数运算中,乘法运算的乘数是字类型,被乘数默认是AX中的内容,得到结果为(DX,AX);除法运算的除数同样也是字类型,除数默认为(DX,AX),但不同的是需要对被除数进行扩展,也就是cwd。最后将结果的整数部分存入res单元中,余数存入rem单元中。
源程序:
stack segment stack
dw 512 dup(?)
stack ends
data segment;在数据段定义数据x dw 0001h y dw 0002hz dw 0003h v dw 0004hres dw ?rem dw ?
data ends
code segment ;(V–(X*Y+Z-720))/X
assume cs:code,ds:data,ss:stack
start: mov ax,data;把data赋给给ax mov ds, ax;把数据转到数据段寄存器mov ax,ximul ymov cx,axmov bx,dxmov ax,zcwdadd cx,axadc bx,dx;x*y+zsub cx,720sbb bx,0;x*y+z-720mov ax,vcwdsub ax,cxsbb dx,bx;(V–(X*Y+Z-720))idiv x;(V–(X*Y+Z-720))/Xmov res,ax;把结果整数部分存放在res单元中mov rem,dx;把结果余数部分存放在rem单元中mov ah,4chint 21h
code endsend start
2:
详细过程:实验二要求我们使用地址表实现分支功能,并在分支中输出提示信息,所以需要在定义数据段时,使用字单元,实现n号分支地址=入口地址表首地址+n *2;然后题目要求检查bl这八位二进制数中哪一位为1,我想到了使用test命令,在al中放置00000001b,与bl进行test,得到结果便跳转到地址表中相应的提示信息,否则将al左移,继续进行test,直到得到结果。
源程序:
stack segment stack
dw 512 dup(?)
stack ends
data segment;在数据段定义数据address dw L1,L2,L3,L4,L5,L6,L7,L8;地址表string1 db 'The 1 Bit is 1 $'string2 db 'The 2 Bit is 1 $'string3 db 'The 3 Bit is 1 $'string4 db 'The 4 Bit is 1 $'string5 db 'The 5 Bit is 1 $'string6 db 'The 6 Bit is 1 $'string7 db 'The 7 Bit is 1 $'string8 db 'The 8 Bit is 1 $'string9 db 'No bit is 1 $'
data ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax, data;把data赋给给ax mov ds, ax;把数据转到数据段寄存器mov al,00000001Bmov si,0mov bl,00000100B;设置blcmp bl,0jz errormov cx,8
again:test bl,aljz nextjmp address[si]
next:shl al,1add si,2;指向下一地址loop again
L1:mov dx,offset string1jmp print
L2:mov dx,offset string2jmp print
L3:mov dx,offset string3jmp print
L4:mov dx,offset string4jmp print
L5:mov dx,offset string5jmp print
L6:mov dx,offset string6jmp print
L7:mov dx,offset string7jmp print
L8:mov dx,offset string8jmp print
error:mov dx,offset string9mov ah,09hint 21h
print:mov ah,09hint 21hmov ah,4chint 21h
code endsend start
3:
详细过程:实验三要求编写子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数字数),
因为是有符号数,所以先定义DW类型的x、y、z;而后题目要求输入参数通过堆栈传送,输出参数通过AX传送,所以先分别定义两个子程序input和output实现输入和输出;调用输入子程序input,从键盘输入x、y,得到x、y后通过堆栈传送到计算子程序计算后得到结果在ax,最后调用输出子程序将ax中的结果输出到屏幕上。
源程序:
stack segment stackdw 512 dup(?)
stack ends
data segment;在数据段定义数据x dw 0 y dw 0z dw 0mes1 db 'Please input x: $';,0dh,0ah,'$'mes2 db 'Please input y: $';,0dh,0ah,'$'mes3 db 'The result is: $';,0dh,0ah,'$'
data ends
code segment ;z=f(x,y)=x*y+x-y
assume cs:code,ds:data,ss:stack
start: mov ax,data;把data赋给给ax mov ds,ax;把数据转到数据段寄存器mov ah,09hmov dx,offset mes1;提示输入int 21hcall inputmov x,ax;输入xmov ah,09hmov dx,offset mes2;提示输入int 21hcall inputmov y,ax;输入y;计算push xpush ycall funmov z,axmov ah,09hmov dx,offset mes3int 21hmov ax,zcall outputjmp donefun proc nearpush bpmov bp,sppush bxpush cxmov cx,[bp+6];提取xmov bx,[bp+4];提取ymov ax,cximul bx;x*yadd ax,cx;x*y+xsub ax,bx;x*y+x-ypop cxpop bxpop bpret 4
fun endpinput proc nearpush bxpush cxpush dxxor bx,bx;bx保存结果xor cx,cx;cx为正负标志,0为正,1为负mov ah,1;输入一个字符int 21hcmp al,'+';是“+”,继续输入字符jz input1cmp al,'-';是“-”jnz input2mov cx,-1;设置-1标志
input1:mov ah,1int 21h
input2:cmp al,'0';不是0~9之间的字符,则输入数据结束jb input3cmp al,'9'ja input3sub al,30h;是0~9之间的字符,则转换为二进制数shl bx,1;利用移位指令,实现数值乘10:BX<-BX*10mov dx,bxshl bx,1shl bx,1add bx,dxmov ah,0add bx,ax;已输入数值乘10后,与新输入数值相加jmp input1;继续输入字符
input3:cmp cx,0;是负数,进行求补jz input4neg bx
input4:mov ax,bx;设置出口参数pop dxpop cxpop bxret;子程序返回output proc nearpush axpush bxpush dxtest ax,axjnz output1mov dl,'0'mov ah,2int 21hjmp output5
output1:jns output2mov bx,axmov dl,'-'mov ah,2int 21hmov ax,bxneg ax
output2:mov bx,10push bx
output3:cmp ax,0jz output4sub dx,dxdiv bxadd dl,30hpush dxjmp output3
output4:pop dxcmp dl,10je output5mov ah,2int 21hjmp output4
output5: pop dxpop bxpop axretdone: mov ah,4chint 21h
code endsend start
- 实验结果(包括必要的截图)
1:
将程序装入debug
分别使用u、d、g 命令:
x=1,y=2,z=3,v=4
使用d命令查看结果:结果为02 CF,正确
e命令修改x=20 ,y=30,z=10,v=60 后g命令执行
然后d命令查看,如图所示,结果为FF E9,正确
2:
3:
- 实验体会
- 加深了我对汇编语言中算数运算指令的理解与掌握,特别是imul:对于两个有符号字相乘ax存低16位,dx存高16位,且默认目的操作数为ax,8进制相乘默认操作数为al 结果传ax;对于除法:两个16进制字相除,其商存于低16位ax,其余数存高16位dx,且默认目的操作数为ax,只需一个源操作数r16,字节相除默认操作数为ax,商传 al,余数存ah,需一个r6。
- 我了解了如何使用地址表和转移表,并且通过实现地址表与转移表加深了对汇编寻址方式的了解。
- 加强了我对子程序的认识,对子程序压栈传参数过程中,栈中的变化更加深刻,far段间压栈系统压入 cs:ip,段内near则默认压入ip,在传参取相应的栈中的数据时,要注意数据地址和sp的相对位置,压栈入栈只针对r16和mem16。可将bp压栈并将sp赋值给bp,利用[bp+x]获取相应的栈内的数据的值,最后程序需要保护现场,顺序压栈,逆序出栈;平衡堆栈,可以利用子程序中ret相应的压入数据的字节数总和,或者主程序执行call后add sp,n(相应的压入数据的字节数总和)。
其他实验:
合肥工业大学2021汇编语言程序设计上机实验二https://blog.csdn.net/qq_52791068/article/details/122703830
合肥工业大学2021汇编语言程序设计上机实验一相关推荐
- 合肥工业大学2021汇编语言程序设计上机实验二
实验二 高级汇编程序设计 实验目的 1. 掌握中断服务子程序的编写. 2. 汇编语言与高级语言的混编. 实验内容 1.挂接1CH中断,正计时90秒后退出.要求屏幕显示0-89的秒数. 2.VC++中 ...
- 合肥工业大学2021离散数学上机实验一
实验一:逻辑运算表示与验证 实验目的和要求 实验目的:理解命题逻辑相关运算,增强逻辑推理能力 实验要求: (1).从键盘输入命题常元的真值求他们的合取.析取.求反.异或.单条件. 双条件以及命题表达式 ...
- 合工大计算机学硕分数线,合肥工业大学2021考研复试分数线已公布
2021考研国家线已公布,接下来迎来的是考研复试分数线,复试分数线决定游走在边缘的考生是否能够顺利进入复试环节,中公考研为大家整理"合肥工业大学2021考研复试分数线已公布",一起 ...
- 合肥工业大学计算机保研,合肥工业大学2021届保研分析,全校保研率12. 6%,而“它”48.8%...
合肥工业大学位于安徽,是教育部直属的全国重点大学,有合肥和宣城两个校区,学校是"211工程"."双一流"一流学科建设高校,管理科学与工程.电气.机械等学科为学校 ...
- 合肥工业大学2022大数据技术实验一
实验序号及名称:实验 一 安装Hadoop 实验时间∶ 2022年5月8日 预习内容 一.实验目的和要求∶ 在虚拟机上安装并熟悉Hadoop 二.实验任务∶ 请各位同学完成如下3个实验中的1个, ...
- 合肥工业大学2022大数据技术实验二
实验序号及名称:实验二 在Hadoop平台上部署WordCount程序实验时间∶ 2022年5月14日 预习内容 一.实验目的和要求∶ 在Hadoop平台上部署WordCount程序. 二.实验任务∶ ...
- 合工大计算机专业拟录取名单,合肥工业大学2021硕士研究生拟录取名单链接汇总...
2021合肥工业大学研究生拟录取名单汇总(各学院) 机械工程学院2021年硕士研究生拟录取名单公示 http://jxxy.hfut.edu.cn/2021/0330/c9177a252788/pag ...
- java合肥工业大学考试题库_合肥工业大学java程序设计实验二
合肥工业大学java程序设计实验二 1 / 3<Java 程序设计>实验报告--实验 2实验室:三.四机房 2014 年 05 月 22日学院 计算机与信息学院 专业班级 姓名 成绩课程名 ...
- 合肥工业大学c语言是试卷,合肥工业大学2005-2007年C语言程序设计试卷参考答案.doc-资源下载人人文库网...
合肥工业大学2005-2007年<C语言程序设计>试卷参考答案.doc 合肥工业大学2005年C语言程序设计试卷参考答案一. 填空题(分,每空1分)1main( ) 或主函数 21 7 3 ...
最新文章
- 《中国人工智能学会通讯》——6.27 超越模式识别
- Linux学习笔记03
- 文献学习(part88)--Graph Learning for Multiview Clustering
- UITabBarController的基本原理及使用(一)
- 从外网Thinkphp3日志泄露到杀入内网域控 - 红队攻击之域内靶机渗透实战演练
- 忘记手势密码的解决办法
- 【牛客 - 331G】炫酷数字(反素数打表 或 扩展埃式筛法,结论)
- 解决172.17 或者172.18 机房环境下harbor服务器不通的问题
- _stdcall与_cdecl的区别
- 基于JSP+Servlet校园二手交易平台
- 射频功放学习之ADS原理图版图联合仿真
- Hyperledger Fabric(1) - 整体架构和源码结构
- Surface Defect Detection Methods for Industrial Products : A Review
- 淹没之城(Submerged).PC单机游戏 免费下载.虚幻4 打造
- Excel的Sumif函数
- Windows Terminal 配置GIT
- Semantic Mapping in ROS学习及代码运行
- Excel怎样把相同列数据合并到一行
- 微生物组+代谢组联合分析
- ubuntu下tree命令的使用
热门文章
- 【游戏合集】手机都要被塞爆了,6款优质Pygame游戏合集降临~(附源码)
- 科全进销存系统单机永久免费版
- 计算机组成原理期末复习第三章-3(唐朔飞)
- VSS2005配置错误:The Sourcesafe Web service cannot be accessed at the specified address
- 新华三半导体:初芯如磐,笃行致远
- Yahoo!创始人:杨致远
- python怎么导入sql数据库,##使用python将excel表中数据导入sql server数据库
- python简单爬虫代码,python入门
- matlab 遗传算法工具箱(GATBX)
- Java运用jna、vlcj实现音乐和视频的播放器1-主界面设计