1. 程式人生 > 其它 >彙編第三版 王爽 課程設計1

彙編第三版 王爽 課程設計1


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'
	
	dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827
    dd 803530,1183000,1843000,2759000,3753000,4649000,5937000
	
	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 21 dup('year summ ne ?? ')
table ends

show segment
	db 20 dup(0)
show ends

code segment

start: 
	;初始化資料
	call copy

	;思路:一行可以顯示80個字元 每列中間空10個字元 每列使用10個字元,靠左	左邊空10個字元

	mov ax,table
	mov ds,ax

	mov ax,show
	mov es,ax
	
	mov bx,0
	mov dh,3	;列印行
	mov cx,21

	start_s:
		push cx

		;顯示年份
		mov cx,2
		start_s1:
			mov ax,ds:[bx]
			mov es:[0],ax
			mov ax,ds:[bx+2]
			mov es:[2],ax
			loop start_s1
		mov es:[4],0
		
		mov dl,10	;列數
		mov cl,2	;字元屬性
		call show_str

		;公司總收入
		push dx
		mov ax,ds:[bx+5]
		mov dx,ds:[bx+7]
		call dtoc
		pop dx
	
		mov dl,30	;列數
		mov cl,2	;字元屬性
		call show_str

		;員工人數
		push dx
		mov ax,ds:[bx+10]
		mov dx,0
		call dtoc
		pop dx
	
		mov dl,50	;列數
		mov cl,2	;字元屬性
		call show_str

		;人均收入
		push dx
		mov ax,ds:[bx+13]
		mov dx,0
		call dtoc
		pop dx
	
		mov dl,70	;列數
		mov cl,2	;字元屬性
		call show_str

		inc dh
		add bx,16
		pop cx
		loop start_s
	

    ; mov ax,12345	;資料低位
	; mov dx,1		;資料高位
    ; call dtoc

    ; mov dh,8	;行數
	; mov dl,1	;列數
	; mov cl,2	;字元屬性
	; call show_str
    
	mov ax,4c00h
	int 21h

;數字轉字元
dtoc:

	push cx
	push si

	mov si,0
    s1:
		mov cx,10      ;除數

		;返回值:dx 結果高16位 
		;		ax 結果低16位 
		;		cx 餘數
		call divdw	

		add cx,30H
		push cx		;暫存餘數
		inc si

		;判斷結果是否為 0
		
        mov cx,dx   ;商為0停止
		jcxz ok1
		jmp short s1
	ok1:mov cx,ax
		jcxz ok2
        jmp short s1

        ok2:
			mov cx,si	;有多少個元素
			mov si,0
		s2:	pop ax
			mov es:[si],ax
			add si,1
			loop s2
			mov es:[si],0

			pop si
			pop cx

            ret
;螢幕列印
show_str:
		push ds
		push es
		push ax
		push bx
		push cx
		push si
		push di

	mov ax,show ;字元列印地址
	mov ds,ax
	mov si,0

	mov ax,0b800h
	mov es,ax
	;找到行位置
	mov al,160
	mov ah,dh
	mul ah
	mov bx,ax

	mov al,2
	mov ah,dl
	mul ah
	mov di,ax
	sub di,2

	mov al,cl
	s:	
		mov cl,ds:[si]
		mov ch,0
		jcxz ok
		mov ah,ds:[si]
		mov es:[bx+di],ah
		mov es:[bx+di+1],al
		add di,2
		inc si
		jmp short s
	ok:	
		pop di
		pop si
		pop cx
		pop bx
		pop ax
		pop es
		pop ds
		
		ret

;通用除法
divdw:
	push bx

    push ax
    mov ax,dx
    mov dx,0
    div cx
    mov bx,ax   ;儲存 int(H/N) 被除數高16位 / 除數

    pop ax
    div cx
    mov cx,dx
    mov dx,bx   ;結果高位

	pop bx

    ret

;資料初始化
copy:
	;ds指向資料段
	mov ax,data
	mov ds,ax
	;es指向table段
	mov ax,table
	mov es,ax

	mov cx,21
	mov di,0
	mov si,0
	mov bx,0
	copy_s:	;年份1
		mov ax,ds:[di]
		mov es:[bx],ax
		;收入1
		mov ax,ds:[di+84]
		mov es:[bx+5],ax
		;僱員數
		mov ax,ds:[si+168]
		mov es:[bx+10],ax

		add si,2
		add di,2
		;年份2
		mov ax,ds:[di]
		mov es:[bx+2],ax	
		;收入2
		mov ax,ds:[di+84]
		mov es:[bx+7],ax
		;計算人均收入
		mov ax,es:[bx+5]
		mov dx,es:[bx+7]
		mov bp,es:[bx+10]
		div bp
		mov es:[bx+13],ax

		add di,2
		add bx,16
		loop copy_s
	ret

code ends
end start