汇编语言(王爽) 课程设计一
课程设计一
思路
1 (子程序一) 首先调整要显示的区域的背景色
2 (子程序二) 将年份按照指定格式显示再屏幕上(这个子程序比较简单)
3 (子程序三) 将总收入dd(double word)和员工总数dw(define word)转化位字符串 并存入指定的代码段
每个字符串以数值0结尾,注意不是带引号的0 及’0’
以0为结尾来判断一个字符串是否结束 来决定是否需要换行
同时需要记录转化后所有的字符的总个数
4 (子程序四) 将指定段内的字符串按指定格式显示再屏幕
5 (子程序五) 计算每年员工平局收入
不足之处
1 开辟的三个数据段newdata1 newdata2 newdata3 大小是自己随意设定的值 浪费了很多空间
(MD 烧脑两周,总算搞完了,开始新的征程了 第十一章 走起…)
assume cs:codesg
data segmentdb '1975','1976','1977','1978','1979','1980','1981','1982','1983' ;注意这些数据在内存中就已经是二进制的数据了db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995'dd 16,22,382,1356,2390,8000,16000,24486,50065,97497,140417,197514 ;注意这些数据在内存中就还是二进制的数值 需要转化为字符串 dd double word 占4个字节dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 ;注意这些数据在内存中就还是二进制的数值 需要转化为字符串dw 11542,14430,15257,17800
data ends
newdata1 segmentdb 4000 dup ('0') ;总收入字符数据域
newdata1 ends
newdata2 segmentdb 4000 dup ('0') ;员工总数字符域
newdata2 ends
newdata3 segmentdb 4000 dup ('0') ;员工总数字符域
newdata3 ends
codesg segment
start: ;整体思路为1 移动字符串同时转化为要显示的字符串 2 指定格式展示mov ax,datamov ds,axcall makeblack ;将显示区域置为黑色背景call showyear ;将年份按指定格式显示 call movsumnandne ;将总收入转化dd类型数据为字符并存入newdata段 这里是每转化一个就显示一个 如果连续存放到newdata段 无法判断字符的结束call movdiv ;计算每年的平均值 并转化为字符串从到指定的newdata段mov ax,4c00hint 21h;-------------------------movdiv start-------------------------------------------
;功能 计算每年的员工平均收入 并将平均收入转化为字符串存到newdata3段 同时将newdata3段数据按指定格式显示到屏幕
movdiv:push cxpush bxpush axpush dxpush es ;tdoc_dd会用到新的栈push dspush dimov bx,datamov ds,bxmov bx,newdata3 ;将转换的字符串存到newdata3段 newdata3-096cmov es,bx ;es:[0]要存放的转化后字符串地址mov cx,21 ;21年的总收入 循环21次mov bx,0 ;ds:[84]指向数据的第二部分 总收入mov si,0 ;使用si来 记录当前newdata1段的存放的数的起始地址,不能每次都从起始地址为0的地方存放 会覆盖原来数据mov di,0 ;除数的索引
s9: mov ax,ds:[bx+84] ;ax存低16位mov dx,ds:[bx+84+2] ;dx存高16位 注意这里是+2 因为dd占4个字节call divav ;调用子程序 计算平局值call tdoc_dd ;将dd类型的平均收入转化为字符串 并存放到newdata段 参数 1、ax第16为 2、dx高16位 3、si newdata段的存放位置标 4、 di data段取数的位置 5、bx 将转化的字符串存放到新的数据段add bx,4 ;一次循环占4个字节add di,2loop s9mov di,74 ;屏幕显示的起始地址call showdoc ;注意si已经指向到了 newdata1段的末尾 无需再减2操作 将newdata1段转化的dd字符串 按指定的格式显示到屏幕pop dipop dspop espop dxpop axpop bxpop cxret
;-------------------------movdiv end------------------------------------------------- ;-------------------------divav start-------------------------------------------------
divav: ;计算平均值 不能除法溢出 结果高16位放到dx中 低16位放到ax中;push ax ;ax和dx的值需要作为tdoc_dd子程序的参数传入 所以不能还原位原来的值;push dxpush bxpush cxpush di push ds push ax push dxmov dx,0pop ax ;将dx值赋值给ax同时将dx置为0 防止除法溢出div word ptr ds:[di+168] ;ax存商 dx存放余数mov bx,ax ;暂存第一次的商 第一次的商就是最终结果的高十六位pop ax div word ptr ds:[di+168] ;这时dx中存放了第一的余数最为第二次除法的高十六位 ax存商 dx存放余数mov dx,bx ;第一的结果存入到dx中 最终结果 dx存放高16为 ax存放低16为pop dspop dipop cxpop bx;pop dx;pop axret
;-------------------------divav end------------------------------------------------- ;-------------------------movsumnandne start-------------------------------------------
;功能 将总收入及员工总数转化为字符串存到newdata1和newdata2段 同时按指定格式显示到屏幕
movsumnandne:push cxpush bxpush axpush dxpush es ;tdoc_dd会用到新的栈push dspush dimov bx,datamov ds,bxmov bx,newdata1 ;将转换的字符串存到newdata1段 newdata1-0778mov es,bx ;es:[0]要存放的转化后字符串地址mov cx,21 ;21年的总收入 循环21次mov bx,84 ;ds:[84]指向数据的第二部分 总收入mov si,0 ;使用si来 记录当前newdata1段的存放的数的起始地址,不能每次都从起始地址为0的地方存放 会覆盖原来数据
s4: mov ax,ds:[bx] ;ax存低16位mov dx,ds:[bx+2] ;dx存高16位 注意这里是+2 因为dd占4个字节call tdoc_dd ;调用子程序 将dd转化为字符串 并存放到newdata段 参数 1、ax第16为 2、dx高16位 3、si newdata段的存放位置标 4、 di data段取数的位置 5、bx 将转化的字符串存放到新的数据段add bx,4 ;一次循环占4个字节loop s4mov di,24 ;屏幕显示的起始地址call showdoc ;注意si已经指向到了 newdata1段的末尾 无需再减2操作 将newdata1段转化的dd字符串 按指定的格式显示到屏幕mov bx,newdata2 ;将转换的字符串存到newdata2段 newdata2-0872mov es,bxmov cx,21 ;21年的员工总数 循环21次mov bx,168 ;ds:[168]指向数据的第三部分 员工总数mov si,0 ;使用si来 记录当前newdata2段的存放的数的起始地址,不能每次都从起始地址为0的地方存放 会覆盖原来数据
s5: mov ax,ds:[bx] ;ax存低16位mov dx,0 ;dx存高16位 注意这里是+2 因为dw占4个字节call tdoc_dd ;调用子程序 将dd转化为字符串 并存放到newdata段add bx,2 ;一次循环占2个字节loop s5mov di,50 ;屏幕显示的起始地址call showdoc ;注意si已经指向到了 newdata2段的末尾 无需再减2操作 将newdata2段转化的dd字符串 按指定的格式显示到屏幕pop dipop dspop espop dxpop axpop bxpop cxret ;子程序总收入显示完成
;-------------------------movsumnandne start------------------------------------------- ;-------------------------tdoc_dd start-------------------------------------------
;参数 1、ax低16为 2、dx高16位 3、si es:[si] newdata段的存放位置标 4、 di data段取数的位置 5、es将转化的字符串存放到新的数据段
;返回值 si要作为返回值使用 不能存放到栈中 因为再newdata1和newdata2段 时连续存放数据的
tdoc_dd: ;将ax和dx中数据 用取10的余数的方法转化位字符,注意除法的溢出问题push cxpush bxpush dxpush axpush di ;存放之要循环的总收入 员工总数 的位置 子程序中用来统计字符串的长度 push es ;es:[si] 用来指向存放 newdata1 newdata2段数据mov di,0
s6: push ax push dxpop ax ;dx中值放到ax中,做第一次的除法mov dx,0 ;高16未置0防止除法溢出mov cx,10div cx ;dx存余数,ax存商mov bx,ax ;第一次的结果也就是商的高16位暂时保存到bx中pop ax ;从栈中去除低16位div cx ;dx存余数,ax存商mov cx,dx ;保存余数mov dx,bx ;将第一的结果从bx中去除放到dx中add cx,30h ;将余数转位数字,规律加30Hpush cx ;字符倒叙存放,出栈时正好正序为数字,注意这里实际上只有cl中有值 ch中值位0mov cx,ax ;判断商是否为0inc di ;长度统计jcxz ok1 ;商为0时跳出循环 而不是余数为0,结束子程序 jmp short s6 ;正好dx存高16位,ax存低16位 形成一个循环 ok1: mov cx,di ;将得到的字符串正序存放,以0结尾 注意这里是以0结尾 不是'0' di字符串的长度
s7: pop es:[si] ;字符串正序存放到newdata段add si,2 ;一次占两个字节 这里的si需要覆盖主程序的si 因为下次再执行子程序时 newdata段的数据是连续存放的loop s7mov word ptr es:[si],0 ;在newdata段的末尾加上0 表示结束 注意这里不是'0'add si,2 ;必须要加2操作 让si指向末尾 且取数操作时 不需要减2来判断长度 本身就已经时 总长度了 需要加2防止 下一次存放时覆盖了末尾的0pop espop dipop axpop dx ;这里的出栈会和字符串数据有冲突,不能直接结束子方法pop bxpop cxret ;子程序tdoc_dd结束 总收入显示完成
;-------------------------tdoc_dd end---------------------------------------------- ;-------------------------showdoc start-------------------------------------------
;功能 显示newdata段的数据到屏幕上
showdoc: ;需要两个判断 判断是否换行 判断是否到达末尾push es ;es:[0] 指向newdata1 或 newdata2的起始地址push dspush bxpush di ;di 屏幕显示的起始地址push si ;si这时指向newdata段的末尾,程序结束时必须要还原si 这个很重要push cxpush axmov ax,di ;将屏幕显示的起始地址放到ax中 换行的时候需要重置di起始值push si ;用来判断是否到达newdata段的末尾mov bx,0b800hmov ds,bxmov bx,0 ;行数mov cx,si ;cx先存newdata段字符串的总长度mov si,0 ;newdata段的起始地址
s8: pop cx ;这里取得值时刚才push si的值 优先判断是否到达newdata段的末尾,在判断是否需要换行 如果先判断换行 最后一次取数会越界jcxz ok3 ;如果到达了newdata存放字符串数据末端 结束字符串,如果没有 取出当前位置的字符push cxmov cx,es:[si] ;取出一个字符,注意换行操作过程中di的值不能动jcxz ok4 ;判断是否需要换行,到达一个字符串的结尾 需要取下一个字符串mov byte ptr ds:[bx+di],cl ;指定区域显示字符mov byte ptr ds:[bx+di+1],00001011b ;设置字体颜色为绿色高亮add di,2 ;di的数值需要每次加2add si,2pop cx sub cx,2 ;已经取出一个数了 需要减少2个字节push cxjmp short s8
ok4: add bx,160mov di,ax ;换行需要重置di为起始地址 注意不是以0起始的add si,2pop cx sub cx,2 ;换行表示一个字符串结束 newdata的指向也许要改变push cxjmp short s8ok3: pop axpop cxpop sipop dipop bxpop dspop esret ;子程序showsumn结束
;-------------------------showdoc end-------------------------------------------;-------------------------showyear start-------------------------------------------
showyear:push axpush sipush bxpush espush cxmov si,0mov cx,21mov ax,0b800hmov es,axmov bx,0mov ax,datamov ds,axs3: mov al,[si] ;取除第一个字mov byte ptr es:[bx],al mov byte ptr es:[bx+1],00001011b ;设置字体颜色为绿色高亮 mov al,[si+1] ;取除第二个字mov byte ptr es:[bx+2],al ;取除第二个字 mov byte ptr es:[bx+3],00001011bmov al,[si+2] mov byte ptr es:[bx+4],al ;取除第三个字mov byte ptr es:[bx+5],00001011b mov al,[si+3] mov byte ptr es:[bx+6],al ;取除第四个字mov byte ptr es:[bx+7],00001011badd si,4add bx,160 ;第二行的起始地址160 每行80个字 160个字节loop s3pop cxpop espop bxpop sipop axret ;子程序showyear结束 年份显示完成
;-------------------------makeblack end------------------------------------------- ;-------------------------makeblack start-------------------------------------------
makeblack: ;背景色黑白相间push cxpush sipush axpush dspush bxmov ax,0b800hmov ds,axmov cx,10 ;外层循环 循环10次 置为黑白相间mov bx,0
s1: push cx ;放入栈中暂存这个数据mov cx,80 ;25*160 共4000个字节mov si,0s2: mov byte ptr [bx+si],20h ;字符设置为空格mov byte ptr [bx+si+1],0000000b ;背景色设置为黑色mov byte ptr [bx+si+160],20h ;字符设置为空格mov byte ptr [bx+si+161],0000000b ;背景色设置为白色 01110000badd si,2loop s2add bx,320pop cxloop s1pop bxpop dspop axpop sipop cxret ;子程序makeblack 背景色显示调整完毕
;-------------------------makeblack end-------------------------------------------
codesg ends
end start
汇编语言(王爽) 课程设计一相关推荐
- 汇编语言王爽课程设计二
前言:本文涉及两种代码,未安装虚拟机的参照第一种代码实现三四功能即可, 阅读下面的材料 开机后,CPU自动进入到FFFF:0单元处执行,此处有一条跳转指令.CPU执行该指令后,转去执行BIOS中的硬件 ...
- 汇编语言-第三版-王爽-课程设计1
课程设计1(p211). * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ...
- 汇编语言 王爽第二版 总结
汇编语言 王爽第二版 总结,所以内容都是8086的 summary asssembly ,汇编总结 why: 最初始的编程语言就是使用打孔机,打出来的0 1 代码,然后把卡片插入到电脑中运行然后 看输 ...
- 汇编语言——王爽版 总结
汇编语言-王爽summary<考试复习版> 摆烂一学期,期末抱佛脚 只针对必要内容总结,并非按目录总结 文章目录 汇编语言-王爽summary<考试复习版> `只针对必要内容总 ...
- 【汇编语言 王爽】实验14代码
实验需求如下: 编程,以"年/月/日 时:分:秒"的格式显示时间 注意:CMOS RAM中储存着系统的配置信息,除了保存时间信息的单元外,不要向其他单元写入内容,否则将引起一些系统 ...
- 汇编语言 王爽 第四版 第二章 检测点2.2
汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 检测点2.2 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为 0010H 到 1000FH . 最小肯定是偏移地址为0, ...
- 汇编语言 王爽 第四版 实验5
汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 实验5 编写.调试具有多个段的程序 1 编译连接下面程序,用debug加载.跟踪,回答问题. assume cs:code,ds:data, ...
- 汇编语言 王爽 第四版 实验1
汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 文章目录 实验1 查看CPU和内存,用机器指令和汇编指令编程 1 开始执行命令: 2 指令 过程 3 4 实验1 查看CPU和内存,用机器指 ...
- 汇编语言 王爽 第四版 第三章 检测点3.2
汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 检测点3.2 1 补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中. mov ax,1 ...
最新文章
- java连接Excel数据库读取,写入,操纵Excel表格
- Vue route部分简单高级用法
- java队列怎么实现线程_Java中利用线程和队列实现入库操作
- mpls ***简介
- 内容提供器(Content-Provider)完整使用指南
- 在Android Studio环境下使用ESPRESSO 测试框架进行UI测试
- iScreenLocker 3.1.8 安卓锁屏通知--苹果一样的体验
- 安卓手机绘制uml图_Android Studio中绘制simpleUML类图详细说明及使用
- 网站链接自动化测试原理及工具介绍
- 使用Python编写一个聪明的尼姆游戏
- Activity中finish()和onDestroy()的区别
- mysql表损坏及修复
- Java打包后运行找不到资源文件问题
- 渗透测试工程师面试题大全(一)
- 电脑主板线路连接图解_机箱线怎么接主板 DIY电脑机箱跳线与主板连接图解(2)...
- 《学习 Go 语言》学习心得
- 戴尔电脑能升级鸿蒙系统嘛,戴尔台式机预装win10家庭版升级win10专业版方法教程...
- URAL - 1741 - Communication Fiend(dp)
- 关于华为设备远程登录telnet和ssh的配置
- 《Python编程:从入门到实践》基础知识部分笔记和作业