687 字
3 分钟
南邮微机-实验1
2021-12-05
2026-03-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
南邮微机-实验1
/posts/南邮微机-实验1/
作者
唐承乾
发布于
2021-12-05
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

Personal Site
唐承乾
Profile Image of the Author
技术笔记、长期专题与电子书草稿

嵌入式 & AI 工作流。螺旋式学习,把踩过的坑整理成以后还能复用的东西。

GitHub 知乎
CSDN