彙編實驗1

(1)要求實驗者按照原樣對源程序進行編輯,彙編後,根據TASM給出的錯誤信息對源程序進行修改,直到沒有語法錯誤爲止。然後進行鏈接,並執行相應的可執行文件。正確的執行結果是在屏幕上顯示:25+9=34。
在這裏插入圖片描述

DATA	SEGMENT  
SUM	DB		?,?
MESG	DB		'25+9='
		DB		0,0,'$'
N1		DB		9,0F0H
N2		DW		25
DATA	ENDS
CODE	SEGMENT	
		ASSUME	CS:CODE,DS:DATA
BEG:	MOV	AX,DATA
		MOV	DS,AX
		MOV	BX,OFFSET SUM
		MOV	AH,N1
		MOV	AL,BYTE PTR N2
		ADD	AH,AL
		MOV [BX],AH
		CALL CHANG
		MOV	AH,9
		MOV	DX,OFFSET MESG
		INT	21H
		MOV	AH,4CH
		INT	21H
CHANG PROC
LAST:	CMP	BYTE PTR[BX],10
		JC	NEXT
		SUB	BYTE PTR[BX],10
		INC	BYTE PTR[BX+7]
		MOV AH, BYTE PTR[BX]
		JMP	LAST
NEXT:	MOV DX,WORD PTR SUM
		ADD	WORD PTR[BX+8],DX
		ADD	BYTE PTR[BX+7],30H
		ADD	BYTE PTR[BX+8],30H
		RET
CHANG ENDP
CODE	ENDS
		END	BEG

;先將25與9作加法運算,獲得(22)16,即十進制的34,不斷用34-10
每減一次,INC BYTE PTR[BX+7],最終得到34的十位。
將減後剩下的4送入BYTE PTR[BX+8]即可。

(2)從BUF單元開始存有一字符串(長度<255),編程實現統計該串字符中的ASCII碼在42H~45H之間的字符個數,並將統計結果以二進制形式顯示在屏幕上。
在這裏插入圖片描述

DATA SEGMENT
BUF DB 255
	DB ?
	DB 255 DUP(?)			
CRLF DB 0DH,0AH,24H   		;0DH就是回車 0AH就是換行 24H='$',這個就是表示你要輸入的字符串結束  CRLF是宏指令的名稱,編譯時彙編程序用宏體替換宏指令,因此執行CRLF後,光標返回下一行始格。
N DB 0 						;統計的字符數
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA

BEG:
	MOV AX,DATA
	MOV DS,AX
	MOV AH,0AH				;【功能號0AH】等待鍵入字符串,以回車結束,保存入BUF
	MOV DX,OFFSET BUF 
	INT 21H 				
	
	MOV AH,9 				;【功能號09H】 顯示字符串,響應Ctrl_C。 入口參數:DS:DX=字符串首地址,字符串必須以‘$'(即 ASCII碼24H)爲結束標誌 
	MOV DX,OFFSET CRLF 		
	int 21h 
	
	MOV SI,OFFSET BUF 		;si指向BUF首地址
	INC SI 					;指向第一個存放實際接受字符個數的字節
	MOV CL,[SI] 			;將實際輸入的字符的個數放入CL
	MOV CH,0 				;將CH置零,相當於現在CX存放的是字符的總個數。
	INC SI 					;越過存放實際接受字符個數的字節,現在指向輸入字符串的實際存儲區域的首地址

JUDGE: 
	MOV AL,[SI] 			;將第一個字符放入AL
	CMP AL,42H 				;如果該字符ASCII小於0x42,則跳轉到TOTAL
	JB TOTAL
	CMP AL,45H 				;如果該字符ASCII大於0x45,則跳轉到TOTAL
	JA TOTAL 
	INC N 					;否則則字符ASCII處於0x42—0x45之間,N加一
	
TOTAL: 
	INC SI 					;si指向下一個字符,循環執行LAST1
	LOOP JUDGE 				;循環字符的總個數次
	MOV AL,N				;將統計出來符合ASCII處於0x42—0x45之間的字符個數送入AL
	MOV CX,8 				;準備循環8次,以二進制形式輸出N
	
NEXT: 
	ROL AL,1 				;循環左移一次
	PUSH AX 				;將目前AX的值暫時入棧,在判斷完第一位,並顯示在屏幕上之後,將AX回覆,並進行下一次左移
	MOV AH,2 				;【功能號02H】 顯示一個字符,響應Ctrl_C。入口參數:DL=待顯字符的ASCII碼。 
	JC  DISPLAY_1 			;如果這一位爲1,進位則跳轉到DISPLAY_1
	MOV DL,'0' 				;將'0' MOVE進DL
	JMP DISPLAY_0 			;跳轉到DISPLAY,默認輸出'0'
	
DISPLAY_1: 
	MOV DL,'1' 				;將'1' MOVE進DL,跳轉到DISPLAY,輸出'1'
	
DISPLAY_0: 
	INT 21H 
	POP AX 
	LOOP NEXT 				;循環左移共8次
	MOV AH,4CH 				;程序結束
	INT 21H 
	
CODE ENDS 
END BEG 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章