课程设计一

思路
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           

汇编语言(王爽) 课程设计一相关推荐

  1. 汇编语言王爽课程设计二

    前言:本文涉及两种代码,未安装虚拟机的参照第一种代码实现三四功能即可, 阅读下面的材料 开机后,CPU自动进入到FFFF:0单元处执行,此处有一条跳转指令.CPU执行该指令后,转去执行BIOS中的硬件 ...

  2. 汇编语言-第三版-王爽-课程设计1

    课程设计1(p211). * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ...

  3. 汇编语言 王爽第二版 总结

    汇编语言 王爽第二版 总结,所以内容都是8086的 summary asssembly ,汇编总结 why: 最初始的编程语言就是使用打孔机,打出来的0 1 代码,然后把卡片插入到电脑中运行然后 看输 ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. java连接Excel数据库读取,写入,操纵Excel表格
  2. Vue route部分简单高级用法
  3. java队列怎么实现线程_Java中利用线程和队列实现入库操作
  4. mpls ***简介
  5. 内容提供器(Content-Provider)完整使用指南
  6. 在Android Studio环境下使用ESPRESSO 测试框架进行UI测试
  7. iScreenLocker 3.1.8 安卓锁屏通知--苹果一样的体验
  8. 安卓手机绘制uml图_Android Studio中绘制simpleUML类图详细说明及使用
  9. 网站链接自动化测试原理及工具介绍
  10. 使用Python编写一个聪明的尼姆游戏
  11. Activity中finish()和onDestroy()的区别
  12. mysql表损坏及修复
  13. Java打包后运行找不到资源文件问题
  14. 渗透测试工程师面试题大全(一)
  15. 电脑主板线路连接图解_机箱线怎么接主板 DIY电脑机箱跳线与主板连接图解(2)...
  16. 《学习 Go 语言》学习心得
  17. 戴尔电脑能升级鸿蒙系统嘛,戴尔台式机预装win10家庭版升级win10专业版方法教程...
  18. URAL - 1741 - Communication Fiend(dp)
  19. 关于华为设备远程登录telnet和ssh的配置
  20. 《Python编程:从入门到实践》基础知识部分笔记和作业

热门文章

  1. 第十一章 Linux账户管理与ACL权限设置(下)
  2. 容器限速和流量采集03-golang实现
  3. (JavaScript学习记录):数组
  4. 今日油价 麦谈帮API数据接口
  5. Python 五点搞定作用域
  6. python调整视频播放速度
  7. phpcms v9模板制作教程(一)
  8. 基于stm32f407下的W5500网卡驱动(上)
  9. ardupilot BMI088加速度陀螺仪学习
  10. 产品经理基本功——表单设计