18555587 发表于 2012-3-28 13:16:41

课程设计1

入门级的,方法比较笨,大家多指点。
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,
mov es:,al
mov byte ptr es:,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,
mov ax,
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
inc bx
loop sr3
mov bx,0
mov ch,0
sr6:
mov cl,
jcxz sr5
mov es:,cl
mov byte ptr es:,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,
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
inc bx
loop gy4
mov bx,0
mov ch,0
gy6:
mov cl,
jcxz gy5
mov es:,cl
mov byte ptr es:,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,
mov dx,
mov cx,
call divdw
mov ,ax
mov ,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,
mov dx,
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
inc bx
loop rjsr4
mov bx,0
mov ch,0
rjsr6:
mov cl,
jcxz rjsr5
mov es:,cl
mov byte ptr es:,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

莫名其妙 发表于 2012-3-28 16:45:03

给个建议
每一段与段之间 增加空格行数
至少在每一段开始或者结束的地方添加一句注释

谢青源 发表于 2012-3-29 16:08:02

好长的代码

爭_峰 发表于 2012-7-31 20:41:28

很长啊,鱼哥,有没有短点的

天长地久 发表于 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,
   mov es:,ax
   mov ax,2
   mov word ptr es:2,ax
   mov ax,84
   mov word ptr es:5,ax
   mov ax,86
   mov word ptr es:7,ax
   mov ax,168
   mov word ptr es:10,ax
   mov ax,84
   add si,2
   mov dx,84
   div word ptr 168
   mov word ptr es:13,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:;将数据保存在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:,dx ;将数据写入显存地址
   add si,2
   inc di
   jmp short s1
dyl12: pop cx
   pop di
   pop si
   pop bx
   ret   ;第一子程序结束
dyl2:mov dx,2   ;第二子程序开始
dyl3:mov ax,   ;第三四子程序开始
   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:,ax
   add si,2
   loop dyl24
   pop cx
   pop di
   pop si
   pop bx
   ret   ;第二三四子程序结束
code ends
end start
页: [1]
查看完整版本: 课程设计1