|
主题 : : 课程设计的问题:能完成题目要求,但修改了雇员人数的数据类型。求指教。 [待解决] |
回复[ 6次 ]
点击[ 289次 ] | |
荣誉值:0
信誉值:0
注册日期:2011-07-20 08:57 |
不是很完美。没寄存器可用了。想用bp做控制雇员人数的变量,可他在程序中的值不知道怎么改变了。
天晓得我没再用他。
DSEG SEGMENT
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'
db '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994'
db '1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000
dd 5937000
dd 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dd 11542,14430,15257,17800
db 16 dup (' ')
DSEG ENDS
SSEG SEGMENT PARA STACK 'stack'
dw 100 dup(0) ;初始化堆栈大小为100
SSEG ENDS
CSEG SEGMENT
assume cs:CSEG, ds:DSEG, ss:SSEG
start : ;主程序入口
mov ax, dseg
mov ds, ax
mov ax,sseg
mov ss,ax
mov sp,200
mov si,252
mov di,0
mov bx,0100h ;把他用做控制行数了(bh+1 )
mov cx,21
sss: push cx
mov ax,[di] ;显示年份
mov dx,[di+2]
mov [si],ax
mov [si+2],dx
mov ax,0
mov [si+5],ax
mov dl ,01
mov dh,bh
mov cl,0111b
call show_str
mov ax,[di+84] ;显示收入
mov dx,[di+86]
call dtocdw
mov dl ,14h
mov dh,bh
mov cl,0111b
call show_str
mov ax,[di+168] ;显示雇员人数
mov dx,0
call dtocdw
mov dl ,32h
mov dh,bh
mov cl,0111b
call show_str
mov ax,[di+84] ;显示人均收入
mov dx,[di+86]
mov cx,[di+168]
call divdw
call dtocdw
mov dl ,46h
mov dh,bh
mov cl,0111b
call show_str
add di,4
inc bh
pop cx
loop sss
mov ah,1
int 21h
mov ax, 4c00h ;程序结束,返回到操作系统系统
int 21h
show_str:
;名称:show_str
;功能:显示一串末尾是0的字符串
;参数:(dh)=行号(0~24),(dl)=列号(0~79),
; (cl)=颜色,ds:si 指向字符串的首地址
;返回:无
push cx
push es
push ax
push bx
push si ;为了让si指向字符串的首地址
mov ax,0b800h
mov es,ax
dec dh
dec dl
mov al,160
mul dh
add dl,dl
mov dh,0
add ax,dx
mov bx,ax
mov dl,cl
show_s: mov cl,[si]
mov es:[bx],cl
mov es:[bx+1],dl
mov ch,0
jcxz show_ok
inc si
add bx,2
jmp show_s
show_ok:
pop si
pop bx
pop ax
pop es
pop cx
ret
;------------------------------------------------------------------------------
dtocdw :
;将dw型的数据变为十进制的字符串,字符串以0为结尾副
;参数:dx 为dw数据的高16位,ax为低16位
;ds:si指向字符串的首地址,转变后的字符串放到ds:si所指向的
;地址中正序存入
push bx
push cx ; 现场保护
push si
mov bx,0 ; 计数器bx
s: mov cx,10 ;调用divdw (dx中为高16位,ax为低16位,cx为除数)
call divdw
add cl,30h ;余数在cx,由于除数是10,所以余数在cl中
push cx ; cx入栈
inc bx ; 计数器+1
mov cx,0
add cx,dx
add cx,ax
jcxz ok1 ; 余数为0,循环结束
jmp s ; 不为0,由于dx是商的低16位,dx是高16位
ok1:mov cx,bx ; 计数器-> cx
s0: pop bx ; 转变后的第一位 bx
mov [si],bl ; 存入ds
inc si
loop s0 ; 计数器为0 跳出
mov ax,0
mov [si],ax ;加结束符
pop si
pop cx
pop bx
ret
;-------------------------------------------------------------------------
divdw:
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位
; (cx)=余数
;应用举例:计算 1000000/10 (f4240h/0ah)
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
pop bx
ret
CSEG ENDS
END start | | |