鱼C论坛

 找回密码
 立即注册
查看: 2435|回复: 4

[技术交流] 课程设计1

[复制链接]
发表于 2012-3-28 13:16:41 | 显示全部楼层 |阅读模式

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

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

x
入门级的,方法比较笨,大家多指点。
assume cs:code,ds:data
data segment
 db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
 db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
 db '1993','1994','1995'
 ;data:54h
 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
 ;data:0a8h
 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
 dw 11542,14430,15257,17800
data ends
code segment
start:
 call nf
 call sr
 call gy
 call rjsr
 
 mov ax,4c00h
 int 21h
nf:
 push ax
 push ds
 push es
 push bx
 push si
 push cx
 
 mov ax,data
 mov ds,ax
 
 mov ax,0b800h
 mov es,ax
 
 mov bx,0
 mov si,0
 
 mov cx,21
nf1:
 push cx
 mov cx,4
nf0:
 mov al,[bx]
 mov es:[si],al
 mov byte ptr es:[si+1],2
 inc bx
 add si,2
 loop nf0
 
 add si,98h
 pop cx
 loop nf1
 pop cx
 pop si
 pop bx
 pop es
 pop ds
 pop ax
 ret
sr:
 push ax
 push bx
 push cx
 push dx
 push ds
 push es
 push si
 push di
 push bp
 mov ax,data
 mov ds,ax
 
 mov ax,0b800h
 mov es,ax
 
 mov bx,0h
 mov si,54h
 mov di,20h
 mov bp,0
 
 mov cx,21
sr4:
 push cx
 push di
 
 mov dx,[si+2]
 mov ax,[si]
sr1:
 mov cx,10
 call divdw
 add cx,30h
 push cx
 inc bp
 mov cx,ax
 jcxz sr0
 jmp short sr1
sr0:
 mov cx,dx
 jcxz sr2
 jmp short sr1
sr2:
 mov cx,bp
sr3:
 pop [bx]
 inc bx
 loop sr3
 mov bx,0
 mov ch,0
sr6:
 mov cl,[bx]
 jcxz sr5
 mov es:[di],cl
 mov byte ptr es:[di+1],2
 inc bx
 add di,2
 jmp short sr6
sr5:
 add si,4
 pop di
 add di,0a0h
 mov bx,0
 mov bp,0
 pop cx
 loop sr4
 pop bp
 pop di
 pop si
 pop es
 pop ds
 pop dx
 pop cx
 pop bx
 pop ax
 ret
divdw:
 ;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
 ;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数。
 ;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数。
 push bx
 push ax
 mov ax,dx
 mov dx,0
 div cx
 mov bx,ax
 pop ax
 div cx
 mov cx,dx
 mov dx,bx
 pop bx
 ret
gy:
 push ax
 push bx
 push cx
 push dx
 push ds
 push es
 push si
 push di
 push bp
 mov ax,data
 mov ds,ax
 
 mov ax,0b800h
 mov es,ax
 
 mov bx,0
 mov si,0a8h
 mov di,40h
 mov bp,0
 
 mov cx,21
gy1:
 push cx
 push di
 
 mov ax,[si]
 mov dx,0
gy0: 
 mov cx,10
 call divdw
 add cx,30h
 push cx
 inc bp
 mov cx,ax
 jcxz gy3
 jmp short gy0
gy3:
 mov cx,dx
 jcxz gy2
 jmp short gy0
gy2:
 mov cx,bp
gy4:
 pop [bx]
 inc bx
 loop gy4
 mov bx,0
 mov ch,0
gy6:
 mov cl,[bx]
 jcxz gy5
 mov es:[di],cl
 mov byte ptr es:[di+1],2
 inc bx
 add di,2
 jmp short gy6
gy5:
 add si,2
 pop di
 add di,0a0h
 mov bx,0
 mov bp,0
 pop cx
 loop gy1
 pop bp
 pop di
 pop si
 pop es
 pop ds
 pop dx
 pop cx
 pop bx
 pop ax
 ret
rjsr:
 push ax
 push bx
 push cx
 push dx
 push ds
 push es
 push si
 push di
 push bp
 mov ax,data
 mov ds,ax
 
 mov ax,0b800h
 mov es,ax
 
 mov bx,0
 mov si,54h
 mov di,0a8h
 mov cx,21
rjsr1:
 push cx
 mov ax,[si]
 mov dx,[si+2]
 mov cx,[di]
 call divdw
 mov [bx],ax
 mov [bx+2],dx
 add si,4
 add di,2
 add bx,4
 pop cx
 loop rjsr1
 
 mov bx,0
 mov si,0
 mov di,60h
 mov bp,0
 mov cx,21
rjsr7:
 push cx
 push di
 mov ax,[si]
 mov dx,[si+2]
rjsr0:
 mov cx,10
 call divdw
 add cx,30h
 push cx
 inc bp
 mov cx,ax
 jcxz rjsr3
 jmp short rjsr0
rjsr3:
 mov cx,dx
 jcxz rjsr2
 jmp short rjsr0
rjsr2:
 mov cx,bp
rjsr4:
 pop [bx]
 inc bx
 loop rjsr4
 mov bx,0
 mov ch,0
rjsr6:
 mov cl,[bx]
 jcxz rjsr5
 mov es:[di],cl
 mov byte ptr es:[di+1],2
 inc bx
 add di,2
 jmp short rjsr6
rjsr5:
 add si,4
 pop di
 add di,0a0h
 mov bx,0
 mov bp,0
 pop cx
 loop rjsr7
 pop bp
 pop di
 pop si
 pop es
 pop ds
 pop dx
 pop cx
 pop bx
 pop ax
 ret
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-28 16:45:03 | 显示全部楼层
给个建议
每一段与段之间 增加空格行数
  至少在每一段开始或者结束的地方添加一句注释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-29 16:08:02 | 显示全部楼层
好长的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-31 20:41:28 | 显示全部楼层
很长啊,鱼哥,有没有短点的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-2 12:49:09 | 显示全部楼层
本帖最后由 天长地久 于 2012-8-2 13:12 编辑

我的代码是直接在试验7的代码基础上添加的!还可以再优化一下!
assume cs:code,ss:stack
data segment
           db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
     db '1986','1985','1986','1987','1988','1989','1990','1991','1992'
     db '1993','1994','1995'
     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
     dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
     dw 11542,14430,15257,17800
data ends
table segment
           db 21 dup ('year summ ne ?? ')
table ends
stack segment para stack'zjsf'
     dw 16 dup (0)
stack ends
code segment
    start: mov ax,data
     mov ds,ax
     mov bx,0
     mov ax,table
     mov es,ax
     mov bp,0
     mov si,0
     mov di,0
     mov cx,21
s:    mov ax,[bx]
     mov es:[bp],ax
     mov ax,2[bx]
     mov word ptr es:2[bp],ax
     mov ax,84[bx]
     mov word ptr es:5[bp],ax
     mov ax,86[bx]
     mov word ptr es:7[bp],ax
     mov ax,168[di]
     mov word ptr es:10[bp],ax
     mov ax,84[bx][si]
     add si,2
     mov dx,84[bx][si]
     div word ptr 168[di]
     mov word ptr es:13[bp],ax
     add bx,4
     mov si,0
     add di,2
     add bp,16
     loop s
     mov ax,table   ;这里开始课程设计一
     mov ds,ax
     mov di,0
     mov ax,stack
     mov ss,ax
     mov sp,32
     mov ax,0b800h
     mov es,ax
     mov bx,320
     mov si,58
     mov cx,21
ss0:   mov bp,0
     call dyl1   ;第一子程序
     add si,30   ;列数增加30位
     add di,5    ;数据列增加5位
     call dyl2   ;第二子程序
     add si,30   ;列数增加30位
     add di,5    ;数据列增加5位
     call dyl3   ;第三子程序,使用的是第二子程序的代码!比第二子程序少用一行代码!
     add si,30   ;列数增加30位
     add di,3    ;数据列增加3位
     call dyl3   ;第四子程序,使用的是第三子程序的代码!
     add bx,160
     mov si,58
     add di,3
     loop ss0
     mov ax,4c00h
     int 21h
dyl1:  push bx    ;显存写入的起始行数
     push si    ;显存写入的起始列数
     push di    ;被读取数据的起始位置
     push cx
s1:    mov dx,0    ;将dx的内容清零
     mov dl,ds:[di]  ;将数据保存在dx的低位
     mov cx,dx   ;将dx的值保存在cx中
     sub cx,20h   ;运算cx-20h是非=0,如果cx=0 下面将跳转
     jcxz dyl12   ;如果cx=0 跳转到dyl12  不=0 继续下面的循环
     mov dh,7    ;将颜色保存在dx的高位
     mov es:[bx+si],dx ;将数据写入显存地址
     add si,2
     inc di
     jmp short s1
dyl12: pop cx
     pop di
     pop si
     pop bx
     ret     ;第一子程序结束
dyl2:  mov dx,2[di]   ;第二子程序开始
dyl3:  mov ax,[di]   ;第三四子程序开始
     push bx    
     push si
     push di
     push cx
     mov di,0
dyl21: mov cx,dx
     jcxz dyl22
     push ax           ;低位保存到栈
     mov ax,dx   ;高位移到AX中待除
     mov dx,0    ;高位清零
     mov cx,10   ;除数设置为10
     div cx    ;高位除以10   开始除高位
     mov bp,ax   ;除后商保存到bp中
     pop ax            ;将栈中保存的数恢复到AX中
     div cx    ;低位除以10 开始除低位
     push dx    ;将结果余数保存到 栈  中
     inc di
     mov dx,bp
     jmp short dyl21
dyl22: mov cx,10
     div cx
     push dx
     inc di
     mov dx,0
     mov cx,ax
     jcxz dyl23
     jmp short dyl22
dyl23: mov cx,di
dyl24: pop ax
     add al,30h
     mov ah,7
     mov es:[bx+si],ax
     add si,2
     loop dyl24
     pop cx
     pop di
     pop si
     pop bx
     ret     ;第二三四子程序结束
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-20 12:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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