您的当前位置:首页正文

汇编十六进制输出

2024-09-02 来源:布克知识网
用十六进制数形式显示

一、实验目的

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\",表示是十六进制

因篇幅问题不能全部显示,请点此查看更多更全内容