- UID
- 65892
注册时间2010-3-1
阅读权限50
最后登录1970-1-1
感悟天道
TA的每日心情 | 慵懒 2024-12-4 10:07 |
---|
签到天数: 444 天 [LV.9]以坛为家II
|
本帖最后由 sdnyzjzx 于 2010-12-29 14:56 编辑
第一个比较大点的代码,贴出来请大家指正。
由于一开始写每个模块时,并不知道这个课程设计要求,也不懂编程的原则,所以开始设计的每个小模块都只照顾到了自己的功能,没有考虑到其他模块间的调用,加上不知道编程的原则(我认为至少要做好寄存器数据保护与还原),因此整个代码还不是很条理,甚至有点乱,也给后来合并到一起时的调试带来了很多麻烦,尽管如此,从中学到不处东西: 1、了解了栈平衡的重要性; 2、了解了编制一段大点代码要统筹安排,合理分配寄存器的使用,到底想要怎么传递参数,心里一定要清楚; 3、练习了数据的寻址方式。
尽管不算好,但功能实现了,还是贴出来记录一下,今后再进一步改进。- assume cs:code
- data segment
- dw 100 dup (0)
- i dw 1423,12666,1,8,3,38
- j dd 1024,1234567,238763,887766,345543,99990088
- d_1 db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
- db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
- db '1993','1994','1995'
- d_2 dd 16,22,382,1356,2390,8000,160000,24486,50065,97479,140417,197514
- dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
- d_3 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
- dw 100 dup (0)
- stack ends
- code segment
- start: mov ax,data
- mov ds,ax
- mov ax,stack
- mov ss,ax
- mov sp,200
- mov ax,table
- mov es,ax
- mov bx,offset d_1 ;年份入栈
- mov cx,21
- s1:
- mov ax,[bx]
- push ax
- mov ax,[bx+2]
- push ax
- add bx,4
- loop s1
- mov bx,140h
- mov cx,15h
-
- s2: pop ax ;年份出栈到 table 表
- mov es:[bx+2],ax
- pop dx
- mov es:[bx+0],dx
- sub bx,10h
- loop s2
- mov bx,offset d_2
- mov cx,21
- s3: mov ax,[bx] ;收入入栈
- push ax
- mov ax,[bx+2]
- push ax
- add bx,4
- loop s3
- mov bx,140h
- mov cx,15h
- s4: pop ax ;收入出栈到 table 表
- mov es:[bx+7],ax
- pop dx
- mov es:[bx+5],dx
- sub bx,10h
- loop s4
-
- mov bx,offset d_3 ;雇员人数
- mov cx,21
- mov si,0
- s5: mov ax,[bx]
- push si
- shl si,1
- shl si,1
- shl si,1
- shl si,1
- mov es:[si+0ah],ax
- add bx,2
- pop si
- inc si
- loop s5
- mov cx,21 ;计算人均收入
- mov bx,0
- s6: mov dx,es:[bx+7]
- mov ax,es:[bx+5]
- div word ptr es:[bx+0ah]
- mov es:[bx+0dh],ax
- add bx,10h
- loop s6
- ; 以上获得 table 表数据
- ; 以下是显示部分
- mov bx,0 ;要显示数据的偏移位置
- mov si,0 ;保存数据转化为字符后偏移位置
- mov di,0
- mov cx,21 ;要转化数据的个数 21行
- push cx
- _main:
- ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- ;显示年份
- call _printable
- add sp,2
- ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- ;显示收入
- mov ax,es:[bx+5] ;转化收入为字符
- mov dx,es:[bx+7]
- push cx
- mov cx,0ah
- call dtoc
- pop cx
- push bx
- mov bx,386 ;3行33列
- call show_str
- pop bx
- ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- ;显示雇员数
- mov ax,es:[bx+0ah] ;转化收入为字符
- mov dx,0
- push cx
- mov cx,0ah
- call dtoc
- pop cx
- push bx
- mov bx,410 ;3行45列
- call show_str
- pop bx
- ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- ;显示人均收入
- mov ax,es:[bx+0dh] ;转化收入为字符
- mov dx,0
- push cx
- mov cx,0ah
- call dtoc
- pop cx
- push bx
- mov bx,434 ;3行57列
- call show_str
- ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- ;循环显示21行
- add di,160
- pop bx ;行加1
- add bx,10h
- loop _main
- ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- ;退出程序
- mov ax,4c00h
- int 21h
- _printable:
- push bp
- mov bp,sp
- push cx
- push bx
- push si
- push es
- push ax
- xor ax,ax
- mov al,02h ;显示首行
- mov cx,80*2
- mul cx
- xor dx,dx
- mov dl,18h ;显示首列
- add dl,dl
- add ax,dx
- add ax,di
- mov si,ax
- mov cx,5
- _s_show:
- mov al,es:[bx] ;显示 1-5 位字符
- push bx
- push es
- mov bx,0b800h
- mov es,bx
- mov es:[si],al
- mov es:[si+1],byte ptr 4 ;字符颜色
- pop es
- pop bx
- inc bx
- inc si
- inc si
- loop _s_show
- _s_over:
- pop ax
- pop es
- pop si
- pop bx
- pop cx
- mov sp,bp
- pop bp
- ret
- dtoc: push bx
- _s0: call divdw
- cmp dx,0 ;商的高位是否为0
- jnz _s1
- cmp ax,0 ;商的低位是否为0
- jnz _s1
- add cx,30h
- mov [si],cx
- pop bx
- ret ;数据转化完成,返回
- _s1: ; 写入转化完成的数据为字符
- add cx,30h
- mov [si],cx
- inc si
- mov cx,0ah
- jmp _s0
- show_str:
- push es
- mov ax,0b800h
- mov es,ax
- xianshi: ;dtoc 显示
-
- mov al,[si]
- mov byte ptr es:[bx+di],al ;要显示的字符
- mov byte ptr es:[bx+1+di],4 ;要显示字符的颜色
- cmp si,0
- jz ok
- dec si
- add bx,2
- jmp xianshi
-
- ok: pop es
- ret
-
- divdw: push si ;dword型数值除法运算
- push di
- mov si,ax ;save ax(L)t
- mov ax,dx
- mov dx,0
- div cx ;(H/N)
- mov di,dx ;save rem(H/N)
- push di
- mov dx,0 ;int(H/N)
- mov di,2
- mul di
- mov bx,32768 ;int(H/N)*65536
- mul bx
- pop di
- push ax ;save int(H/N)*65536
- push dx
- mov ax,di ;Load rem(H/N)
- mov di,2
- mul di
- mul bx
- add ax,si ;rem(H/N)*65536+L
- div cx
- mov si,ax
- mov cx,dx
- pop dx
- pop ax
- pop di
- add ax,si
- pop si
- ret
- code ends
- end start
复制代码
kc.rar
(1.74 KB, 下载次数: 24)
|
|