实验十

编写3个子程序

1、显示字符串

功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串

参数:(dh)=行号、(dl)=列号、(cl)=颜色、ds:si指向字符串的首地址

行、列从0开始计数

如要求在屏幕的8行3列,用绿色显示data段中的字符串

assume cs:code
data segmentdb 'Welcome to masm!',0
data endscode segmentstart: mov dh,8mov dl,3mov cl,2mov ax,datamov ds,axmov si,0call show_strmov ax,4c00hint 21hshow_str:   mov ax,0B800H           ; 确定输入字符串的段地址mov es,axmov al,00A0H          ; 每行差00A0个字节,不能字母开头mul dh                    ; 计算出的"行偏移地址"存在ax中push ax                 ; 入栈,暂存mov al,2              ; 每一列占两个字节,第2个字节mul dl                   ; 计算出的"列偏移地址"存在ax中pop di                  ; 取出之前的"行偏移"add di,ax             ; "行偏移"+"列偏移"=总的偏移地址input:    push cx                 ; jczx要用到cx,会影响颜色的输入mov cx,[si]              ; 从data中取字符jcxz end_input           ; 若取到末尾,跳转mov es:[di],cx         inc si                  ; 指向下一个字符inc di                 pop cxmov es:[di],cl            ; 存入颜色信息inc dijmp short inputend_input: pop cx                  ; 在到了字符串末尾之后,; 之前的cx还在栈中,要出栈; 否则ret从栈中取出原来的IP值时会出错retcode ends
end start

2. 解决除法溢出问题

功能:进行不会产生溢出的除法运算,被除数为dword,除数为word,结果为dword

参数:(ax)=dword型数据的低16位

​ (dx)=dword型数据的高16位

​ (cx)=除数

返回:(dx)=结果的高16位

​ (ax)=结果的低16位

​ (cx)=余数

思路:对于32位的被除数,先高位的16位在前面补0组成一个32位数除以除数,得到的商便是最终结果的高16位,而得到的余数作为一个新的32位数的高16位,而被除数的低16位作为新32位数中的低16位,除以被除数,得到的余数就是最终的余数,而得到的商就是结果的低16位

assume cs:codecode segmentstart: mov ax,4240Hmov dx,000FHmov cx,0AHcall divdwmov ax,4c00hint 21hdivdw:   push ax         ; 先高位除以被除数,暂存axmov ax,dx     mov dx,0        ; 除数是16位,被除数应该为32位,高位存储在dx中div cxmov bx,ax        ; 用bx存储ax,即商pop ax           ; 弹出低位的值div cx          ; 此时,第一次除法运算得到的余数作为高16位的值; 存储在在dx中mov cx,dxmov dx,bxret
code ends
end start

3.数值显示

把数据如12666以十进制显示在屏幕上

思路:12666每次除以10取余,数字加30H就是对应的字符的ASCII码值(字符“0”~“9”对应的ASCII码是30H-39H),将数据转换为字符串,然后调用show_str显示在屏幕上

assume cs:codedata segmentdb 10 dup (0)
data endscode segmentstart: mov ax,12666mov bx,datamov ds,bxmov si,0call dtocmov dh,8mov dl,3mov cl,2call show_strmov ax,4c00hint 21hdtoc:  mov bx,10           ; 除数mov dx,0            ; dx为32位被除数的高16位div bxinc si                ; 记录数的长度mov cx,ax           ; 把商赋值给cx,用于jcxzpush dx              ; 判断前先把余数入栈jcxz okjmp short dtocok: mov cx,si           ; 数的长度就是循环的次数mov si,0           ; si为data段的偏移地址s:   pop bxadd bx,30H            ; 数字的大小+30H就是对应字符的; ASCII码mov [si],bl          ; 存储那些ASCII码只需一个字节inc siloop smov [si],cl           ; 由于show_str使用时; 默认字符串以0结尾,因此在最后补0mov si,0           ; 修改为0保证show_str的正确执行retshow_str:   mov ax,0B800H           ; 确定输入字符串的段地址mov es,axmov al,00A0H          ; 每行差00A0个字节,不能字母开头mul dh                    ; 计算出的"行偏移地址"存在ax中push ax                 ; 入栈,暂存mov al,2              ; 每一列占两个字节,第2个字节mul dl                   ; 计算出的"列偏移地址"存在ax中pop di                  ; 取出之前的"行偏移"add di,ax             ; "行偏移"+"列偏移"=总的偏移地址input:    push cx                 ; jczx要用到cx,会影响颜色的输入mov cx,[si]              ; 从data中取字符jcxz end_input           ; 若取到末尾,跳转mov es:[di],cx         inc si                  ; 指向下一个字符inc di                 pop cxmov es:[di],cl            ; 存入颜色信息inc dijmp short inputend_input: pop cx                  ; 在到了字符串末尾之后,; 之前的cx还在栈中,要出栈; 否则ret从栈中取出原来的IP值时会出错retcode ends
end start

汇编语言(王爽)实验十相关推荐

  1. 汇编语言王爽-实验9

    王爽汇编语言实验9 实验要求 参考资料 代码 assume cs:codedata segmentdb 'welcome to masm'db 02h, 24h, 71j data endscode ...

  2. 汇编语言---王爽 (实验 8)分析一个奇怪的程序

    简介 : 分析下面的程序 , 在运行前思考 , 这个程序可以正常返回吗 ? 运行后再思考 , 为什么是这种结果 ? 通过这个程序加深对相关内容的理解 assume cs:code code segme ...

  3. 汇编语言王爽 实验第四章

    实验一 :创建第一个源程序 在asm文件夹中创建一个名为t2的记事本 编写源文件,其次将其格式修改为asm文件 用masm t2;进行编译生成obj文件 然后用link t2;进行连接生成exe文件 ...

  4. 汇编语言王爽 实验12

    都在代码里面了 ​ assume cs:code,ds:data,ss:stackdata segmentdb 128 dup(0) ;一般把中断输出的字符 写道 0000:0200 -0000:03 ...

  5. 【汇编语言 王爽】实验14代码

    实验需求如下: 编程,以"年/月/日 时:分:秒"的格式显示时间 注意:CMOS RAM中储存着系统的配置信息,除了保存时间信息的单元外,不要向其他单元写入内容,否则将引起一些系统 ...

  6. 汇编语言 王爽 第四版 实验5

    汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 实验5 编写.调试具有多个段的程序 1 编译连接下面程序,用debug加载.跟踪,回答问题. assume cs:code,ds:data, ...

  7. 汇编语言 王爽 第四版 实验1

    汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 文章目录 实验1 查看CPU和内存,用机器指令和汇编指令编程 1 开始执行命令: 2 指令 过程 3 4 实验1 查看CPU和内存,用机器指 ...

  8. 汇编语言——王爽版 总结

    汇编语言-王爽summary<考试复习版> 摆烂一学期,期末抱佛脚 只针对必要内容总结,并非按目录总结 文章目录 汇编语言-王爽summary<考试复习版> `只针对必要内容总 ...

  9. 汇编语言 王爽 第四版 第二章 检测点2.2

    汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 检测点2.2 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为 0010H 到 1000FH . 最小肯定是偏移地址为0, ...

  10. 汇编语言 王爽 第四版 第三章 检测点3.2

    汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 检测点3.2 1 补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中. mov ax,1 ...

最新文章

  1. android studio 顶部导航栏_Android10 手势导航开发与处理:边到边(I)
  2. MATLAB编写ode文件,MATLABODE45问题M文件为br/functiondq 爱问知识人
  3. 实验三 密码破解技术
  4. 获取所有栈的信息,只有最上面的和最下面的,但是不能获取栈中间的activity信息...
  5. 操作系统(十六)调度算法(一)
  6. yara 模式匹配 android,YARA——恶意软件模式匹配利器
  7. 块级元素(HTML、CSS)
  8. 容器技术Docker K8s 4 容器编排技术基础-Kubernetes
  9. PDF粘贴到word的英文字母的间距很宽,很奇怪
  10. Java数据结构与算法4-树学习笔记
  11. 2021年杭州行政区划调整方案与远景轨道线网概念图
  12. oracle 取农历函数,完善SQL农历转换函数
  13. Day1 python基础
  14. 鼎铛有耳 智能硬件供应链新一代“网红”诞生 ——第三届HCFT智能硬件供应链大会品牌盛会颁奖典礼在深成功举办...
  15. 学得到专栏作者如何回答问题:万维钢(1)
  16. 在oracle 中编写一个程序,用VC 开 发 基 于ORACLE 数 据 库 应 用 程 序 的 两 种 方 法...
  17. matlab 车身阻尼比曲线,汽车阻尼比及振动响应的分析
  18. 添加系统调用的方法,2.6.35(没有测试)
  19. 高斯消元法的算法介绍
  20. 玩南红的男人具备这几点,一般都不会太差

热门文章

  1. 数据库连接池及C3P0数据库连接池技术
  2. 微信小程序:音乐播放器带进度条
  3. [论文素材]Previous Work----自动仇恨言论检测和冒犯性语言问题
  4. 虚函数和纯虚函数及虚函数表
  5. 什么是VGA、QVGA、CIF、QCIF。。。?
  6. matlab: strcat用法
  7. [交易策略]MACD金叉买死叉卖模型回测
  8. UserAgent和获取手机内安装的所有app列表
  9. Eclipse开发EJB3
  10. Html Table 样式