(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