汇编语言_在屏幕输出实验7的数据

求助:同学汇编的同学,谁能帮我看一下,我的输出结果怎么是这样?

在这里插入图片描述

代码如下:

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

	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值