求助:同学汇编的同学,谁能帮我看一下,我的输出结果怎么是这样?
代码如下:
assume cs:code,ds:data,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个字符串 year,每个year占4个字节,
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword数据 sum 84=21*4
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
; 偏移地址:偏移地址:168=84*2
data ends
table segment
db 21 dup ('year summ ne ?? ')
;0123456789ABCDEF
table ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start:
;初始化栈
mov ax,stack
mov ss,ax
mov sp,128
call input_table
call clear_screen
;将data断种的年份放入table中
call output_table
call show_average
mov ax,4c00h
int 21h
;==========================clear_screen==============================
;==========================clear_screen==============================
clear_screen:
mov bx,0b800h
mov es,bx
mov bx,0
mov dx,0700h ;颜色为无色
mov cx,2000
clearScreen:
mov es:[bx],dx
add bx,2
loop clearScreen
ret
;=========================clear_screen===============================
;=========================clear_screen===============================
;=========================output_table===============================
;=========================output_table===============================
;输出table中的年份
output_table:
; db 21 dup ('year summ ne ?? ')
;0123456789ABCDEF
;数据来源,并设置偏移变量
mov ax,table
mov ds,ax
mov si,0
;设置目的地址,并设置偏移变量
mov bx,0b800h
mov es,bx
mov di,160*2 ;每行80个字
;设置循环次数
mov cx,21
;循环移动,输出年份
outputTable:
;这个位置可以用一个循环
call show_year
;显示总收入
call show_summ
call show_ne
add si,16
add di,160
loop outputTable
ret
;=========================show_year===============================
show_year:
push cx
push si
push di
mov cx,4
add di,2*12
call showYear
pop di
pop si
pop cx
ret
showYear:
mov al,ds:[si]
mov es:[di],al ;单字节移动
mov byte ptr es:[di+1],00000100B ;显示一种颜色
add di,2 ;显存 显示下一个位置
inc si ;源地址向后移动
loop showYear
ret
;showyear外循环用到的寄存器:ds(存放源数据),si(源数据偏移变量,控制行每次+16),es(存放目的数据),di(目的数据偏移变量,控制显存行位置,每次+160到下一行),cx(外层次数),
;内循环用到的寄存器:cx(内层次数,4次),di(控制显存位置:起始在第三个字开始显示)
;=========================show_summ===============================
show_summ:
; db 21 dup ('year summ ne ?? ')
;0123456789ABCDEF
;show_year和show_summ共同使用的寄存器为:ds,si ,es,di, cx
push cx
push si
push di
;设置目的地址,并设置偏移变量
mov ax,ds:[si+5]
mov dx,ds:[si+7]
add di,25*2
call short_div
pop di
pop si
pop cx
ret
short_div:
mov cx,10
div cx
add dl,30H
mov es:[di+0],dl ;这个位置应该加上
mov byte ptr es:[di+1],00000010B
mov cx,ax
jcxz shortDivRet
mov dx,0 ;商清0
sub di,2 ;向前存放
jmp short_div
shortDivRet:
ret
;=================================================
show_ne:
push cx
push si
push di
mov ax,ds:[si+10]
mov dx,0
add di,30*2
call short_div
pop di
pop si
pop cx
ret
;=========================show_average===============================
show_average:
push cx
push si
push di
mov ax,ds:[si+13]
mov dx,0
add di,40*2
call short_div
pop di
pop si
pop cx
ret
;=========================output_table===============================
;=========================output_table===============================
;==========================input_table==============================
;==========================input_table==============================
input_table:
;可用的寄存器,si,di,bp,bx,cx
; ;设置数据来源,并设置si为偏移变量
mov bx,data
mov ds,bx
mov si,0
;设置数据目的地,并设置di为偏移变量
mov ax,table
mov es,ax
mov di,0
;设置总收入偏移变量
mov bx,21*4*2
mov cx,21
inputTable:
;移动年份
push ds:[si+0]
pop es:[di+0]
push ds:[si+2]
pop es:[di+2]
;移动总收入
mov ax,ds:[si+21*4+0]
mov dx,ds:[si+21*4+2]
mov es:[di+5],ax
mov es:[di+7],dx
;移动人数
push ds:[bx]
pop es:[di+10]
div word ptr es:[di+10]
mov es:[di+0dh],ax
add di,16
add si,4
add bx,2
loop inputTable
ret
;==========================input_table==============================
;==========================input_table==============================
code ends
end start