实验一  基本汇编程序设计

  • 实验目的

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:

  • 实验体会
  1. 加深了我对汇编语言中算数运算指令的理解与掌握,特别是imul:对于两个有符号字相乘ax存低16位,dx存高16位,且默认目的操作数为ax,8进制相乘默认操作数为al 结果传ax;对于除法:两个16进制字相除,其商存于低16位ax,其余数存高16位dx,且默认目的操作数为ax,只需一个源操作数r16,字节相除默认操作数为ax,商传 al,余数存ah,需一个r6。
  2. 我了解了如何使用地址表和转移表,并且通过实现地址表与转移表加深了对汇编寻址方式的了解。
  3. 加强了我对子程序的认识,对子程序压栈传参数过程中,栈中的变化更加深刻,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汇编语言程序设计上机实验一相关推荐

  1. 合肥工业大学2021汇编语言程序设计上机实验二

    实验二  高级汇编程序设计 实验目的 1. 掌握中断服务子程序的编写. 2. 汇编语言与高级语言的混编. 实验内容 1.挂接1CH中断,正计时90秒后退出.要求屏幕显示0-89的秒数. 2.VC++中 ...

  2. 合肥工业大学2021离散数学上机实验一

    实验一:逻辑运算表示与验证 实验目的和要求 实验目的:理解命题逻辑相关运算,增强逻辑推理能力 实验要求: (1).从键盘输入命题常元的真值求他们的合取.析取.求反.异或.单条件. 双条件以及命题表达式 ...

  3. 合工大计算机学硕分数线,合肥工业大学2021考研复试分数线已公布

    2021考研国家线已公布,接下来迎来的是考研复试分数线,复试分数线决定游走在边缘的考生是否能够顺利进入复试环节,中公考研为大家整理"合肥工业大学2021考研复试分数线已公布",一起 ...

  4. 合肥工业大学计算机保研,合肥工业大学2021届保研分析,全校保研率12. 6%,而“它”48.8%...

    合肥工业大学位于安徽,是教育部直属的全国重点大学,有合肥和宣城两个校区,学校是"211工程"."双一流"一流学科建设高校,管理科学与工程.电气.机械等学科为学校 ...

  5. 合肥工业大学2022大数据技术实验一

    实验序号及名称:实验 一    安装Hadoop 实验时间∶ 2022年5月8日 预习内容 一.实验目的和要求∶ 在虚拟机上安装并熟悉Hadoop 二.实验任务∶ 请各位同学完成如下3个实验中的1个, ...

  6. 合肥工业大学2022大数据技术实验二

    实验序号及名称:实验二 在Hadoop平台上部署WordCount程序实验时间∶ 2022年5月14日 预习内容 一.实验目的和要求∶ 在Hadoop平台上部署WordCount程序. 二.实验任务∶ ...

  7. 合工大计算机专业拟录取名单,合肥工业大学2021硕士研究生拟录取名单链接汇总...

    2021合肥工业大学研究生拟录取名单汇总(各学院) 机械工程学院2021年硕士研究生拟录取名单公示 http://jxxy.hfut.edu.cn/2021/0330/c9177a252788/pag ...

  8. java合肥工业大学考试题库_合肥工业大学java程序设计实验二

    合肥工业大学java程序设计实验二 1 / 3<Java 程序设计>实验报告--实验 2实验室:三.四机房 2014 年 05 月 22日学院 计算机与信息学院 专业班级 姓名 成绩课程名 ...

  9. 合肥工业大学c语言是试卷,合肥工业大学2005-2007年C语言程序设计试卷参考答案.doc-资源下载人人文库网...

    合肥工业大学2005-2007年<C语言程序设计>试卷参考答案.doc 合肥工业大学2005年C语言程序设计试卷参考答案一. 填空题(分,每空1分)1main( ) 或主函数 21 7 3 ...

最新文章

  1. 《中国人工智能学会通讯》——6.27 超越模式识别
  2. Linux学习笔记03
  3. 文献学习(part88)--Graph Learning for Multiview Clustering
  4. UITabBarController的基本原理及使用(一)
  5. 从外网Thinkphp3日志泄露到杀入内网域控 - 红队攻击之域内靶机渗透实战演练
  6. 忘记手势密码的解决办法
  7. 【牛客 - 331G】炫酷数字(反素数打表 或 扩展埃式筛法,结论)
  8. 解决172.17 或者172.18 机房环境下harbor服务器不通的问题
  9. _stdcall与_cdecl的区别
  10. 基于JSP+Servlet校园二手交易平台
  11. 射频功放学习之ADS原理图版图联合仿真
  12. Hyperledger Fabric(1) - 整体架构和源码结构
  13. Surface Defect Detection Methods for Industrial Products : A Review
  14. 淹没之城(Submerged).PC单机游戏 免费下载.虚幻4 打造
  15. Excel的Sumif函数
  16. Windows Terminal 配置GIT
  17. Semantic Mapping in ROS学习及代码运行
  18. Excel怎样把相同列数据合并到一行
  19. 微生物组+代谢组联合分析
  20. ubuntu下tree命令的使用

热门文章

  1. 【游戏合集】手机都要被塞爆了,6款优质Pygame游戏合集降临~(附源码)
  2. 科全进销存系统单机永久免费版
  3. 计算机组成原理期末复习第三章-3(唐朔飞)
  4. VSS2005配置错误:The Sourcesafe Web service cannot be accessed at the specified address
  5. 新华三半导体:初芯如磐,笃行致远
  6. Yahoo!创始人:杨致远
  7. python怎么导入sql数据库,##使用python将excel表中数据导入sql server数据库
  8. python简单爬虫代码,python入门
  9. matlab 遗传算法工具箱(GATBX)
  10. Java运用jna、vlcj实现音乐和视频的播放器1-主界面设计