一、实验目的
1、8086指令:JG、SHR、MOV、OR、CMP、INC、LEA、INT、JNZ等。
2、用DOS功能调用1号功能多次进行键盘输入的方法
2、用DOS功能调用2号功能单字符或9号功能字符串显示的方法。
二、实验内容
1、编一个程序,要求把NUM单元存放的一个8位二进制数,在屏幕上显示成16进制数。
2、修改前述1的程序,使能从键盘输入8位二进制数,存入NUM单元,并在屏幕上显示对应的16进制数。
3、对有余力的同学进一步完成:编一个程序,要求把键盘输入的任意一个至多16位二进制数(以回车为输入结束),在屏幕上显示成对应的十六进制数。
实验结果:
对1:如NUM单元的内容为’01001011’,要求能显示“RESULT=4BH”。
对2:如键盘输入8位二进制数01001011(输入8位就自动停止),接着屏幕显示
“RESULT=4BH”。
对3:如键盘输入10110101110101(回车)
输出结果:RESULT=2D75H
三、调试及分析
关于给定的16位二进制数和给定的8位二进制数之间的区别,我写了2个程序。定义的时候,DB是8位,DW是16位。要存入的时候,用BX存入16位,用DL存入8位的。如果非要用BX存入8位的,则需要强制类型转换 WORD PTR。
程序的核心是把字符(输入的或者给定的)转换为数字。这在C++中做过,所以能知道减去48D(30H)就可以了。然后二进制与十六进制之间的转换是4位二进制数转换为一位十六进制的数。左移四位,就好了。8位数的时候,循环2次;16位的时候,循环4次。
键盘输入少于16位的二进制数时,是一位一位地输入的,每次输入一个新的数时,前面所得的结果左移一位,也就是乘以2。后面的输出与前面一样。
还有一个小问题,在输入输出的时候,输入一个多位二进制的时候,输出结果的位数如果比输入的位数少的话,会出现保留多余的输入。也就是输出是粘帖在输入上面的,没有覆盖的部分会依然在屏幕上。我试了许多次,以为是程序有错。后来试了加了在输出数据前输出回车,才解决问题。
四、总结
编程就是需要多练习。有很多小错误,花了很长时间才找出来。这是因为不熟悉这么语言的原因。
五、代码
代码1:
;把给定的8位2进制数转换为16进制输出
DATAS SEGMENT
NUM DB 01101011B
MESS DB 'RESULT=$'
STR2 DB 4 DUP(?)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV AH, 9
MOV DX, SEG MESS ; DS:DX=串地址,SEG mess是取mess段地址的运算
MOV MOV 移地址的运算
INT
MOV MOV LM:
MOV ROL DS, DX
DX, OFFSET MESS ; OFFSET mess是取mess偏21H
BL,NUM ;WORD PRT[NUM]
CH,2 ;循环次数
CL,4
BL,CL
MOV DL,BL
AND DL,0FH
ADD DL,30H
CMP JB ADD NEXT:
MOV INT DEC JNZ
MOV DL,3AH
DL,7
AH,2
21H
CH
LM
DL,'H'
NEXT
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
代码2:
;给定16位2进制数,输出16进制数
DATAS SEGMENT
NUM DW 0110110101001011B
MESS DB 'RESULT=$'
STR2 DB 4 DUP(?)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV MOV MOV MOV 是取mess段地址的运算
MOV MOV 移地址的运算
INT MOV AX,DATAS
DS,AX
AH, 9
DX, SEG MESS ; DS:DX=串地址,SEG mess DS, DX
DX, OFFSET MESS ; OFFSET mess是取mess偏21H
BX,NUM ;word ptr num
MOV CH,4 ;循环次数
LM:
MOV CL,4
ROL MOV AND ADD CMP JB ADD NEXT:
MOV INT BX,CL
DX,BX
DL,0FH
DL,30H
DL,3AH
DL,7
AH,2
21H
NEXT
DEC CH
JNZ LM
;MOV DX,OFFSET STR1
;MOV ;INT
MOV MOV INT MOV INT CODES ENDS
AH,9
21H
DL,'H'
AH,2
21H
AH,4CH
21H
END START
代码3:
;键盘输入不大于十六位的二进制数,输出十六进制数
DATAS SEGMENT
MESS DB 'RESULT=$'
STR2 DB 4 DUP(?)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV CH,4
XOR BX,BX ;BX清零
INPUT:
MOV INT CMP JE SUB CBW XCHG SHL XCHG ADD AH,1
21H AL,0DH AL,30H AX,BX
AX,1
AX,BX
BX,AX ;输入一个字符,存到AL
;判断是否是回车
;是回车输入就结束
;转为数字
;扩展为字
;左移一位以后,相加
NEXT JMP INPUT
NEXT:
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H ;输出换行,与输入分开
MOV AH, 9
MOV DX, SEG MESS
MOV DS, DX
MOV DX, OFFSET MESS
INT 21H ;输出\"RESULT=\"
NEXT1:
MOV ROL MOV AND ADD CMP JB ADD NEXT2:
MOV CL,4
BX,CL
DX,BX
DL,0FH
DL,30H
DL,3AH
DL,7
AH,2
NEXT2
INT 21H
DEC CH
JNZ NEXT1
MOV MOV INT
MOV INT CODES ENDS
END DL,'H'
AH,2
21H AH,4CH
21H
START
;最后输出个\"H\",表示是十六进制
因篇幅问题不能全部显示,请点此查看更多更全内容