Wang Shuang assembly language course design 1

assume cs:code
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个字符串 起始位置 0
	
	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型数据	起始位置 54H
	
	dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
	dw 11542,14430,15257,17800
	;以上是表示21年公司雇员人数的21个word型数据  起始位置 A8H
	db 10 dup (0)		; 转为字符串的存放位置, 起始位置 D2H
data ends
code segment
  start:mov ax,data
		mov ds,ax
		mov si,0D2H
		mov dh,2
		mov di,0
		mov bx,0
		mov cx,21
	s:	mov dl,20
		push cx
		mov cl,02
		mov ax,[bx]
		mov [si],ax
		mov ax,[bx+2]
		mov [si+2],ax
		call show_str		;显示每一行的年份
		
		call back_zero		;显示年份后,将字符串区的值置为0
		add dl,10			;列数加10,将显示公司收入
		push dx
		mov ax,[bx].54h
		mov dx,[bx].56h
		call dtoc			;调用后ax中的值不变
		pop dx
		mov cl,02
		call show_str		;显示公司收入
		
		call back_zero
		add dl,20			;列数加20,显示人均收入
		push dx
		mov dx,[bx].56h
		div word ptr [di].0A8h
		sub dx,dx
		call dtoc
		pop dx
		mov cl,02
		call show_str		;显示人均收入
		
		call back_zero
		sub dl,10
		push dx
		mov ax,[di].0A8h
		sub dx,dx
		call dtoc
		pop dx
		call show_str		;显示公司人数
		
		add bx,4
		add di,2
		inc dh
		pop cx
		loop s
        mov ax,4c00h
        int 21h
		
;功能:将dword型数据转变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,ds:si 指向字符串的首地址。
;返回:无。
dtoc:	push dx
		push si
		push cx
		push bx
		push ax
		mov bx,0
dtoc_s:	mov cx,10
		call divdw
		add cl,30h
		push cx
		inc bx
		mov cx,ax
		add cx,dx
		inc cx
		loop dtoc_s
		mov cx,bx
dtoc_s1:pop ax
		mov [si],al
		inc si
		loop dtoc_s1
		pop ax
		pop bx
		pop cx
		pop si
		pop dx
		ret
		
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围0~24)(dl)=列号(取值范围0~79),(cl)=要显示字符的属性,ds:si指向字符串的首地址。
;返回:无
show_str:	push dx
			push ax
			push es
			push bx
			push si
			push cx
			mov cl,dh
			mov ch,0
			mov ax,0
			jcxz show_str_a
show_str_s:	add ax,0a0h
			loop show_str_s
show_str_a:	mov cl,dl
			jcxz show_str_a1
show_str_s0:add ax,2
			loop show_str_s0
show_str_a1:mov bx,ax
			mov ax,0b800h
			mov es,ax
			pop ax
show_str_show:mov cl,[si]
			jcxz show_str_ok
			mov es:[bx+1],al
			mov es:[bx],cl
			inc si
			add bx,2
			jmp short show_str_show
show_str_ok:push ax
			pop cx
			pop si
			pop bx
			pop es
			pop ax
			pop dx
			ret
			
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16,(cx)=除数。
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数。
divdw:	push bx
		push ax		
		mov ax,dx
		mov dx,0
		div cx
		pop bx		
		push ax
		mov ax,bx
		div cx
		mov cx,dx
		pop dx
		pop bx
		ret
;功能:将字符串区的值置为0
;参数:无。
;返回:无。
back_zero:	push ax
			push cx
			push bp
			mov ax,0
			mov cx,10
back_zero_s:sub cx,1
			mov bp,cx
			mov ds:[bp].0D2h,al
			inc cx
			loop back_zero_s
			pop bp
			pop cx
			pop ax
			ret
code ends
end start

Guess you like

Origin blog.csdn.net/weixin_44223946/article/details/108913608