汇编语言二进制左移Masm:键盘输入十进制数,屏幕显示十六进制数

王爽《汇编语言》实验10
1.显示字符串
子程序描述
名称:show_str
功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),
          (cl)=颜色,ds:si指向字符串的首地址
应用举例:在屏幕的8行3列,用绿色显示data段中的字符串。
(1)子程序的入口参数是屏幕上的行号和列号,注意在子程序内部要将它们转化为显存中的地址,首先在分析一下屏幕上的行列位置和显存地址的对应关系;(参见:王爽《汇编语言》实验9)
(2)注意保存子程序中用到的相关寄存器
(3)这个子程序的内部处理和显存的结构密切相关,但是向外提供了显存结构无关的接口。通过调用这个子程序,进行字符串的显示时可以不必了解显存的结构,为编程提供了方便。在实验中,注意体会这种设计思想。
参考代码:
; 在屏幕的8行3列,用绿绿显示data段中的字符串
assume cs:code
data segment
db 'Welcome to masm!',0
code segment
start: mov dh,8 行数
mov dl,3 列数
mov cl,2 绿色
mov ax,data
mov si,0 数据
call show_str
mov ax,4c00h
; 在指定的位置,用指定的颜色,显示一个用0结束的字符串
; 参数: (dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),
; (cl)=颜色,ds:si指向字符串的首地址
; 返回:无
show_str: mov ax,0B800H
mov di,0 显存0页的起始位置,0行,0列
mov al,0A0H
add di, 计算行的开始位置
add di, 计算列的开始位置
mov bl, 保留颜色值
s: mov cl,[si] 取得显示字符
mov es:[di], 将字符写入显存
mov es:[di+1],bl
在MS-DOS 7.10下运行结果:
2.解决除法溢出问题
子程序描述
名称:divdw
功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
参数:(ax)=dword型数据的低16位            (dx)=dword型数据的高16位
          (cx)=除数
返回:(dx)=结果的高16位,(ax)=结果的低16位            (cx)=余数
应用举例:计算(FA240H/0AH)
结出一个公式:
X: 被除数,范围:[0,FFFFFFFF]
N: 除数,范围:[0,FFFF]
H: X高16位,范围:[0,FFFF]
L: X低16位,范围:[0,FFFF]
int():描述性运算符,取商,比如:int(38/10)=3
rem():描述性运算符,取余数,比如:rem(38/10)=8
公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
这里的6H,也就是说,int(H/N)*10000H为高16位的商,而[rem(H/N)*65536+L]/N得到的是低16位的商和余数;
这个公式将可能产生溢出的除法运算:X/N,转变为多个不会产生溢出的除法运算公式中,等号右边的所有除法运算都可以用div指令来做,肯定不会导致溢出。
参考代码:
assume cs:code
code segment
start: mov ax,4240H
mov dx,000FH
mov cx,0AH
call divdw
mov ax,4c00h
; 功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
; 参数:(ax)=dword型数据的低16位
(dx)=dword型数据的高16位
; 返回:(dx)=结果的高16位,(ax)=结果的低16位
divdw: mov bx, 保存低位
mov dx,0H 进行H/N 的运算
因为除数为16位的,使用div,则设置的被除数为32位
用于保存int(H/N),因为rem(H/N)*65536就相当于高16位,dx了,故得到的余数在dx直接做高位
mov ax, [rem(H/N)*65536+L]
[rem(H/N)*65536+L]/N,结果是的ax保存为16位的低位
mov cx, 将余数写入cx
mov dx, 将高位写入dx
运行结果:
由AX和DX可知:这里得到的结果为186A0H=100000;余数CX为0,结果正确。
3.数值显示
子程序描述
名称:dtoc
功能:将word型数据转变为表示十进制数的字符串,字符串以10为结尾符。
参数:(ax)=word型数据,ds:si指向字符串首地址
应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。在显示时我们调用本次实验中的第一个子程序show_str.
0~9的ASCII码为30H~39H,则先由十六进制转化为十进制,再转ACSII码,转换示意图如下:
同时要注意,依次得到的是个位,十位,百位……万位这与我们习惯的从左到右的万位……个位顺序颠倒。
参考代码:
assume cs:code
data segment
db 10 dup (0)
用于存入转换为ASCII码的数据
code segment
start: mov ax,12666
mov bx,data
call show_str
mov ax,4c00h
; 功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符
; 参数: (ax)=word型数据,ds:si指向字符串首地址
; 返回: 无
dtoc: mov si,8 从存ASCII码数据段倒数第2个字节单元开始,相当于添加结尾符0
s0: mov cx,10
add dx,30H 余数+30H 得到ASCII码
mov [si],dl
判断商是否为0,如果为0则返回
注意在执行loop循环时,先执行的是CX=CX-1,然后判断CX是否为0
break: ret
show_str: mov ax,0B800H
mov al,0A0H
s: mov cl,[si]
mov es:[di],cl
mov es:[di+1],bl
MS-DOS 7.10下运行结果:
这里的子程序都只是以实现编程目地而编写的,不具有一定的通用性,因为在每一个子程序中都直接修改寄存器来做为临时变量,8086CPU中的寄存器是有限的,这样可以在使用ret指令退回到主程序时可以造成寄存器冲突,解决的办法是使用如下编程框架:
子程序开始:子程序中使用的寄存器入栈
子程序内容
子程序中使用的寄存器出栈
返回(ret,retf)
文章评论 以下网友留言只代表其个人观点,不代表本网站的观点和立场。你的位置:
&& 详细内容
《汇编语言》电子书[PDF]
本资料所属分类:
更新时间:日
如不能下载,请查看
电子书http://www.minxue.net:&汇编语言作者:& 冯康图书分类:&硬件资源格式:&PDF版本:&扫描版出版社:&冯康书号:&地区:& 大陆语言:& 简体中文简介:&
第1章 基础知识1.1 汇编语言程序设计中的进位记数制1.1.1 二进制数1.1.2 十六进制数1.1.3 十进制数1.1.4 数制间的转换1.1.5 二进制和十六进制的运算1.2 汇编语言程序设计中数据的表示1.2.1 整数数值数据的表示1.2.2 字符的编码1.3 机器语言、汇编语言、汇编编译器1.3.1 机器语言1.3.2 汇编语言1.3.3 汇编编译器1.3.4 汇编语言的特点及用途本章小结习题1第2章 Intel 80x86汇编语言编程结构2.1 Intel
CPU的汇编语言编程结构2.1.1
CPU结构概述2.1.2
CPU寄存器结构2.1.3
CPU内存组织2.1.4
CPU的I/O组织2.2 Intel的32位CPU汇编语言编程结构2.2.1 工作模式概述2.2.2 Intel 32位CPU的编程结构介绍本章小结习题2第3章 寻址方式3.1 Intel CPU的指令3.1.1 指令与指令系统3.1.2 指令的格式3.2 Intel
CPU的寻址方式3.2.1 立即寻址3.2.2 寄存器寻址3.2.3 直接寻址3.2.4 寄存器间接寻址3.2.5 寄存器相对寻址3.2.6 基址变址寻址3.2.7 相对基址变址寻址3.2.8 端口寻址方式3.3 实例解析本章小结习题3第4章 DEBUG调试4.1 DEBUG命令格式4.1.1 DEBUG调试程序的启动4.1.2 DEBUG命令的格式4.2 DEBUG命令4.2.1 显示内存单元内容命令D(DUMP)4.2.2 修改命令E(Enter)4.2.3 填充命令F(Fill)4.2.4 寄存器命令R(Register)4.2.5 汇编命令A(Assemble)4.2.6 反汇编命令U(Unassemble)4.2.7 运行命令G(Go)4.2.8 跟踪命令T(Trace)4.2.9 继续命令P(Proceed)4.2.10 退出命令Q(Quit)4.3 实例解析本章小结习题4第5章
CPU指令系统5.1 数据传送指令5.1.1 通用传送指令5.1.2 累加器专用传送指令5.1.3 地址传送指令5.1.4 标志位传送指令5.2 算术运算指令5.2.1 加法运算指令5.2.2 减法运算指令5.2.3 乘法运算指令5.2.4 除法运算指令5.2.5 十进制调整指令5.3 逻辑类指令5.3.1 逻辑运算指令5.3.2 移位指令5.4 串操作指令5.4.1 串操作指令概述5.4.2 5种串操作指令5.5 控制转移指令5.5.1 与目标指令地址有关的寻址方式5.5.2 JMP无条件转移指令5.5.3 条件转移指令5.5.4 循环指令5.5.5 子程序调用与返回指令5.6 处理器控制指令5.7 32位CPU扩展的指令5.7.1 Intel 32位CPU扩充的寻址方式5.7.2 80386增强和扩展指令5.7.3 80486新增指令5.7.4 Pentium新增指令5.8 实例解析本章小结习题5第6章 汇编语言程序格式和上机调试6.1 汇编语言源程序与汇编程序6.2 汇编语言语句种类及其格式6.2.1 指令语句6.2.2 伪指令语句6.2.3 标识符6.3 汇编语言中的运算符与表达式6.3.1 常量6.3.2 变量6.3.3 表达式和运算符6.4 伪指令6.4.1 变量定义伪指令6.4.2 符号定义伪指令6.4.3 段结构伪指令6.4.4 源程序开始和结束伪指令6.4.5 定位伪指令ORG与汇编地址计数器6.4.6 过程定义伪指令PROC和ENDP6.5 汇编语言源程序的结构6.6 汇编语言程序的上机过程6.7 实例解析本章小结习题6第7章 汇编语言基本结构与程序设计7.1 汇编语言程序设计的一般方法7.1.1 汇编语言程序设计的一般步骤7.1.2 结构化程序设计7.1.3 流程图画法7.2 顺序程序设计7.3 分支程序的设计7.3.1 两分支程序设计7.3.2 多分支程序设计7.4 循环程序设计7.4.1 单重循环程序设计7.4.2 多重循环程序设计7.5 实例解析本章小结习题7第8章 子程序及模块化程序设计8.1 子程序设计方法8.1.1 子程序定义8.1.2 子程序的调用与返回8.1.3 现场保护与恢复8.1.4 主程序与子程序的参数传递8.2 子程序设计举例8.3 子程序的嵌套与递归8.3.1 子程序的嵌套8.3.2 子程序的递归调用8.4 模块化程序设计8.4.1 基本思想和主要步骤8.4.2 模块间通信的基本方法8.4.3 子程序库建立和使用的方法8.4.4 汇编语言与高级语言的接口8.5 实例解析本章小结习题8第9章 系统中断调用和I/O程序设计9.1 中断概述9.2 BIOS中断调用9.2.1 BIOS中断调用方法9.2.2 常用BIOS中断9.3 DOS功能调用9.3.1 DOS中断调用方法9.3.2 常用 DOS中断9.4 I/O程序设计9.4.1 键盘输入中断9.4.2 键盘中断处理过程9.4.3 键盘输入举例9.4.4 屏幕中断功能9.4.5 屏幕输出的举例9.5 实例解析本章小结习题9第10章 高级汇编语言技术10.1 宏汇编10.1.1 宏定义10.1.2 宏调用和宏展开10.1.3 宏调用中的参数使用10.1.4 宏嵌套10.1.5 宏汇编中的伪指令10.1.6 宏在编程中的应用10.2 重复汇编10.2.1 使用REPT伪指令的重复汇编结构10.2.2 使用IRP伪指令的重复汇编结构10.2.3 使用IRPC伪指令的重复汇编结构10.3 条件汇编伪指令10.4 宏指令与子程序的区别10.5 实例解析本章小结习题10第11章 应用系统开发11.1 图形系统开发11.1.1 字符图形显示11.1.2 动画程序的演示11.2 声音系统开发11.2.1 音乐程序11.2.2 定时报警程序11.3 实例解析本章小结习题11第12章 实训实训1 随机数的生成实训2 电话号码查询实训3 学生成绩管理系统附录参考文献
本书旨在较全面地介绍汇编语言的基本功能、相关命令和汇编语言程序开发的基本方法。通过相关理论知识的学习和实践操作训练,使读者能够熟练掌握MASM的开发平台,正确地、合理地进行汇编语言程序的开发,全面提高读者的程序设计水平。
本书针对职业技术教育的特点,突出计算机科学与技术学科的特点,强调理论与实践相结合的教学方式,用示例讲解的方式,引导读者学习、掌握汇编语言程序设计技术。
本书适合作为高等专科学校、高等职业学校、成人高等学校以及高等院校主办的二级职业技术学院计算机及相关专业学生使用的教材。目的在于培养学生的实际动手的能力,使得学生更加适合用人单位的技能要求。内容截图
自带站内搜索End-->
相关学习资料4.8086汇编语言3_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
4.8086汇编语言3
上传于||文档简介
&&微​机​原​理
大小:261.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢

我要回帖

更多关于 汇编语言 键盘输入 的文章

 

随机推荐