实验6 键盘操作与显示
一、实验目的
熟悉指令系统,掌握常用指令的用法;通过实验加深对各种寻址方式的理解;能熟练使用DEBUG中的命令对指令进行反汇编,观察并了解机器代码。
二、实验题
- 把数据段中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取有效地址其实作用一样。
- 已知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
- 加法调试
分析结果知: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
- 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。把源程序附在下面,并把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.用截图方式反应指令执行前后的相关寄存器或存储单元内容的变化,并对所得结果进行分析。
本文来自博客园,作者:TCcjx,转载请注明原文链接:https://www.cnblogs.com/tccjx/p/16295556.html