王爽 汇编语言 课程设计1 独立完成

王爽 汇编语言 课程设计1 独立完成_第1张图片

assume cs:codesg
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
	;以上是表示21年公司总收入的21个dword型数据
	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型数据
data ends

table segment
	db 21 dup ('year sumn ne ?? ')
table ends

data_string segment
	db 10 dup (0)
data_string ends

stack segment
	db 16 dup (0)
stack ends

codesg segment
start:	mov ax,data
	mov ds,ax	;ds:[di]指向data
	mov ax,table
	mov es,ax	;es:[bx+si]指向table

	mov di,0
	mov bx,0
			;mov si,0
	mov cx,21
  s1:	mov dx,cx
	mov si,0	;###后加
	mov cx,4
    s2:	mov al,ds:[di]
	mov es:[bx+si],al
	inc di			;inc,di
	inc si			;inc,si
	loop s2
	mov cx,dx
	add bx,10H
	loop s1

	mov bx,0
	mov cx,21
  s3:	mov ax,ds:[di]
	mov es:[bx+5],ax
	add di,2
	mov ax,ds:[di]
	mov es:[bx+7],ax
	add di,2
	add bx,10H
	loop s3

	mov bx,0
	mov cx,21
  s4:	mov ax,ds:[di]
	mov es:[bx+0aH],ax
	add di,2
	add bx,10H
	loop s4

	mov bx,0
	mov cx,21
  s5:	mov ax,es:[bx+5]
	mov dx,es:[bx+7]
	div word ptr es:[bx+0aH]
	mov es:[bx+0dH],ax
	add bx,10H
	loop s5

	mov ax,data_string
	mov ds,ax
	mov si,0	;ds:[si]指向字符串首地址
	mov ax,stack
	mov ss,ax
	mov sp,10H
	
	mov di,1
	mov bx,0
	mov si,0
	mov cx,21
  ss1:	push cx
	mov si,0
	mov cx,4
  ss2:	mov al,es:[bx+si]
	mov ds:[si],al
	inc si
	loop ss2
	inc di
	mov ax,di
	mov dh,al
	mov dl,12
	mov cl,2
	mov si,0
	call show_str
	pop cx
	add bx,10H
	loop ss1
;************************************
	mov di,1
	mov bx,0
	mov si,0
	mov cx,21
  ss3:	push cx
	mov ax,es:[bx+5]
	mov dx,es:[bx+7]
	call dtocdw
	inc di
	mov ax,di
	mov dh,al
	mov dl,23
	mov cl,2
	mov si,0
	call show_str
	pop cx
	add bx,10H
	loop ss3
;************************************
	mov di,1
	mov bx,0
	mov si,0
	mov cx,21
  ss4:	push cx
	mov ax,es:[bx+0aH]
	mov dx,0
	call dtocdw
	inc di
	mov ax,di
	mov dh,al
	mov dl,35
	mov cl,2
	mov si,0
	call show_str
	pop cx
	add bx,10H
	loop ss4
;************************************
	mov di,1
	mov bx,0
	mov si,0
	mov cx,21
  ss5:	push cx
	mov ax,es:[bx+0dH]
	mov dx,0
	call dtocdw
	inc di
	mov ax,di
	mov dh,al
	mov dl,45
	mov cl,2
	mov si,0
	call show_str
	pop cx
	add bx,10H
	loop ss5
;************************************

	mov ax,4c00H		;后加,此项需要放在子程序前,否则程序无法正常退出
	int 21H
;###################show_str############################
;名称:show_str
;功能:在指定位置,用指定颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0-24),(dl)=列号(取值范围0-79)
;    :(cl)=颜色,ds:si指向字符串首地址
;返回:无
;应用举例:在屏幕的8行3列,用绿色显示data段中的字符串

show_str:
	push dx
	push ax
	push bx
	push es
	push cx
	push ds
	push si

	dec dh
	mov al,0a0H
	mul dh
	mov bx,ax
	mov al,2
	mul dl
	sub ax,2
	add bx,ax
	mov ax,0b800H
	mov es,ax
	mov al,cl		;后加,用于显示字符颜色属性

 s_ptr:				;mov al,cl	
	mov ch,0
	mov cl,ds:[si]		;此项设置改变了cl
	jcxz ok_ptr
	inc si
	mov es:[bx],cl
	mov es:[bx+1],al	;后加,用于显示字符颜色属性
	add bx,2		;inc bx
	jmp short s_ptr
 ok_ptr:pop si
	pop ds
	pop cx
	pop es
	pop bx
	pop ax
	pop dx
	ret
;####################divdw##############################
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
;参数:(ax)=dword型数据低16位,(dx)=dword型数据高16位,(cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
;应用举例:计算1000000/10(f4240H/0aH)

divdw:
	push bx		;bx用于上一级程序记录计算次数
	mov bx,ax
	mov ax,dx	
	mov dx,0
	div cx
	mov si,ax
	mov ax,bx
	div cx		;测试一下dx是否为0
	mov cx,dx
	mov dx,si
	pop bx
	ret
;###################dtocdw#############################
;名称:dtocdw
;功能:将dword型数据转变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,ds:si指向字符串的首地址
;返回:无
;应用举例:编程,将数据5937000(5a9768H)以十进制的形式在屏幕的8行3列,用绿色显示出来。
dtocdw:	push dx
	push di
	push cx
	push ax
	push si
	push bx		;后加,用于记录余数个数用
	
	mov bx,0	;后加,用于记录余数个数用
			;mov cx,0aH
 s_dtocdw:
	mov cx,0aH	;后加的
	call divdw
	mov di,cx
	mov cx,ax
	jcxz ok1_dtocdw
	add di,30H
	push di		;mov ds:[si],dl,发现顺序不对,更改
	inc bx		;inc si
	jmp short s_dtocdw
 ok1_dtocdw:
	mov cx,dx
	jcxz ok2_dtocdw
	add di,30H
	push di
	inc bx
	jmp short s_dtocdw
 ok2_dtocdw:
	add di,30H
	push di		;mov ds:[si],dl
	inc bx		;后加,最后循环要用5次,不加就是4次

	;以下为后加,用栈实现逆序转正序
	mov cx,bx
	mov si,0	;后加,保证ds:si指向字符串首地地址
  s2_dtocdw:
	pop ds:[si]
	inc si		;保留低位字节,覆盖高位字节
	loop s2_dtocdw

	pop bx		;后加
	pop si
	pop ax
	pop cx
	pop di
	pop dx
	ret
;#######################################################
	;mov ax,4c00H	此项需要放在子程序前,否则程序无法正常退出
	;int 21H
codesg ends
end start









你可能感兴趣的:(汇编语言,王爽,汇编语言,课程设计1,独立完成)