汇编语言实验十完整代码和详细解析
汇编语言实验十完整代码和详细解析
建议先自己思考问题的答案,不懂则返回看书
扩展建议: 【非必要内容,个人经验感悟】
从这儿开始,我们正式接触子程序,主要是通过 call和 ret 来实现的。这样就涉及到了入口参数问题,提个写代码风格习惯的建议,只写必要的入口参数,尽量简化参数,为了更好的移植性。
例如写一个清屏函数,它的功能是清除屏幕上的所有字符,就是把相应内存的数据都写为零,它不需要任何参数,随时随地,只要 call clear_screen (函数名),就可以实现此功能, 移植性非常好。如果写一个显示字符串的函数 ,必要的入口参数有行、列、颜色,可以规定此函数的入口参数,用dh 表示列,dl 表示行 ,cl 表示颜色,显示以零结尾的字符串,这样的话它的移植性也是很好的。方便以后的使用。
1、显示字符串
要求: 在指定的位置,用指定的颜色,显示用0结束的字符串。行号,列号,我修改过。可能参数值不太一样,参数值自己设置
;在指定的位置,用指定的颜色,显示用0结束的字符串
assume cs:code
data segmentdb 'Hello world',0 ;修改成welcome to masm 也是可以的,通用,可移植性好。
data endscode segment
start:mov dh,24 ;dh 行号,0-24mov dl,8 ;dl 列号,0-79mov cl,1 ;cl 颜色mov ax,datamov ds,axmov si,0 ;ds:si指向字符串首地址call show_strmov ax,4c00hint 21hshow_str:push dxpush axpush dipush espush cxpush dspush si;实际行号mov ax,160mul dh ;行号偏移地址存在al中mov dh,0
;实际列号dec dladd dl,dl ;列偏移地址存在dl中add ax,dx mov di,ax ;总体偏移地址在di中mov ax,0b800hmov es,ax ;所以es:[di]指向显存中的第一个位置mov ah,cl ;颜色存在ah中mov cx,0
s:mov al,ds:[si]mov cl,aljcxz overmov es:[di],axinc siadd di,2jmp short s
over:pop sipop dspop cxpop espop dipop axpop dxretcode ends
end start
此代码在DOS下的运行结果截图:
2、解决除法溢出的问题
a、主要是表达出这个计算公式,X65536=X10000H,将十六进制的X左移四位。
b、另外一个可能忽视的点,当子程序返回后,相应的值用ax ,cx ,dx 存储,也就是ret执行后,已经是存储好了,所以设置好相应的值后,再ret返回。
assume cs:code
data segmentdw 8 dup(0)
data endscode segment
start:
; mov ax,data
; mov ds,axmov ax,4240h ;被除数低16位mov dx,000fh ;被除数高16位mov cx,0ah ;除数call divdwmov ax,4c00hint 21hdivdw:push axmov ax,datamov ds,axmov ax,dx ;被除数:dx存放高位,ax存放低位mov dx,0div cx ;ax存放着商,dx存放着余数mov ds:[0],ax ;左侧数据的高位,也是所求表达式的商的高位;对与右侧数据而言,余数dx的值为高位数据,L(原始被除数低16的值)
;仅为直观 mov dx,dx pop ax ;右侧数据的被除数的低位push ax ;再恢复元数据div cx ;ax存放着商,dx存放着余数mov ds:[2],ax ;此内存单元的值为所求表达式的商的低位mov ds:[4],dx ;此内存单元的值为所求表达式的余数pop axmov ax, ds:[2]mov dx, ds:[0]mov cx, ds:[4]ret
code ends
end start
此程序在DOSBox下的运行结果:
3、数值显示
将data段中的数据以十进制形式显示出来,8行,3列,绿色。显示比较容易,直接用之前写好的showstr 函数。关键呢就是把数据“分开”,还是老祖宗的办法,除k取余法!
;将data段中的数据以十进制形式显示出来,8行,3列,绿色
assume cs:code
data segmentdw 123,12666,1,8,3,38
data endsout segmentdb 32 dup (0)
out endsstack segmentdw 24 dup (0)
stack endscode segment
start:mov ax,datamov ds,axmov di,0mov ax,stackmov ss,axmov sp,48mov ax,outmov es,axmov si,0mov cx,6css:call divw dec cxjcxz deleteinc cxjmp nextdelete:inc cxdec si ;divw函数结束,指向out段中最后一个逗号mov al,0mov es:[si],al ;将该逗号去掉,将值修改为0,即字符串结束标志next: loop css mov dh,8 ;在8行3列显示为绿色mov dl,3mov cl,2call show_strmov ax,4c00hint 21hdivw: ;将data中的每一个十进制数值拆分存储在out段中;12666=317aH,需要16位除法,段中数据无溢出;16位除法,被除数32位,dx高位,ax低位,ax商,dx余数push axpush bxpush cxpush dxpush esmov cx,0mov ax,ds:[di] ;低位放data中数据mov bx,10 ;除数一直为10divnei:mov dx,0 ;高位放0div bx ;ax商,dx余数add dl,30hpush dx ;先将余数存放起来(逆序)inc cx ;用cx记录数据的位数,为pop计数push cx ;A 将该计数cx先存放,防止jcxzmov cx,axjcxz divneioverpop cx ;内部未结束,对应A处的push cx,继续计数jmp short divneidivneiover: ;一个数据分离完毕,进行存放;cx已经对数据的位数计数,直接使用pop cx ;内部结束,对应A处的push cx,结束计数
; mov cx,cxdivcun:pop axmov es:[si],alinc siloop divcun;一个数据处理完毕,隔一个逗号mov al,2chmov es:[si],al ;逗号的ascii是2chinc si;一个数据处理完毕,loop到下一个数据,divwai开始inc diinc di ;word型数据,加两字节;数据处理完毕,返回原程序处pop espop dxpop cxpop bxpop axretshow_str:push dxpush axpush dipush espush cxpush dspush simov ax,outmov ds,axmov si,0 ;ds:si指向字符串首地址;实际行号inc dh ;不太懂,可能是因为有第0行??mov ax,160mul dh ;行号偏移地址存在al中mov dh,0
;实际列号dec dladd dl,dl ;列偏移地址存在dl中add ax,dx mov di,ax ;总体偏移地址在di中mov ax,0b800hmov es,ax ;所以es:[di]指向显存中的第一个位置mov ah,cl ;颜色存在ah中mov cx,0
s:mov al,ds:[si]mov cl,aljcxz overmov es:[di],axinc siadd di,2jmp short s
over:pop sipop dspop cxpop espop dipop axpop dxretcode ends
end start
此代码在DOSBox下的运行结果:
汇编语言实验十完整代码和详细解析相关推荐
- 汇编语言实验12完整代码及详细解析
汇编语言实验12完整代码及考察点 建议先自己思考问题的答案,不懂则返回看书 很简单的一个程序,不做额外的分析,看代码就懂了.本章主要是理解中断的过程.原理. assume cs:code code s ...
- 编译原理上机实习c语言小子集编译程序的实现报告,合肥工业大学编译原理实验报告(完整代码版)...
<合肥工业大学编译原理实验报告(完整代码版)>由会员分享,可在线阅读,更多相关<合肥工业大学编译原理实验报告(完整代码版)(58页珍藏版)>请在人人文库网上搜索. 1.计算机与 ...
- CV项目肢体动作识别(三)内附完整代码和详细讲解
CV项目肢体动作识别(三)内附完整代码和详细讲解 首先我还是给出完整的代码,然后再进行详细的讲解.这一次我们用模块化的思想,把一个功能模块化(moudle),这种思想在工程中非常常见,在分工中你需要做 ...
- kaggle猫狗分类的总结(AlexNet模型, keras框架),完整实验流程,源代码和详细解析
现在将已掌握的知识进行总结,方便以后自己写网络增加思路. 首先数据集下载:链接:https://pan.baidu.com/s/1U4N0PCNfyIP9iHLidVb9xA 提取码:vcvl ker ...
- 汇编语言实验十-《汇编语言-王爽老师》
10.实验十 1.显示字符串 主要需解决的问题:字符串在显存中的地址定位 代码及注释如下: ;LAB10-1.asm assume cs:code data segmentdb 'Welcome to ...
- saxparser_使用SaxParser和完整代码进行XML解析
saxparser SAX解析器使用回调函数(org.xml.sax.helpers.DefaultHandler)通知客户端XML文档结构. 您应该扩展DefaultHandler并重写一些方法来实 ...
- 使用SaxParser和完整代码进行XML解析
SAX解析器使用回调函数(org.xml.sax.helpers.DefaultHandler)通知客户端XML文档结构. 您应该扩展DefaultHandler并重写一些方法来实现xml解析. 覆盖 ...
- 扫雷【含递归和标记的完整代码及详细讲解】
目录 一.游戏思路 二.游戏部分设计 1.棋盘的初始化 2.棋盘的打印 3.雷场的布置 4.用户排雷 5.递归函数部分 三.完整代码 四.结语 扫雷,扫雷是一款大众类的益智小游戏,于1992年发行.游 ...
- CSAPP Lab5实验记录 ---- Shell Lab(实验分析 + 完整代码)
文章目录 Lab 总结博客链接 前引 Lab5 Shell Lab 1.获取相关Lab材料 2.Overview(总览) 3.Explore(实现前的摸索) 4.函数实现 + 实现代码分析 1.eva ...
最新文章
- python二值化 感兴趣区域_Python+OpenCV感兴趣区域ROI提取方法
- github的使用教程
- python二级考试可以用pycharm吗_学Python,Pycharm不能不知道怎么用
- 如果从SVN到GIT
- Nginx的应用之安装配置
- C语言文件打开方式及说明
- linux nslcd服务,CentOS 6通过ldap集成AD域账号(nslcd方式)
- 关闭打开苹果电脑Rootless机制
- 【kafka】Apache Kafka 0.11版本新功能简介
- 3D应用开发中的欧拉角和旋转矩阵
- laravel 5.4 引入自定义类
- “用户体验及可用性测试”读后感
- 推荐下载使用:COMODO Internet Security V5.0.157302.1066 多国语言版(含:简体中文)
- ASPEN.HYSYS.V7.1,Thermoflow软件分享下载
- 【CSS】CSS怎么设置小于12px的字体 浏览器限制最小字体大小解决方法
- SpringCloud之服务网关(总体第五篇)
- js报错未定义的ajax,ReactJS和AJAX未捕获TypeError:无法读取未定义的属性'错误'
- 【金猿案例展】某新型股份制商业银行——客服智能质检系统建设
- PHP下载远程图片的几种方法总结
- 前端开发:JS中截取字符串的用法总结