王爽汇编语言课设一简单实现

assume cs:code,ds:data,ss:stack,es:table

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个年份(84)

	dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
	dd 345980,59027,803530,1183000,1843000,2759000,3753000,4649000,5937000
	;21年的年收入(84)

	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

	db 41 dup(' ')

table ends

stack segment
	
	dd 8 dup(0)

stack ends

code segment

start:
	mov ax,data
	mov es,ax		;数据段
	mov ax,table
	mov ds,ax		;table段
	mov ax,stack
	mov ss,ax		;栈段,临时存放数值
	mov sp,64
	
	mov ax,0
	mov bx,0
	mov cx,21
	mov dx,0
	mov bp,0		;定位data中年份和收入
	mov di,168		;定位data中雇员
	mov si,0			
					;寄存器初始化
	mov byte ptr ds:[41],0

	mov dh,1
s:	push cx
	push dx
	mov si,0
	push es:[bp]
	push es:[bp].2
	pop ds:[si].2
	pop ds:[si]
	
	mov ax,es:[bp].84
	mov dx,es:[bp].86
	mov si,10
	call dtocc

	mov si,20
	mov ax,es:[di]
	mov dx,0
	call dtocc

	mov si,30
	mov ax,es:[bp].84
	mov dx,es:[bp].86
	div word ptr es:[di]
	mov dx,0
	call dtocc 

	pop dx
	mov dl,1
	mov cl,2
	mov si,0
	call show_str

	add di,2
	add bp,4
	
	pop cx
	inc dh

	loop s



	mov ax,4c00h
	int 21h

;子程序 1/3 dtocc
;将word型数据转变为表示十进制数的字符串,字符串以0为结尾符
;
;ds:si指向字符串的首地址

dtocc:
	push bp
	push bx
	push cx
	push dx
	push ax
	push si
	mov bx,0

s_dtocc:
	mov cx,10
	call divdw
	inc bx
	add cx,30h
	mov ds:[si],cl
	inc si
	push cx
	mov cx,dx
	jcxz ss_dtocc
ss_dtocc:
	mov cx,ax
	add cx,dx
	jcxz ok_dtocc
	pop cx
	jmp short s_dtocc

ok_dtocc:
	pop cx
	pop si
	mov ax,bx
	mov dl,2
	div dl
	mov ah,0
	mov cx,ax
	jcxz s2_dtocc
	dec bx
	mov bp,0
s1_dtocc:
	mov al,ds:[bx].[si]
	mov ah,ds:[si].[bp]
	mov ds:[si].[bp],al
	mov ds:[bx].[si],ah
	dec bx
	inc bp
	loop s1_dtocc

s2_dtocc:
	pop ax
	pop dx
	pop cx
	pop bx
	pop bp
	ret

;子程序 2/3 show_str
;在指定的位置,用指定的颜色,显示一个用0结束的字符串
;(dh)=行号(取值范围0~24) (dl)=列号(取值范围0~79),(cl)=颜色,ds:si指向字符串的首地址

show_str:
	push ax
	push bx
	push cx
	push dx
	push es
	
	mov ax,0b80ah
	mov es,ax
	dec dl	
	mov ax,80
	mul dh
	mov dh,0
	add ax,dx
	add ax,ax
	mov bx,ax
	mov ax,cx
				;(bx)指定的位置
s_show_str:	
	mov cl,ds:[si]
	jcxz ok_show_str
	mov dl,ds:[si]
	mov es:[bx],dl
	inc si
	inc bx
	mov es:[bx],al
	inc bx
	jmp short s_show_str
	
ok_show_str:	
	pop es
	pop dx
	pop cx
	pop bx
	pop ax
	mov si,0
	ret		

;子程序 3/3 divdw
;进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
;(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
	

divdw:
	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

code ends

end start

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值