荣誉值:0
信誉值:0
注册日期:2010-04-06 11:41 |
编译通过,运行只显示一行,debug 到想死,仍查不出错在哪?
下面是代码
assume cs:code,ds:data,ss:stack
dataes segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983',
'1984','1985','1986','1987','1988','1989','1990','1991','1992',
'1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,
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,
11542,14430,15257,17800
dataes ends
data segment
dw 16 dup (?)
data ends
stack segment
dw 16 dup(?)
stack ends
code segment
start:mov ax,stack ;初始设置
mov ss,ax
mov sp,20h
mov ax,data
mov ds,ax
mov ax,dataes
mov es,ax
mov bx,0 ;初始化寄存器
mov si,0
mov di,0
mov cx,21
all: push cx
mov ax,es:[di] ;es:[di] 指向年份字符串首地址
mov [si],ax
mov ax,es:2[di]
mov 2[si],ax
mov byte ptr 4[si],0
mov dh,0
mov dl,10h ;列数从10h开始
mov cl,07h
call show_str
;以上是显示年份
;-----------------------------
mov ax,es:84[di] ;es:84[di] 指向年收入首地址
mov dx,es:86[di]
call dtoc
mov dh,0
mov dl,20h ;列数间隔10h
mov cl,07h
call show_str
;以上是显示年收入
;---------------------------------
mov ax,es:168[bx] ;es:168[bx] 指向雇员首地址
mov dx,0
call dtoc
mov dh,0
mov dl,30h ;列数间隔10h
mov cl,07h
call show_str
;以上是显示雇员
;---------------------------------
mov ax,es:84[di]
mov dx,es:86[di]
mov cx,es:168[bx]
call divdw
call dtoc
mov dh,0
mov dl,40h ;列数间隔10h
mov cl,07h
call show_str
;以上是显示人均年收入
mov si,0
add di,4
add bx,2
inc dh
pop cx
loop all
mov ax,4c00h
int 21h
;---------------------------------
;功能: 将dword型数据转变为表示十进制数的字符串,字符串以0为结尾
;入口参数: (ax)=dword型数据的低16位,(dx)=dword型数据的高16位,ds:si指向字符串的首地址
;出口参数: 无
dtoc proc
push ax
push bx
push cx
push dx
push si
mov bx,0
d1:mov cx,10
call divdw
add cl,30h
push cx
inc bx ;设置计数器,以便后来出栈循环
mov cx,ax
jcxz d2
jmp short d1
d2:mov cx,bx
d3:pop ax
mov [si],al
inc si
loop d3
mov byte ptr [si+1],0 ;字符串以0结尾
pop si
pop dx
pop cx
pop bx
pop ax
ret
dtoc endp
;---------------------------------
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,记过为dword型
;入口参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位 ,(cx)=除数
;出口参数:(dx)=结果的高16位,(ax)=结果的低16位 ,(cx)=余数
;公式X/N=INT(H/N)*65536+[REM(H/N)*65536+L]/N, 65536=10000h,相当于左移四位
divdw proc
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
divdw endp
;------------------------------------
;功能:在指定的行列位置用指定的颜色显示一个以0结尾的字符串
;入口参数:(dh)=行数(取值范围1~25),(dl)=列数(取值范围1~80) ,(cl)=颜色,ds:si指向字符串的首地址
;出口参数: 无
show_str proc
push ax
push bx
push cx
push dx
push es
push si
push di
mov al,40h
dec dh
mul dh
mov bx,ax
mov al,2
dec dl
mul dl
add bx,ax
mov ax,0b800h
mov es,ax
mov di,0
s:mov al,cl ;保存颜色值
mov cl,[si]
mov ch,0
jcxz s0
mov ch,al
mov es:[bx+di],cx
inc si
add di,2
mov cl,al ;恢复颜色值
jmp s
s0:pop di
pop si
pop es
pop dx
pop cx
pop bx
pop ax
ret
show_str endp
code ends
end start | | |