1 鱼币
assume cs:code,ds:data,es:table,ss:stack
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'
;以上表示21年的21个字符串
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
dw 16 dup (0)
table ends
stack segment
dw 32 dup(0)
以上代码用emu8086调试通过,但是用cmd调用无输出,debug调用出现错误显示。请高手帮忙调试。
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,32
mov ax,table
mov es,ax
mov si,0
mov di,0
mov cx,21
call out_put
mov ax,4c00h
int 21h
;------------out_put-----start---使用寄存器bx,cx,dx,si,di-------
out_put: ;写入es数据库
mov cx,21 ;总循环21行
mov di,0 ;定义显单元
mov bx,0 ;定义ds年份、收入数据单元
mov si,0 ;定义ds人数单元
mov dx,0
mov ax,0
all_s:
call out_put_1
call out_put_2
call out_put_3
call out_put_4
add bx,4
add si,2
add dh,1
loop all_s
ret
;-------------out_put-end----------
;----------显示字节单元-开始---------------
out_put_1:
;-------1-年份循环开始----
push bx
push cx
push dx
push di
push si
mov cx,4
add dh,2 ;行
mov dl,3 ;列
o_s1:;年份循环4次
push cx
mov cl,33 ;定义显示位置与颜色
mov al,byte ptr ds:[bx];第一个单元赋值
call show_str ;调用显示程序,传递al
inc bx
inc dl
pop cx
loop o_s1
pop si
pop di
pop dx
pop cx
pop bx
;-------1-年份循环结束----
ret
out_put_2:
;-------2-收入循环开始----
push bx
push cx
push di
push si
push dx
mov ax,ds:[bx+84]
mov dx,ds:[bx+86]
call gt_16_10 ;16转10,传递ax,dx,返回循环次数ax
pop dx
push dx
mov bx,0
mov cx,ax ;定义循环次数
add dh,2 ;行
mov dl,20 ;列
o_s2:;收入循环
push cx
mov cl,33 ;定义显示位置与颜色
mov ax,table
mov es,ax
mov al,byte ptr es:[bx]
call show_str ;调用显示程序,传递al
inc bx
inc dl
inc di
pop cx
loop o_s2
;===============
pop dx
pop si
pop di
pop cx
pop bx
;-------2-收入循环结束----
ret
out_put_3:
;-------3-人数循环开始----
push bx
push cx
push di
push si
push dx
mov ax,ds:[si+168]
mov dx,0
call gt_16_10 ;16转10,传递ax,dx,返回循环次数ax
pop dx
push dx
mov bx,0
mov cx,ax ;定义循环次数
add dh,2 ;行
mov dl,40 ;列
o_s3:;人数循环
push cx
mov cl,33 ;定义显示位置与颜色
mov ax,table
mov es,ax
mov al,byte ptr es:[bx]
call show_str ;调用显示程序,传递al
inc bx
inc dl
inc di
pop cx
loop o_s3
;===============
pop dx
pop si
pop di
pop cx
pop bx
;-------3-人数循环结束----
ret
out_put_4:
;-------4-平均工资循环开始----
push bx
push cx
push di
push si
push dx
mov ax,word ptr ds:[bx+84] ;求平均工资
mov dx,word ptr ds:[bx+86]
div word ptr ds:[si+168]
mov dx,0
call gt_16_10 ;16转10,传递ax,dx,返回循环次数ax
pop dx
push dx
mov bx,0
mov cx,ax ;定义循环次数
add dh,2 ;行
mov dl,60 ;列
o_s4: ;工资循环
push cx
mov cl,33 ;定义显示位置与颜色
mov ax,table
mov es,ax
mov al,byte ptr es:[bx]
call show_str ;调用显示程序,传递al
inc bx
inc dl
inc di
pop cx
loop o_s4
;===============
pop dx
pop si
pop di
pop cx
pop bx
;-------4-平均工资循环结束----
ret
show_str:;显示用程序,使用寄存器ax,bx,cx,dx,es
push bx
push cx
push dx
push si
;push di
push ax
mov si,0
mov ax,0b800h
mov es,ax
mov bx,0
mov di,0
mov si,0
mov ax,160
mul dh;求行首字母数量 (m-1)160
add dl,dl;求列首字母数量 (n-1)2
mov dh,0
mov di,dx
add di,ax
sub di,162;求总数量
;---求出具体显示坐标完毕--
pop ax
push ax
mov ah,cl;颜色参数赋值给ah
;将显示用字符赋值给al,颜色赋值给ah
mov cl,al
mov ch,0
;jcxz ok1
mov word ptr es:[di],ax
;inc si
;add di,2
;jmp short s1
ok1:
pop ax
;pop di
pop si
pop dx
pop cx
pop bx
ret
;----------显示字节单元--结束------------
;----------16进制转换10进制-----ax传递循环次数-------
gt_16_10:
push bx
push cx
push dx
push si
push di
mov cx,10
mov di,0
gt_s:
call div_dw ;传递ax,bx
push cx
mov cx,ax
inc di
jcxz gt_ok
jmp short gt_s
gt_ok:
mov cx,di
mov ax,table
mov es,ax
mov bx,0
gt_s1:
pop ax
add ax,30h
mov es:[bx],ax
inc bx
loop gt_s1
mov ax,di
pop di
pop si
pop dx
pop cx
pop bx
ret
;----------16进制转换10进制--------------
;----------无溢出除法-使用寄存器cx,ax,dx,bx---
div_dw:;16进制变10进制赋值
push bx
mov cx,10
push ax
mov ax,dx
mov dx,0
div cx;16位除法 高16 dx 低16 ax。
mov bx,ax;除完后ax存商,dx存余数
pop ax
div cx;16位除法,高16dx是上面的余数
mov cx,dx
mov dx,bx
pop bx
ret
;----------无溢出除法-结束--------------------
code ends
end start
我来回答