鱼C论坛

 找回密码
 立即注册
查看: 3507|回复: 0

[汇编作业] 课程设计1

[复制链接]
发表于 2016-11-6 16:13:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 bin2yx 于 2016-11-18 22:47 编辑
  1. assume cs:code
  2. data segment
  3.   db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995';以上是表示21年的21个字符串,84字节
  4.   dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;以上是表示21年公司总收入的21个dword型数据,84字节
  5.   dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226,11542,14430,15257,17800;以上是表示21年公司雇员人数的21个word型数据,42字节
  6.   dw 23 dup (0);拟存入人均收入,多开4个地址备用,地址为252,253,254,255
  7. data ends
  8. stack segment
  9.   db 64 dup (0); 刚开始只设了32个位,后来出现溢出错误,加大到64
  10. stack ends

  11. code segment
  12. start:mov ax,data
  13.       mov ds,ax
  14.           mov ax,stack
  15.           mov ss,ax
  16.           mov sp,64
  17.           
  18.       call s
  19.           call c
  20.           call e

  21.           mov ax,4c00h
  22.       int 21h       
  23.           
  24. s:    mov bx,84; 公司总收入起始地址    计算人均收入,存入指定内存………………………………………………………………主程序1
  25.           mov si,168; 公司雇员起始地址
  26.           mov di,210; 人均收入起始地址
  27.           mov cx,21
  28. s1:   mov ax,[bx]  ; 这里曾经出现的一个错误,内存中的数据,AX中放不下,应该将高位放在DX中
  29.       mov dx,[bx+2]
  30.           div word ptr [si]
  31.           mov [di],ax
  32.           add bx,4
  33.           add si,2
  34.           add di,2
  35.           loop s1
  36.           
  37.       mov si,0; 设置原始数据首地址,将ASCII码的数据段,存入指定显存………………………………………………………………主程序2
  38.       mov cx,21
  39.           mov byte ptr ds:[252],1
  40.           mov byte ptr ds:[253],8
  41.           mov byte ptr ds:[254],7
  42.           mov dh,ds:[252]
  43.           mov dl,ds:[253]
  44.           mov bl,ds:[254]
  45. s2:          push cx
  46.           mov cx,4
  47.           mov ax,0
  48. s3:          mov al,[si]
  49.           call show_str
  50.           inc si
  51.           inc dl
  52.           loop s3
  53.           pop cx
  54.           inc dh
  55.           mov ds:[252],dh
  56.           mov dl,ds:[253]
  57.           loop s2
  58.           ret
  59.        
  60.           
  61. c:      ;将dd数据段,转换成ASCII码,存入指定显存        ………………………………………………………………主程序3
  62.         mov si,84
  63.         mov cx,21               
  64.         mov byte ptr ds:[252],1
  65.         mov byte ptr ds:[253],27
  66.         mov byte ptr ds:[254],7
  67.         mov word ptr ds:[255],10
  68. c1:        mov ax,[si];ax=16
  69.         mov dx,[si+2];dx=0
  70.         call cc
  71.         add si,4
  72.         mov al,ds:[252]; 读取并改变显存的行设置,以进行再循环
  73.         inc al
  74.         mov ds:[252],al       
  75.         loop c1       
  76.     ret
  77.        
  78. e:    ;将dw数据段,转换成ASCII码,存入指定显存        ………………………………………………………………主程序4,这里设置首地址,循环次数,显存地址、性质、除数
  79.     mov si,168
  80.         mov cx,21
  81.         mov byte ptr ds:[252],1
  82.         mov byte ptr ds:[253],47
  83.         mov byte ptr ds:[254],7
  84.         mov word ptr ds:[255],10
  85.         call e1
  86.         mov si,210
  87.         mov cx,21
  88.         mov byte ptr ds:[252],1
  89.         mov byte ptr ds:[253],67
  90.         mov byte ptr ds:[254],7
  91.         mov word ptr ds:[255],10
  92.     call e1
  93.         ret
  94.        

  95. show_str: push dx;本子程序将ax的数值存放到指定显存,dh=指定行,dl=指定列,bl=指定的显示属性,这里没有push完,调用的话要根据需要添加push
  96.                   push ax
  97.                   mov ax,0b800h
  98.                   mov es,ax
  99.                   mov ax,160
  100.                   mul dh      ;计算所在行的首地址,乘积保存在ax中
  101.                   add dl,dl    ;dl为显示所在的列
  102.                   sub dl,2
  103.           mov dh,0                  
  104.                   add ax,dx    ;计算出准确目的地的地址,保存在ax中
  105.                   mov bp,ax    ;地址赋值给BX
  106.                   pop ax
  107.                   mov es:[bp],al
  108.                   mov es:[bp+1],bl
  109.                   pop dx
  110.           ret

  111. divdw:push ax; 子程序,进行32位除16位的除法,并杜绝溢出,dx高位,ax低位,di为除数,cx放结果的余数,dx放高位商,ax放低位商,这里没有push完,调用的话要根据需要添加push
  112.           mov ax,dx
  113.           mov dx,0
  114.           div di
  115.           mov si,ax  ;高位除得的商
  116.           pop ax
  117.           div di
  118.           mov cx,dx  ;余数放cx
  119.           mov dx,si         ; 高位除得的商放dx,低位商在ax
  120.           ret
  121.                   
  122. cc: push ax; 子程序,目的是将dd数据和dw数据以10进制显示到频幕,应先设置好原始数据首地址si、需要存放到显存的位置、属性(详见C段)、以及10这个被除数的内存地址
  123.     push bx
  124.         push cx
  125.         push di
  126.         push si
  127.         mov di,ds:[255]
  128.         mov bx,0;  bx很关键,这个是用来记录压入栈的次数的,是用来设置CX的关键!!!!!
  129. c2:        call divdw  ;
  130.     add cx,30h  ; axdx=商  cx=余数+30H
  131.     push cx
  132.         inc bx    ; 这里用来记录压入栈的次数
  133.         mov cx,ax ;假如商(ax)为零,就跳转,不为零继续除
  134.         jcxz c3
  135.         jmp short c2
  136. c3: mov cx,dx
  137.         jcxz c4
  138.         jmp short c2
  139. c4:        ;这里很关键,跳至这里表示所有数据转换完毕,并已压入栈,接下来就是一个一个将他们放入显存
  140.     mov cx,bx
  141.     mov dh,ds:[252] ;dx改成了设置好的行列数
  142.     mov dl,ds:[253]
  143.         mov bl,ds:[254] ;bx改成颜色属性
  144. c5:        pop ax; 显示的设置开始,将第一个数据放入ax待用,因为数据都与余数,肯定只存放在AL
  145.         call show_str
  146.         inc dl
  147.         loop c5
  148.         pop si
  149.         pop di
  150.         pop cx
  151.         pop bx
  152.         pop ax
  153.         ret           
  154.        
  155. e1:        mov ax,[si]; 子程序,没啥大用
  156.         mov dx,0
  157.         call cc
  158.         add si,2
  159.         mov al,ds:[252]; 读取并改变显存的行设置,以进行再循环
  160.         inc al
  161.         mov ds:[252],al       
  162.         loop e1
  163.         ret
  164.        
  165. code ends
  166. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-7 02:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表