本实验针对于清华大学版《微机原理与接口技术》,其相关内容仅供参考,如有错误练习评论。
其使用的语言为汇编语言,相关的编译环境为EMU8086,硬件仿真环境为PROTEUS 8 其他版本可能存在运行问题。
针对于本实验一,其内容主要是针对于课本中的范例问题进行解决,和对于编译环境的熟悉。
本实验针对于课本中的三个问题进行运行分析。
题目为:从键盘上输入数字1~3,根据输入选择显示对应的模块条目。
题目分析:
对于本题来说,首先要定义相关的内容,之后通过对应的输入字符进行判断,从而输出相应的语句。
书上的示例代码如下:
DATA SEGMENT
PLEASEIN DB 'INPUT A NUMBER(1~3):$',0DH,0AH
MSG1 DB 'MODULE1...$',0DH,0AH
MSG2 DB 'MODULE2...$',0DH,0AH
MSG3 DB 'MODULE3...$',0DH,0AH
DATA ENDS
ATACODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
INP: LEA DX,PLEASEIN
MOV AH,9
INT 21H
MOV AH,1
INT 21H
CMP AL,'1'
JB INP
JE M1
CMP AL,'2'
JE M2
CMP AL,'3'
JE M3
JMP INP
M1: LEA DX,MSG1
JMP OUTP
M2: LEA DX,MSG2
JMP OUTP
M3: LEA DX,MSG3
JMP OUTP
OUTP: MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
在EMU8086中运行后的效果如下:
代码运行显示有误,那么其中的问题在于什么呢,思考一下?
对于代码段的定义存在问题,首先我们应该知道对于汇编语言系统中包含四个段,分别是数据段DS,代码段CS,附加段ES与堆栈段SS。正常情况下,代码段是最重要的一部分组成部分。
而对于本题来说,代码段定义时,前部分为ATACODE SEGMENT ,后部分却写的是CODE ENDS,两部分的名称并没有进行对应。所以出现了问题。
综上所述,正确代码修改如下:
DATA SEGMENT
PLEASEIN DB 'INPUT A NUMBER(1~3):$',0DH,0AH
MSG1 DB 'MODULE1...$',0DH,0AH
MSG2 DB 'MODULE2...$',0DH,0AH
MSG3 DB 'MODULE3...$',0DH,0AH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
INP: LEA DX,PLEASEIN
MOV AH,9
INT 21H
MOV AH,1
INT 21H
CMP AL,'1'
JB INP
JE M1
CMP AL,'2'
JE M2
CMP AL,'3'
JE M3
JMP INP
M1: LEA DX,MSG1
JMP OUTP
M2: LEA DX,MSG2
JMP OUTP
M3: LEA DX,MSG3
JMP OUTP
OUTP: MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
其运行结果如下:
如上图,对应输入1,2,3显示。
这道题是对于其中的对于代码等变量的定义之间的相关问题。
题目为:编程实现将BX的内容以十六进制数形式显示在显示屏上。
题目分析:做题之前应该先注意,键盘输入与屏幕输出都是基于ASCII码的,本题在于将二进制转换为十六进制数,再转换为ASCII码。实现十六进制数转换为ASCII码时需要判断十六进制数是处于0~9之间还是处于A~F之间,再尝试本题之前,最好看一下书上所画的流程图。
书上的流程图如下所示:
之后是书上的示例代码:
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CH,4
ROT: MOV CL,4
ROL BX,CL
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,3AH
JL DISP
ADD AL,07H
DISP: MOV DL,AL
MOV AH,02H
INT 21H
DEC CH
JNZ ROT
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果如下:
问题出自于MOV AX,DATA? ;其语句的内容是将数据段的内容放到AX中,而在本题中DATA内容并没有定义,并且在定义之后,对于其中的BX中的内容会发现里面数值没有变换,在于其中的数据没有定义修改,导致其存在数值不改变的问题。
参考代码如下:
DATA SEGMENT
;buffer resb 5 ; 用于存储输入的缓冲区,假设输入的数不超过5位
;message db 'Enter a number: $'
;result_message db 'You entered: $'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CH,4
ROT: MOV CL,4
MOV BX,10
ROL BX,CL
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,3AH
JL DISP
ADD AL,07H
DISP: MOV DL,AL
MOV AH,02H
INT 21H
DEC CH
JNZ ROT
MOV AH,4CH
INT 21H
CODE ENDS
END START
作为参考代码实现的功能是默认定义BX=10,也可以加上键盘输入代码,实现对于BX中的数据通过键盘进行赋值输入。示例代码如下:
assembly
; 设置数据段
DATA SEGMENT
KEYBOARD_INPUT DB 1 DUP ('$') ; 定义一个字符缓冲区用于存储键盘输入
DATA ENDS
; 设置代码段
CODE SEGMENT
ASSUME DS:DATA, CS:CODE
START:
MOV AX, DATA ; 将数据段地址加载到AX
MOV DS, AX ; 设置数据段
; 显示提示信息(例如:"Enter a character: ")
MOV AH, 09H
LEA DX, PROMPT_MESSAGE
INT 21H
; 等待键盘输入
MOV AH, 01H ; BIOS键盘服务,读取一个字符
INT 21H ; 输入的字符会被存放在AL寄存器中
; 将输入的字符保存到缓冲区
MOV [KEYBOARD_INPUT], AL
; 将缓冲区中的字符值移到BX寄存器
MOV BX, OFFSET KEYBOARD_INPUT
MOV BL, [BX]
; 这里可以添加更多代码来处理BX中的输入值
; 程序结束
MOV AH, 4CH ; DOS终止程序服务
INT 21H
PROMPT_MESSAGE DB 'Enter a character: $'
CODE ENDS
END START
题目为:编程实现函数RESULT=1 A1>A2 ;0? A2<=A1;其中A1和A2为字变量名。
题目分析:对于键盘上的2个十进制数字进行读取,并且使用子程序进行接受,主程序与子程序之间通过变量BX传递参数,使其分别存放在变量A1和A2中,通过比较得出结论,与第二题一样,最好解决之前先画一个程序流程图。
书上的流程图如下:
书上的范例代码如下:
DATA SEGMENT
A1 DW ?
A2 DW ?
RESULT DW 1
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
CALL INPUT
MOV A1,BX
CALL INPUT
MOV A2,BX
MOV AX,A1
CMP AX,A2
JG NEXT
MOV RESULT,0
JMP OK
NEXT:MOV RESULT,1
OK: MOV AH,4CH
INT 21H
;*************************************
;子程序名:INPUT
;功能:从键盘接受数据转换为十进制数
;入口参数:无
;出口参数:BX十进制数
INPUT PROC
PUSH AX
MOV BX,0
MOV AX,0
MOV CX,4
LOP1: MOV AH,1
INT 21H
SUB AL,30H
JL OVER
CMP AL,0AH
JG OVER
CBW
XCHG AX,BX
MOV CX,0AH
MUL CX
XCHG AX,BX
ADD BX,AX
LOOP LOP1
OVER:POP AX
RET
INPUT ENDP
CODE ENDS
END START
其运行结果如下所示:
并没有实现功能,其具体的问题留给读者,本文不细说,之后对于本题,笔者写了一个代码用于实现本题功能。
其效果图如下:
功能均能实现,其代码文件如下(包含上述所有代码文件):
https://download.csdn.net/download/qq_65777333/88661474?spm=1001.2014.3001.5503
其相关的可以参考绑定的资源,最后祝大家学习更上一层楼,天天开心!!!