实验10 编写子程序
1,显示字符串
assume cs:codesg, ds:datasgdatasg segmentdb 'hello, world', 0
datasg endscodesg segment
start: mov dh, 14mov dl, 40mov cl, 2mov ax, datasgmov ds, axmov si, 0 ;si point to datacall show_strmov ax, 4c00hint 21h;-------show_str---------------
show_str:push sipush dipush cxpush bxmov bl, clmov ax, 0b800hmov es, axmov di, 0mov al, 160mul dhmov di, axmov al, 2 ;es:di point to display memorymul dladd di, axs: xor cx, cxmov cl, ds:[si]jcxz okmov es:[di+0], clmov es:[di+1], bladd si, 1add di, 2jmp sok: pop bxpop cxpop dipop siretcodesg ends
end start
实验结果:
2,解决除法溢出的问题
复习一下常规cpu中div指令的设计:
(1)除数:有8位和16位两种,在一个reg或者内存单元中;
(2)被除数:默认放在ax或者dx和ax中,如果除数为8位,则被除数为16位,默认放在ax中;如果除数为16位,被除数则位32位,在dx和ax中存放,dx存放高位,ax存放低位;
(3)结果:如果除数为8位,则al存放商,ah存放余数;如果除数为16位,则ax存放商,dx存放余数。
现在要求的divdw功能是:被除数为dword型,除数为word型,结果为dword型,其中dx存放高16位,ax存放低16位,cx存放余数。
代码如下:
assume cs:codesg, ds:datadata segmentdw 8 dup(0)
data endscodesg segment
start: mov ax, 4240hmov dx, 000fhmov cx, 0ahcall divdwmov ax, 4c00hint 21h;----------divdw--------------
divdw: push bx push ax mov ax,dx mov dx,0 div cx mov bx,ax ;将商的高位临时放到bx中 pop ax div cx ;上一步div的余数(在dx中)做高位,连同ax中的数据(低位)一起做被除数 mov cx,dx ;将余数给cx mov dx,bx pop bx ret codesg ends
end start
实验结果:
上面的算法完全按照 X/N=INT(H/N)*10000H+[REM(H/N)*10000H+L]/N(在课本208页),对照代码分析,一点都不难。
很多事情难,是因为一直拖延,不敢开始;
很多事情难,是因为太急,没有坚持而匆匆放弃;
很多事情难,是因为只是看了一眼难。
加油。
3,数值显示
;dtoc---------------------------
dtoc: push axpush bxpush cxpush dxpush sichange_dtoc:mov cx, 10xor dx, dxcall divdwxor ch, chadd cl, 30hmov ds:[di], cl ;把余数暂存到内存2中inc dimov cx, ax ;检查商是否为0jcxz dtoc_retjmp change_dtocdtoc_ret:mov cx, disub di, 1
loop_s: mov bl, ds:[di]sub di, 1mov ds:[si], blinc siloop loop_spop sipop dxpop cxpop bxpop axret
本程序比较伤脑筋的地方就是求出来数字的顺序是从低位到高位,而输出的顺序是从高位到低位,这里有一个比较好的办法是先把数字从低位到高位存放到数据段中的后边某个位置,然后再反序复制到0位置开始的数据段中。
加油!
实验10 编写子程序相关推荐
- 汇编语言(王爽)实验十 编写子程序
标 题: 汇编实验10-- 编写子程序 作 者: XHS_12302 时 间: 2016_7_28 16:56 实验10编写子程序 在这次实验中,我们将要编写3个子程序,通过它们来认识几个常见的问题和 ...
- 汇编语言随笔(8)-实验9(显示字符串)、实验10(子程序:除法溢出,数值到字符串的转换)和课程设计1
实验9 编程,在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串'welcome to masm!'. 80x25彩色字符模式下的显示缓冲区,每页可以显示25行,每行80个字符,其中每个字 ...
- 实验11 编写子程序
本章知识很琐碎,原则是用哪查哪,无需记忆. 设置标志寄存器的意义在于: (1)用来存储相关指令的某些执行结果: (2)用来为CPU执行相关指令提供行为依据: (3)用来控制CPU的相关工作方式. 好了 ...
- 《汇编语言》王爽(第四版) 第十章 实验10
文章目录 前言 一.子程序1 显示字符串 1.实验任务 2.分析 (1)如何在指定位置显示 (2)如何显示指定颜色 (3)保存子程序中用到的寄存器 3.代码 二.子程序2 解决除法溢出的问题 1.实验 ...
- (十六)《汇编语言(王爽)》 | 实验 10:编写子程序
文章目录 1. 预备知识 2. 实验任务 1:显示字符串 3. 实验任务 2:解决除法溢出的问题 4. 实验任务 3:数值显示 5. 总结 1. 预备知识 call 标号 将当前 IP 的内容入栈,并 ...
- 【汇编语言】by王爽 | 实验10:编写子程序
前言:本实验为王爽老师的<汇编语言>第三版中的实验10(p206) 实验环境:DOSBox 0.74-3 实验任务: 1.显示字符串 问题 显示字符串是现实工作中经常要用到 ...
- 汇编语言(第三版)王爽著(实验十)编写子程序
实验内容.程序清单及运行结果 显示字符串: 问题: 显示字符串是现实工作中经常要用到的功能,应该编写一个通用的子程序来实现这个功能.我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行.列).内 ...
- 实验二、80C51汇编语言编程实验:编写3字节二进制加法子程序,并用主程序调用不同的加数和被加数来检测该子程序的正确性。需考虑有进位和无进位情况。
实验二.80C51汇编语言编程实验:编写3字节二进制加法子程序,并用主程序调用不同的加数和被加数来检测该子程序的正确性.需考虑有进位和无进位情况. 报价 200 文章目录 实验二.80C51汇编语言编 ...
- 汇编语言(第三版)王爽著(实验十一)编写子程序
三.实验内容.程序清单及运行结果 1.编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母,描述如下. 名称:letterc 功能:将以0结尾的字符串中的小写字母转变成大写字母 ...
最新文章
- Python开发植物大战僵尸游戏(附github项目地址)
- 弹出模态窗口并传递数值
- 活动报名 | 第四范式AI与异构硬件优化最新成果分享
- printf 格式控制符的完整格式
- 【Python 标准库学习】系统相关的参数和函数库 — sys
- LeetCode 673. 最长递增子序列的个数(DP)
- Struts2学习笔记(十六) 文件上传(File Upload)
- alpine(Go环境)Docker基础镜像制作
- 实对称矩阵的特征值求法_“绝境之下”,如何求解矩阵的特征值?
- Filezilla server连接Ubuntu被服务器拒绝及中文乱码问题解决
- GeekTool使用备忘
- linux 查看日志以及查看
- 这样配置win10亲测不错
- root格式化linux,Linux-格式化与检验-mkfs
- 在linux上安装微信/QQ/TIM/迅雷等
- 常见排序算法及其对应的时间复杂度、空间复杂度
- Oracle使用纪要
- 揭秘英雄联盟的数据服务器
- 一个前端程序猿的Sublime Text3的自我修养
- streamlit快速部署-SCADA数据分析