| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
 本帖最后由 leader4 于 2018-5-24 17:32 编辑  
 
课程设计1我终于做出来了,用了快一个星期了。。。总算是弄出了完全自主知识产权的代码。。 
 
主要难点有两处: 
1、对于子程序与参数分离的理解程度。 
由于一开始没有弄明白这点,导致我的全部代码都是重新写的。。。之前练习用的子程序代码根本不可用。 
其实真正写这个代码大概用了三天。。剩下四天其实都是在做前几个练习。。 
2、程序整体思路。 
其实如果把这个想明白了,其他就很好做了。 
我一开始想的是:读取一个数据,转化为字符,在显示。然后循环完成。 
但这样我写了很长时间,发现寄存器各种冲突,根本写不出来。。。 
然后我换了一个思路,先把所有数据处理好,写入table段,然后在一起显示。 
这一下就顺风顺水了。这之后,用了两个下午就写出来了。 
其实第二个下午主要是找bug。。。 
由于之前没有在每个子程序之前保存寄存器,结果还是有冲突的。。debug一步一步找出来才发现是寄存器的问题。。。。 
之后就是显存写入有调试了一会儿,总算正常输出了! 
 
插曲:当第一次写完程序编译运行没有得到想要的结果时,真是内心毫无波澜  为什么一点也不感到意外呢~ 
 
补充:想用offset定位数据起始位置,结果google发现,数据标号居然不用冒号。。。 
 
下面是代码,分享给初学者参考下。虽然参考价值可能不大。。:(注:我在mac上用的是dosbox,所以显存起始地址有些问题。。) 
- ;===========================================================================
 
  
- ;课程设计1
 
  
- ;将实验7中的power idea公司的数据按照格式在屏幕上显示.
 
  
- ;===========================================================================
 
  
- assume cs:codesg,ds:data,ss:stack,es:table
 
  
- data segment
 
 -         year         db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
 
 -                          db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
 
 -                          db '1993','1994','1995'
 
 -         money         dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
 
 -                          dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
 
 -         people         dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
 
 -                          dw 11542,14430,15257,17800
 
 -         average  dw 21 dup (0)
 
 -         ;数据标号不用双引号。
 
 - data ends
 
  
 
- table segment
 
 -         db 21 dup (' year    s       n      ?      ',0)
 
 -                        ; 1       9       17     24       算上0,共32个字符
 
 - table ends
 
  
- stack segment
 
 -         db 16 dup (0)
 
 - stack ends
 
  
 
- codesg segment
 
 - start:
 
 - ;年份入table段
 
 -         mov ax,data
 
 -         mov ds,ax
 
 -         mov ax,offset year
 
 -         mov si,ax        ;data段首地址ds:si
 
  
-         mov ax,table
 
 -         mov es,ax
 
 -         mov di,1        ;table段首地址es:di
 
  
-         mov cx,21
 
 -         year_table:
 
 -                 push cx
 
 -                 mov cx,2
 
 -                 mov bx,0
 
  
-                 year_table0:
 
 -                         mov ax,[si+bx]
 
 -                         mov es:[di+bx],ax
 
 -                         add bx,2
 
 -                         loop year_table0
 
  
-                 add si,4
 
 -                 add di,32
 
 -                 pop cx
 
 -                 loop year_table
 
 - ;--------------------------------
 
 - ;收入入table
 
 -         mov ax,data
 
 -         mov ds,ax
 
 -         mov si,offset money
 
  
-         mov ax,table
 
 -         mov es,ax
 
 -         mov di,9
 
  
-         mov cx,21
 
 -         money_table:
 
 -                 mov bx,0
 
 -                 push cx
 
 -                 mov ax,[si]
 
 -                 mov dx,[si+2]                ;显式给出参数
 
 -                 call dtoc
 
 -                 add si,4
 
 -                 add di,32
 
 -                 pop cx
 
 -                 loop money_table
 
  
- ;人数入table
 
 -         mov ax,data
 
 -         mov ds,ax
 
 -         mov si,offset people
 
  
-         mov ax,table
 
 -         mov es,ax
 
 -         mov di,17
 
  
-         mov cx,21
 
 -         people_table:
 
 -                 mov bx,0
 
 -                 push cx
 
 -                 mov ax,[si]
 
 -                 mov dx,0      ;显式给出参数
 
 -                 call dtoc
 
 -                 add si,2
 
 -                 add di,32
 
 -                 pop cx
 
 -                 loop people_table
 
  
- ;平均数入table
 
 -         mov ax,data
 
 -         mov ds,ax
 
 -         mov si,offset money
 
 -         mov di,offset people
 
  
-         mov cx,21
 
 -         s:
 
 -                 mov ax,[si]
 
 -                 mov dx,[si+2]
 
 -                 div word ptr [di]
 
 -                 push ax
 
 -                 add si,4
 
 -                 add di,2
 
 -                 loop s
 
  
-         mov si,offset average
 
 -         add si,40
 
 -         mov cx,21
 
 -         s1:
 
 -                 pop ax
 
 -                 mov [si],ax
 
 -                 sub si,2
 
 -                 loop s1
 
 - ;平均入table
 
 -         mov si,offset average
 
  
-         mov ax,table
 
 -         mov es,ax
 
 -         mov di,24
 
  
-         mov cx,21
 
 -         average_table:
 
 -                 mov bx,0
 
 -                 push cx
 
 -                 mov ax,[si]
 
 -                 mov dx,0       ;显式给出参数
 
 -                 call dtoc
 
 -                 add si,2
 
 -                 add di,32
 
 -                 pop cx
 
 -                 loop average_table
 
 - ;------------------------------
 
 - ;将table段显示出来
 
 - mov ax,table
 
 - mov ds,ax
 
 - mov si,0
 
 - mov cx,21
 
 - mov dh,2
 
 - mov dl,0
 
 - table_show:
 
 -         push cx
 
 -         push dx
 
 -         mov cl,2
 
 -         call show_str
 
 -         pop dx
 
 -         add dh,1
 
 -         pop cx
 
 -         loop table_show
 
  
 
 
- mov ax,4c00h
 
 - int 21h
 
  
 
- ;--------------------------------------------------
 
 - dtoc:
 
 - ;参数
 
 -                 ;(ax)=dword,低16位
 
 -                 ;(dx)=dword,高16位
 
 -                 ;ds:si指向字符串的首地址
 
 - ;===============================
 
 - ;保存寄存器
 
 -         push ax
 
 -         push bx
 
 -         push cx
 
 -         push dx
 
 -         push si
 
 -         push di
 
 - ;===============================
 
 - mov bx,0
 
 - dtoc_j:
 
 -         mov cx,10
 
 -         call divdw
 
 -         push cx
 
 -         inc bx
 
 -         mov cx,ax
 
 -         jcxz dtoc_r
 
 -         jmp dtoc_j
 
 - dtoc_r:
 
 -         mov cx,bx
 
 -         dtoc_l:
 
 -                 pop bx
 
 -                 add bx,30H
 
 -                 mov es:[di],bl
 
 -                 inc di
 
 -                 loop dtoc_l
 
 - ;===============================
 
 - ;恢复寄存器
 
 -                 pop di
 
 -                 pop si
 
 -                 pop dx
 
 -                 pop cx
 
 -                 pop bx
 
 -                 pop ax
 
 -                 ret
 
 - ;-------------------------------------------
 
 - ;-------------------------------------------
 
  
- divdw:
 
 - ;参数
 
 -                 ;(ax)=dwrod,低16位
 
 -                 ;(dx)=dword,高16位
 
 -                 ;(cx)=除数
 
 - ;返回
 
 -                 ;(dx)=结果的高16位
 
 -                 ;(ax)=结果的低16位
 
 -                 ;(cx)=余数
 
 - ;==========================
 
 - ;保存寄存器
 
 - push si
 
 - push bx
 
 - ;=========================
 
 - mov bx,ax
 
 - mov ax,dx
 
 - mov dx,0
 
 - div cx
 
 - push ax
 
 - mov ax,bx        
 
 - div cx
 
 - mov cx,dx        ;结果的余数
 
 - pop dx                ;结果的高16位
 
 -                         ;结果的低16位,默认在ax中。
 
 - ;=========================
 
 - ;恢复寄存器
 
 - pop bx
 
 - pop si
 
 - ret
 
 - ;--------------------------------------
 
 - ;--------------------------------------
 
 - show_str:
 
 - ;参数
 
 -                         ;(dh)=行号
 
 -                         ;(dl)=列号
 
 -                         ;(cl)=颜色
 
 - ;======================
 
 - ;======================
 
 - ;计算行号
 
 - dec dh
 
 - mov ax,0a0h
 
 - mul dh
 
 - mov bx,ax
 
  
- ;计算列号
 
 - mov ax,2
 
 - mul dl
 
 - sub ax,2
 
  
- ;行号+列号
 
 - add ax,bx
 
  
- ;计算显存首地址
 
 - mov bx,8000h
 
 - add ax,bx
 
 - mov di,ax
 
 - mov ax,0b000h
 
 - mov es,ax
 
  
- ;写入数据
 
 - mov bl,cl
 
 - mov bp,0
 
 - show_str_s0:
 
 -         mov al,ds:[si]
 
 -         mov es:[di+bp],al
 
 -         mov es:[di+bp+1],bl
 
  
-         mov cl,[si]
 
 -         mov ch,0
 
 -         jcxz show_str_s1
 
  
-         inc si
 
 -         add bp,2
 
 -         jmp short show_str_s0
 
 -         show_str_s1:
 
 -         inc si
 
 -                 ret
 
  
- ;======================
 
  
- codesg ends
 
 - end start
 
  
  复制代码 
 
 |   
- 
截图纪念一下 
 
 
 
 
 
 
 
 |