687 字
3 分钟
南邮微机-实验1
南邮微机实验1
实验1题目:
下面给出的是一个通过比较法完成8位二进制数转换成十进制数送屏幕显示功能的汇编语言源程序,但有很多语法错误。 要求实验者按照原样对源程序进行编辑,汇编后,根据MASM给出的错误信息对源程序进行修改,直到没有语法错误为止。然后进行链接,并执行相应的可执行文件。正确的执行结果是在屏幕上显示:25+9=34。
改错后的程序
程序1:
;FILENAME: EXA131.ASM.486DATA 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 ENDSCODE 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 21HCHANG 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 RETCHANG ENDPCODE ENDS END BEG程序2
有错吗?没有错
.486DATA SEGMENT USE16 MESG DB '25+9=' DB '3','4','$'DATA ENDSCODE 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 21HCODE ENDS END BEG实验2题目
从BUF单元开始存有一字符串(长度< 255 ),编程实现统计该串字符中的ASCII码在 42H~45H之间的字符个数,并将统计结果以二进制形式显示在屏幕。
程序
.486DATA SEGMENT USE16 MESG DB '@ABCDE' CNT EQU $-MESGDATA ENDSCODE 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 RETDISP ENDPCODE ENDS END BEG部分信息可能已经过时