汇编实验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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章