实验6 键盘操作与显示

一、实验目的
熟悉指令系统,掌握常用指令的用法;通过实验加深对各种寻址方式的理解;能熟练使用DEBUG中的命令对指令进行反汇编,观察并了解机器代码。
二、实验题

  1. 把数据段中1维数组AA_1变量地址中连续7个数(1,3,5,7,2,4,6)读出,把每个数加2后再存入到数据段中BB_1数组开始的标号地址中去,并显示出BB_1数组中每个数来(之间用空格分开),参考程序如下:
DATA  SEGMENT
    ORG 0100H
  AA_1    DB     1,3,5,7,2,4,6
    ORG 0150H
  BB_1    DB    SUB(?)
COUNT  DW     7
DATA  ENDS
CSEG  SEGMENT
      ASSUME CS: CSEG,DS:DATA
START:MOV    AX, DATA
      MOV    DS, AX
      MOV    CX, COUNT
      LEA    SI, AA_1     
      LEA    DI, BB_1     
LP1:  MOV    AL, [SI]    
      ADD    AL,2       
      MOV    [DI], AL       
      INC SI            
      INC DI           
      LOOP  LP1 
      LEA   SI, BB_1    
      MOV CX, COUNT
DISP:  MOV  DL, [SI]
ADD  DL, 30H ;因为显示不能直接显示数值,所以要转换成对应的ascii码       
MOV    AH,02    
INT    21H     
      MOV DL,‘ ’     
      MOV AH,2   
      INT 21H    
      INC   SI
      LOOP  DISP     
MOV    AH,4CH   
      INT    21H
CSEG  ENDS
      END    START

请回答以下问题:
(1) 指令MOV AH, 02H中02H的含义是?
INT 21H 是DOS功能调用,调用的功能号都放在AH中,MOV AH,02H就是调用屏幕字符显示功能,其实就和MOV AH,4CH一样只不过4CH调用的是程序结束执行的功能。
(2) 指令ADD DL, 30H的作用是什么?
因为我们要在屏幕上显示字符,但是屏幕显示字符不能直接显示字符,所以我们需要先将DL中的数值加上30H转换成ASCII码值然后才能正确显示对应的数值字符。
(3) 除了参考程序中用的访问方式,还可以用什么方式访问AA_1数组里的元素?
汇编语言中访问数组其实和C语言十分类似,段地址+偏移地址=真实地址,就和C语言通过数组名加序号的方式访问差不多。
除了通过LEA来获取数组的有效地址之外,还可以通过mov offset来获取数组的偏移地址,这和LEA取有效地址其实作用一样。

  1. 已知DATAX和DATAY单元各存放一个带符号字节数据,从键盘上接收加(+)、减(-)、乘(*)或除(/)符号,然后完成相应运算,结果存入RLT单元。
DATAS  SEGMENT
	DATAX DB 9H
    DATAY DB 3H
    RLT DB ?
DATAS  ENDS
CODES  SEGMENT
      ASSUME CS:CODES,DS:DATAS
START:
	mov ax,DATAS
	mov ds,ax
	
	mov ah,1h
	int 21h ;进行中断输入
	
	CMP AL,'+'
	JZ JIAFA
	CMP AL,'-'
	JZ JIANFA
	CMP AL,'*'
	JZ CHENGFA
	
	MOV AL,DATAX
	CBW
	IDIV DATAY
	MOV WORD PTR RLT,AX;AX包含商和余数
	JMP EXIT
	
JIAFA:
	MOV AL,DATAX
	ADD AL,DATAY
	MOV RLT,AL
	JMP EXIT
JIANFA:
    MOV AL,DATAX
	SUB AL,DATAY
	MOV RLT,AL
	JMP EXIT
CHENGFA:
	MOV AL,DATAX
	IMUL  DATAY
	mov WORD PTR RLT,AX
EXIT:	
	MOV AH,4CH
	INT 21H 
CODES  ENDS
      END    START
  1. 加法调试


分析结果知:9+3的结果是12,换算成16进制也就是0CH
2. 减法调试

分析结果知:9-3的结果为6.
3. 乘法调试

分析结果:3*9=27,换算成16进制也就是1BH
4. 除法调试

分析可知:9除以3等于3.
总结:考虑到算法的鲁棒性,我认为应该判断输入除法符号,否则除了加减乘其他的都会被视为除法运算符号

DATAS  SEGMENT
	DATAX DB 9H
    DATAY DB 3H
    RLT DB ?
DATAS  ENDS
CODES  SEGMENT
      ASSUME CS:CODES,DS:DATAS
START:
	mov ax,DATAS
	mov ds,ax
	
	mov ah,1h
	int 21h ;进行中断输入
	
	CMP AL,'+'
	JZ JIAFA
	CMP AL,'-'
	JZ JIANFA
	CMP AL,'*'
	JZ CHENGFA
	CMP AL,'/'
	JZ CHUFA
	
	
JIAFA:
	MOV AL,DATAX
	ADD AL,DATAY
	MOV RLT,AL
	JMP EXIT
JIANFA:
    MOV AL,DATAX
	SUB AL,DATAY
	MOV RLT,AL
	JMP EXIT
CHENGFA:
	MOV AL,DATAX
	IMUL  DATAY
	MOV WORD PTR RLT,AX
	JMP EXIT
CHUFA:
	MOV AL,DATAX
	CBW
	IDIV DATAY
	MOV WORD PTR RLT,AX;AX包含商和余数
EXIT:	
	MOV AH,4CH
	INT 21H 
CODES  ENDS
      END    START
  1. 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。把源程序附在下面,并把debug单步调试的截图附在下面。
DATAS  SEGMENT
	DATAX DB ?
	DATAY DB ?
	DATAZ DB ?
DATAS  ENDS
STACKS SEGMENT STACK
DW 1024 DUP(?)
STACKS ENDS
CODES  SEGMENT
      ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
	mov ax,DATAS
	mov ds,ax
	
	mov ah,1h
	int 21h ;进行中断输入
    MOV DATAY,AL
    
    SUB AL,1
    MOV DATAX,AL
    
    ADD AL,2
    MOV DATAZ,AL
    
	MOV DL,0dh
	MOV AH,2
	INT 21H
	
	MOV DL,0ah
	MOV AH,2
	INT 21H
	
	MOV DL,DATAX
	MOV AH,2
	INT 21H
	
	MOV DL,' '
	MOV AH,2
	INT 21H
	
	MOV DL,DATAY
	MOV AH,2
	INT 21H
	
	MOV DL,' '
	MOV AH,2
	INT 21H
	
	MOV DL,DATAZ
	MOV AH,2
	INT 21H
	
	MOV DL,' '
	MOV AH,2
	INT 21H

	MOV AH,4CH
	INT 21H 
CODES  ENDS
      END    START

分析:可以发现调试结果datax,datay,dataz三个值分别是a,b,c的ascii码值。
三 实验报告
要求: 1.每步操作过程及所用指令;2.用截图方式反应指令执行前后的相关寄存器或存储单元内容的变化,并对所得结果进行分析。

posted @ 2022-05-21 17:27  TCcjx  阅读(434)  评论(0编辑  收藏  举报