南邮微机实验1
程序员文章站
2022-06-20 20:23:30
...
南邮微机实验1
实验1题目:
下面给出的是一个通过比较法完成8位二进制数转换成十进制数送屏幕显示功能的汇编语言源程序,但有很多语法错误。 要求实验者按照原样对源程序进行编辑,汇编后,根据MASM给出的错误信息对源程序进行修改,直到没有语法错误为止。然后进行链接,并执行相应的可执行文件。正确的执行结果是在屏幕上显示:25+9=34。
改错后的程序
程序1:
;FILENAME: EXA131.ASM
.486
DATA SEGMENT USE16 ;此处的segment拼写分离
SUM DB ?,?
MESG DB '25+9='
DB 0,0,'$' ;使用9号DOS指令来显示字符串,需要以'$'结尾
N1 DB 9 ;常量不能以字母开头。F0H需要表示成0F0H。此处我没发现0F0H有什么用,就把他删了,不耽误程序运行的。
N2 DB 25 ;25可以用一个BYTE型表示,这样后面就不用PTR了。当然也可以用PTR解决对齐问题
DATA ENDS
CODE SEGMENT USE16
ASSUME CS: CODE, DS:DATA
BEG: MOV AX, DATA
MOV DS,AX
MOV BX, OFFSET SUM
MOV AH, N1
MOV AL, N2
ADD AH, AL
MOV BYTE PTR [BX], AH
CALL CHANG
MOV AH, 9
MOV DX, OFFSET MESG ;MESG拼写错成MEST
INT 21H
MOV AH, 4CH
INT 21H
CHANG PROC
LAST: CMP [BX],10
JC NEXT
SUB [BX],10
INC WORD PTR [BX+7];INC的目标操作数如果是内存操作数时,需要用PTR
JMP LAST
NEXT: MOV CL,SUM
ADD [BX+8],CL;ADD的源操作数和目标操作数不能同时为内存操作数。这里把[BX+8]存放在寄存器CL里。
ADD [BX+7],30H
ADD [BX+8],30H
RET
CHANG ENDP
CODE ENDS
END BEG
程序2
有错吗?没有错。
.486
DATA SEGMENT USE16
MESG DB '25+9='
DB '3','4','$'
DATA ENDS
CODE SEGMENT USE16
ASSUME CS: CODE, DS:DATA
BEG: MOV AX, DATA
MOV DS,AX
MOV AH, 9
MOV DX, OFFSET MESG
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END BEG
实验2题目
从BUF单元开始存有一字符串(长度< 255 ),编程实现统计该串字符中的ASCII码在 42H~45H之间的字符个数,并将统计结果以二进制形式显示在屏幕。
程序
.486
DATA SEGMENT USE16
MESG DB '@ABCDE'
CNT EQU $-MESG
DATA ENDS
CODE SEGMENT USE16
ASSUME CS: CODE, DS:DATA
BEG: MOV AX, DATA
MOV DS,AX
MOV CX,CNT
MOV DL,0;DL有初值,记得清空
MOV BX, OFFSET MESG
JEC: CMP BYTE PTR [BX],42H;不能PTR成WORD,不然他会把后面一个字节的内容包含进来
JC NEXT;如果小于42H,跳转下一个
CMP BYTE PTR [BX],45H
JA NEXT;如果大于45H,跳转下一个
INC DL;题目说最多255个,那么用DL就能存的下计数。
NEXT: INC BX
LOOP JEC
CALL DISP
MOV AH, 4CH
INT 21H
;二进制显示
DISP PROC
MOV CX,8
MOV BL,DL
LAST2: MOV DL,'0'
RCL BL,1
JNC NEXT2
MOV DL,'1'
NEXT2: MOV AH,2H
INT 21H
LOOP LAST2
RET
DISP ENDP
CODE ENDS
END BEG