彙編實驗10-3 數值顯示

代碼及註釋:

;本程序意圖爲設計一個子程序實現內存中二進制數轉化爲10進制數並且顯示在屏幕上
;程序描述:
;將數據12666以十進制的形式顯示在屏幕的8行3列,用綠色顯示出來。
;在顯示時調用本實驗中第一個字程序show_str
;提示:
;要將內存中保存的”12666”(內存中以二進制形式保存)轉化爲顯示在屏幕上的字
;串”12666”需要經過一定的轉換,具體操作就是將12666除以10取餘,當商爲0時
;則表示已經轉換完,十進制對應的ASCII碼就是十進制數碼加上30h
;比如6對應的就是ASCII碼36h
assume cs:code,ds:data,ss:stack

data segment
	db 16 dup (10)		;因爲所操作的數爲12666。將其轉化爲對應字符串的ASCII後5個字
					;節,加上以0爲結束一共6個字節
data ends

stack segment
	db 16 dup (10)		;我寫的程序中使用了棧,故開闢一段空間存放數據
stack ends

code segment
start:
	mov ax,12666
	mov bx,data
	mov ds,bx	
	mov bx,stack
	mov ss,bx		
	mov sp,16	;初始化ds及ss
	mov si,0
	call dtoc

	mov dh,8
	mov dl,3
	moc cl,2
	call show_str		;定義字符顯示位置及屬性,調用子程序
	
	mov ax,4c00h
	int 21h

dtoc:
	mov di,0
	mov bx,10
  s: mov dx,0
	div bx	;因爲12666第一次除以10爲1266不能使用16位/8位的除法形式,因爲al
			;中最大隻能保存255
	mov cx,ax
	push dx
	inc di
	jcxz ok	;因爲當商爲0時表示對應的轉換已經完成,所以使用cx儲存除法的結果,
			;並且使用jcxz指令跳轉到處理完轉換後的程序
			;inc di作用爲記錄入棧數據的個數,後面程序會要用這個作爲循環條件以及
			;將字符串都保存到data段後可以再分配0到字符串後面作爲結束標誌
			;將數據入棧的原因爲用除法取餘時十進制的出現是從最低位一直到最高位的
			;比如“12666”對應的餘數分別是6、6、6、2、1入棧後在出棧剛好可以實現
			;以12666形式保存在data中
	jmp s

ok:
	mov cx,di
lp:
	pop ax
	add al,30h
	mov [si],al
	inc si
	loop lp	;將di中保存的數據(餘數的個數)傳遞給cx。並且將其中的餘數轉化爲對應
			;的十進制ASCII碼,循環作用爲將這些以轉換完的數據存入data中
	mov byte ptr [di],0
	ret

show_str:
	push dx
	push cx
	push ax
	push si

	mov ax,0800h
	mov es,ax
	mov si,0
	mov al,0a0h
	mul dh
	mov bx,ax
	mov al,2
	mov ah,0
	mul dl
	add bx,ax
	
	mov ch,0
	mov di,cx
s0: mov cl,[si]
	mov ch,0
	jcxz ha
	mov es:[bx],cl
	mov es:[bx+1],di
	inc si
	inc bx
	inc bx
	jmp s0

ha:
	pop si
	pop ax
	pop cx
	pop dx
	ret
code ends
end start


代碼截圖及運行結果:


小結:

這....花了我大半個晚上

還好寫出來了,不然睡不着了

這一個小小的轉換居然這麼費心思,可能是我思路有問題把,但是獨立完成的感覺很好

原以爲做完這三個就結束了,沒想到後面還有一個課程設計....看看都有點怕啊

必要的註釋都寫在上面了

加油吧

發佈了126 篇原創文章 · 獲贊 15 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章