微机原理与接口技术实验一

2023-12-27 20:21:56

前言:

本实验针对于清华大学版《微机原理与接口技术》,其相关内容仅供参考,如有错误练习评论。

其使用的语言为汇编语言,相关的编译环境为EMU8086,硬件仿真环境为PROTEUS 8 其他版本可能存在运行问题。

针对于本实验一,其内容主要是针对于课本中的范例问题进行解决,和对于编译环境的熟悉。

本实验针对于课本中的三个问题进行运行分析。

1、课本上,P148页例题4-9的内容

题目为:从键盘上输入数字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显示。

这道题是对于其中的对于代码等变量的定义之间的相关问题。

2、课本上,P150页例题4-10的内容

题目为:编程实现将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

3、课本上,P157页例题4-12的内容

题目为:编程实现函数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

其相关的可以参考绑定的资源,最后祝大家学习更上一层楼,天天开心!!!

文章来源:https://blog.csdn.net/qq_65777333/article/details/135202939
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。