1. 程式人生 > >彙編基礎練習題2:編寫輸出子程式,功能是將AX中的數顯示輸出,並在主程式中驗證。

彙編基礎練習題2:編寫輸出子程式,功能是將AX中的數顯示輸出,並在主程式中驗證。

彙編基礎練習題2:

編寫輸出子程式,功能是將AX中的數顯示輸出,並在主程式中驗證。

編譯工具:Masm for Windows 整合實驗環境2012.5
(附帶一個工具下載地址https://download.csdn.net/download/qq_36931762/10825773
有需要可以去下載)
程式碼思路:
本程式是編寫子程式來將暫存器AX中的數進行輸出。因為組合語言與C語言這樣的高階語言不同,所以在輸出多位數(即兩位數或三位數時)不能直接輸出,要通過不斷的迴圈賦值輸出才能將多位數完整的輸出出來,所以首先要設立一個計數器CL並初始化為0,針對AX要考慮AX內值的位數,首先考慮AX是否為1位數通過比較指令CMP與10進行比較,如果是一位數,那麼直接輸出結束程式,如果是多位數,那麼跳轉進入子程式,其中子程式用PROC定義,用CALL呼叫。這時迴圈通過不斷進行除10模除取個位不斷輸出的形式(這裡除法指令餘數存在AH中,餘數存在AL中),這裡採用將AX壓棧來不斷儲存AX中的各個位上是數,通過CL計數器與0進行比較,實現不斷迴圈,最後當AX中各個位上的數都入棧以後,然後再進行不斷迴圈,然後一個一個出棧輸出,從而實現輸出AX中的數。
(敘述能力實在是不咋滴,emmmmm可能說的有點亂七八糟的,不過!你可以參考一下下面的程式碼,程式碼可能說的比我的敘述要清晰多!!本人敘述不如程式碼展示大概就是我的現狀)
---------------------------------------------可愛的程式碼區別線--------------------------------------

DATAS SEGMENT   ;資料段程式碼區,即定義資料的地方。
    ;此處輸入資料段程式碼  
DATAS ENDS

STACKS SEGMENT	;堆疊段程式碼區是用來暫時儲存一些資料。
    ;此處輸入堆疊段程式碼
STACKS ENDS

CODES SEGMENT	;程式碼段
    ASSUME CS:CODES,DS:DATAS,SS:STACKS  ;指示編譯器哪一個段和哪一個段暫存器相關聯。
START:
    MOV AX,DATAS  
    MOV DS,AX	   	;相當於C程式中的左花括號。
    
    MOV AX,123		;MOV為資料傳送指令,將10進位制數123資料傳送到AX暫存器中。
    CALL PRINTAX		;CALL為子程式呼叫指令,這裡是呼叫PRINTAX子程式。
    
    MOV AH,4CH
    INT 21H			;相當於C程式中的右花括號,標識著主程式結束。
    
PRINTAX PROC			;子程式定義,子程式名為PRINTAX。
	PUSH BX		;將BX原本值壓棧,保證將來這個程式進行完後對BX暫存器內的值不影響。
	PUSH CX		;將CX原本值壓棧,保證將來這個程式進行完後對CX暫存器內的值不影響。
	PUSH DX		;將DX原本值壓棧,保證將來這個程式進行完後對DX暫存器內的值不影響。

    MOV BL,10		;MOV為資料傳送指令,將10進位制數10資料傳送到BL暫存器中,賦值BL為10。
    MOV CL,0		;MOV為資料傳送指令,將10進位制數0資料傳送到CL暫存器中,賦值CL為0,CL相當於計數器。
    CMP AX,10		;CMP為比較指令,比較AX暫存器內的值與10的大小。
    JB PRINTF			;JB為條件轉移指令,如果AX內的值小於10,那麼跳轉到PRINTF
W:    				
    DIV BL			;DIV為算術運算指令,將AX內的數進行除10操作,餘數在AH中,商在AL中。
    PUSH AX			;將AX進行壓棧。
    INC CL			;INC為增量指令,CL計數器自加1。
    MOV AH,0		;AH部分賦值為0,即此時將AX內的值調整為AL。
    CMP AX,0			;CMP為比較指令,比較AX暫存器內的值與0的大小。
    JA W 			;JA為條件轉移指令,如果AX內的值大於0,那麼跳轉到W部分,形成迴圈。
p:
	POP DX			;DX出棧。
	DEC CL			;DEC為減量指令,CL計數器自減1。
	MOV DL,DH		;將DH的值賦給DL。
	ADD DL,48		;ADD為加法指令,將DL內的值加上48,使DL內的數字轉化為數字字元。
	MOV AH,2		
	INT 21H			;呼叫2號功能函式,即將DL內的值輸出。
	CMP CL,0		;CMP為比較指令,比較CL內的值與0的大小。
	JNE P			;JNE為條件轉移指令,如果CL內的值不等於0,那麼跳轉到P部分,形成迴圈。
	
	POP BX			;BX出棧。
	POP CX			;CX出棧。
	POP DX			;DX出棧。
    RET				;返回到主程式
    
PRINTF:
	MOV DL,AL		;將AL值賦給DL。
	ADD DL,48		;ADD為加法指令,將DL內的值加上48,使DL內的數字轉化為數字字元。
	MOV AH,2		;呼叫2號功能函式,即將DL內的值輸出。
	INT 21H
	
	POP BX			;BX出棧。
	POP CX			;CX出棧。
	POP DX			;DX出棧。
    RET				;返回到主程式
PRINTAX ENDP

CODES ENDS			;程式碼段結束
END START

;入口引數為AX。

------------------------------------------醬--------------再次區分-------------------------------------------------
AX為1位數
AX為3位數
AX為4位數,且為邊界值
啊啊啊,溢位啦
圖1為一位數值的輸出,圖二為多位正常數值的輸出,圖三圖四為邊界多位數數值的輸出。
在本實驗環境中AX內最大的值為AX為2559,當大於這個數的時候就會溢位。

看不懂歡迎提問啦,也歡迎提出我程式碼中的問題和提出程式碼優化方案,大家一起學習嘛。
原創看過隨手點個贊吧!(雖然我也不太知道點贊有啥用emmm給點鼓勵總是好的)嘻嘻