汇编语言实验十完整代码和详细解析

建议先自己思考问题的答案,不懂则返回看书

扩展建议: 【非必要内容,个人经验感悟】
从这儿开始,我们正式接触子程序,主要是通过 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下的运行结果:

汇编语言实验十完整代码和详细解析相关推荐

  1. 汇编语言实验12完整代码及详细解析

    汇编语言实验12完整代码及考察点 建议先自己思考问题的答案,不懂则返回看书 很简单的一个程序,不做额外的分析,看代码就懂了.本章主要是理解中断的过程.原理. assume cs:code code s ...

  2. 编译原理上机实习c语言小子集编译程序的实现报告,合肥工业大学编译原理实验报告(完整代码版)...

    <合肥工业大学编译原理实验报告(完整代码版)>由会员分享,可在线阅读,更多相关<合肥工业大学编译原理实验报告(完整代码版)(58页珍藏版)>请在人人文库网上搜索. 1.计算机与 ...

  3. CV项目肢体动作识别(三)内附完整代码和详细讲解

    CV项目肢体动作识别(三)内附完整代码和详细讲解 首先我还是给出完整的代码,然后再进行详细的讲解.这一次我们用模块化的思想,把一个功能模块化(moudle),这种思想在工程中非常常见,在分工中你需要做 ...

  4. kaggle猫狗分类的总结(AlexNet模型, keras框架),完整实验流程,源代码和详细解析

    现在将已掌握的知识进行总结,方便以后自己写网络增加思路. 首先数据集下载:链接:https://pan.baidu.com/s/1U4N0PCNfyIP9iHLidVb9xA 提取码:vcvl ker ...

  5. 汇编语言实验十-《汇编语言-王爽老师》

    10.实验十 1.显示字符串 主要需解决的问题:字符串在显存中的地址定位 代码及注释如下: ;LAB10-1.asm assume cs:code data segmentdb 'Welcome to ...

  6. saxparser_使用SaxParser和完整代码进行XML解析

    saxparser SAX解析器使用回调函数(org.xml.sax.helpers.DefaultHandler)通知客户端XML文档结构. 您应该扩展DefaultHandler并重写一些方法来实 ...

  7. 使用SaxParser和完整代码进行XML解析

    SAX解析器使用回调函数(org.xml.sax.helpers.DefaultHandler)通知客户端XML文档结构. 您应该扩展DefaultHandler并重写一些方法来实现xml解析. 覆盖 ...

  8. 扫雷【含递归和标记的完整代码及详细讲解】

    目录 一.游戏思路 二.游戏部分设计 1.棋盘的初始化 2.棋盘的打印 3.雷场的布置 4.用户排雷 5.递归函数部分 三.完整代码 四.结语 扫雷,扫雷是一款大众类的益智小游戏,于1992年发行.游 ...

  9. CSAPP Lab5实验记录 ---- Shell Lab(实验分析 + 完整代码)

    文章目录 Lab 总结博客链接 前引 Lab5 Shell Lab 1.获取相关Lab材料 2.Overview(总览) 3.Explore(实现前的摸索) 4.函数实现 + 实现代码分析 1.eva ...

最新文章

  1. python二值化 感兴趣区域_Python+OpenCV感兴趣区域ROI提取方法
  2. github的使用教程
  3. python二级考试可以用pycharm吗_学Python,Pycharm不能不知道怎么用
  4. 如果从SVN到GIT
  5. Nginx的应用之安装配置
  6. C语言文件打开方式及说明
  7. linux nslcd服务,CentOS 6通过ldap集成AD域账号(nslcd方式)
  8. 关闭打开苹果电脑Rootless机制
  9. 【kafka】Apache Kafka 0.11版本新功能简介
  10. 3D应用开发中的欧拉角和旋转矩阵
  11. laravel 5.4 引入自定义类
  12. “用户体验及可用性测试”读后感
  13. 推荐下载使用:COMODO Internet Security V5.0.157302.1066 多国语言版(含:简体中文)
  14. ASPEN.HYSYS.V7.1,Thermoflow软件分享下载
  15. 【CSS】CSS怎么设置小于12px的字体 浏览器限制最小字体大小解决方法
  16. SpringCloud之服务网关(总体第五篇)
  17. js报错未定义的ajax,ReactJS和AJAX未捕获TypeError:无法读取未定义的属性'错误'
  18. 【金猿案例展】某新型股份制商业银行——客服智能质检系统建设
  19. PHP下载远程图片的几种方法总结
  20. 前端开发:JS中截取字符串的用法总结

热门文章

  1. AES加密解密算法设计(C++)
  2. oracle补位函数 不足位数补0
  3. WSN关键字+自编码网络学习法
  4. 什么是碳中和,如何实现?
  5. (第二章) hive安装之Hive安装部署
  6. 如何阅读AI顶会论文?
  7. Python全栈编程
  8. 智能对话之对话管理综述
  9. 【Dubbo】dubbo 2.6.x 的dubbo-admin管理平台的搭建
  10. 程序员的奋斗史(四十六)——大学断代史(十)——给学弟学妹们的忠告——终结篇