1. 程式人生 > >組合語言子函式——將數字轉換為字串並顯示

組合語言子函式——將數字轉換為字串並顯示

對於機器來說,它是看不懂我們認為定義的數字的,必須要先轉換為人與機器的轉換協議,就是ASCII碼,所以需要先轉換再顯示

這裡將用到之前兩節中用到的子函式

程式碼如下:

assume cs:code, ds:data

data segment
	db 10 dup(0)
	dd 197514
data ends

code segment
	start:								mov bx, data
										mov ds, bx
										mov ax, ds:[10]
										mov dx, ds:[12]
										mov si, 0
										call dtoc
										
										mov dh, 8
										mov dl, 3
										mov cl, 2
										call show_str
										
										mov ax, 4C00H
										int 21H
										
						dtoc:			push sp
										push ds
										push es
										push bx
										push cx
										push bp
										push si
										push di
										push dx
										push ax
										
										mov bp, sp                    ;[bp]是ax, [bp+2]是dx
										mov di, 0
										
										mov bx, [bp]                  ;將要顯示的數值的低位取出
										mov si, [bp + 2]              ;將要顯示的數值的高位取出
								s1:		mov ax, bx                    ;呼叫之前寫的子函式防止溢位問題
										mov dx, si                    ;這裡的ax和dx分別存放資料的低位和高位
										mov cx, 10                    ;cx存放除數
										call divdw
										
										add cl, 30H                   ;處理後cx得到餘數
										mov ch, 0
										push cx             ;在該迴圈中,push操作只進行了兩次,因為當餘數為最後一個的時候,商已經變為零
										
										add di, 1           ;如果是兩位數,di加了兩次
										
										mov bx, ax                    ;將得到的商的低位送入bx,進行迴圈
										mov si, dx                    ;將得到的商的高位送入si,進行迴圈
										
										mov cx, ax                    ;ax中存放的是商的低位, 當商的低位為零時結束迴圈
										jcxz ok1
										jmp s1
										
								ok1:	mov si, 0
										mov cx, di
								s2:		pop bx              ;出棧兩次
										mov ds:[si], bl
										add si, 1           ;;;;;;;;;;;;;;;;;;;;;;;
										loop s2
																			
										mov bl, 0H
										mov ds:[si], bl
										pop ax
										pop dx
										pop di
										pop si
										pop bp
										pop cx
										pop bx
										pop es
										pop ds
										pop sp
										ret
						
						show_str:		push ax
										push cx
										push si
										push di
										push bx
										push es
										
										push dx                       ;用棧將行數和列數儲存起來
										mov bp, sp
										
										mov al, [bp + 1]
										mov ah, 0
										mov bx, 160
										mul bx
										mov si, ax                    ;做了16位乘法演算法後,dx的值已經被改變
																	  ;si中存放顯示區域的每行的首偏移地址
									
										mov al, [bp]                  ;因為每個字元是用由兩個位元組組成的,所以這裡計算列數
										mov bl, 2
										mul bl
										mov bx, ax                    ;bx中存放每個字元的第一個位元組的地址
										
										pop dx                        ;將上次入棧的dx出棧
										
										mov di, 0
										mov dl, cl                    ;將顏色資訊給dl
										mov ax, 0B800H
										mov es, ax
									s:	mov cl, ds:[di]
										mov ch, 0
										jcxz ok
										mov es:[si + bx], cl
										mov es:[si + bx + 1], dl
										add bx, 2
										add di, 1
										jmp s
										
									ok:	pop es
										pop bx
										pop di
										pop si
										pop cx
										pop ax
										ret
										
						divdw:			push si
										push di
										push ax
										push dx
										push cx
										
										mov bp, sp                                ;[bp]是cx,[bp+2]是dx,[bp+4]是ax
										mov ax, [bp + 2]                          ;ax存放16位除法的低位
										mov dx, 0
										mov bx, [bp]
										div bx
										mov si, ax                                ;si存放商
										
										mov ax, [bp + 4]
										mov bx, [bp]
										div bx
										
										mov cx, dx
										mov dx, si
										
										pop di
										pop di
										pop di
										pop di
										pop si
										ret
										
code ends
end start

這裡同樣用的是子函式的形式給出來的,主要的語句已經解釋了,需要學習者仔細看註釋,畢竟是組合語言,需要理解的部分很多,下面是執行結果:

程式中輸入的引數是197514,所以輸出是: