汇编语言实验2数据转换实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序如下所示:

DATA SEGMENT

BUF DB 5 DUP(?) ;预留5单元空间

D0 DW 2A5H

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DA TA

MOV DS,AX

MOV DI,OFFSET D0 ;将DI指向BUF的下一单元

MOV AX,D0 ;取要用来变十进制数的数到AX

MOV BX,10 ;准备除以10

MOV CX,0 ;准备统计余数的个数

CHANGE10: DEC DI ;准备存放余数,往前倒存

INC CX

MOV DX,0 ;将除数的高16位(在DX中)清0,DX也将用来存放余数

DIV BX ;DX,AX除以BX (BX=10)

ADD DL,30H ;余数变为ASCII码值

MOV BYTE PTR[DI],DL ;存储十进制数

CMP AX,0 ;是否为0?

JNZ CHANGE10 ;不为0转CHANGE10 CHANGE11: MOV DL,BYTE PTR[DI] ;取出存放在BUF中的十进制数到DL供显示

MOV AH,2 ;显示1个字符

INT 21H

INC DI

LOOP CHANGE11

MOV AH,4CH ;程序结束并返回DOS

INT 21H

CODE ENDS

END START

(1)请改变第三行的3A5H改变为4A3FH、0ABH、0A37BH后分别说明运行结果,并做解释。

不做修改

改3A5H为4A3FH

改3A5H为0ABH

改3A5H为0A37BH

(2)分析其中INC与DEC语句的作用是什么,用”;”号屏蔽这二句后运行结果又是什么?请解释。

(3)将MOV BX,10 ;准备除以10 中的10改为8,结果如何?意义是什么?

4A3FH

0A37BH

(4)如果改为16,结果如何,试分析为什么是这样的结果?

0A37BH

0ABH

4A3FH

2.ASCII码表示的十进制数转换为二进制数并显示

将SI指向的缓冲区BUF中保存的五位ASCII码十进制数(0-65535)转换成对应的二进制数并存放在DX中,再以二进制形式显示。

DA TA SEGMENT

BUF DB '25092'

C DB 'B',0DH,0AH,'$'

DA TA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DA TA

START: MOV AX,DATA

MOV DS,AX

MOV SI,OFFSET BUF ;将BUF的地址放到SI中

MOV DX,0 ;清DX为0;

MOV CX,5 ;置循环次数为5

MOV BX,10

GET_ASC: MOV AL,[SI] ;取出一个字符

CMP AL,'0' ;必须保证5个数都是十进制数(0-9)

JB EXIT

CMP AL,'9'

JA EXIT ;判断是否是“0”-“9”

DEC_BIN: SUB AL,30H ;减30H变二进制数

MOV AH,0

PUSH AX ;转换为对应的数并置于AX中,转存堆栈

MOV AX,DX

MUL BX ;AX内容乘10

MOV DX,AX

POP AX

ADD DX,AX ;(DX)←(DX) * 10 + (AX)

INC SI ;使指针SI指向下一个字符

DEC CX

JNZ GET_ASC

MOV BX,DX ;取要显示的字符到BL中

MOV CL,16 ;移16次,最大数64000

NEXT: MOV DX,0

SAL BX,1

RCL DX,1

ADD DX,30H

MOV AH,2

INT 21H

DEC CL

JNE NEXT

LEA DX,C ;取C的地址,以便显示单位B与回车换行

MOV AH,9

INT 21H

EXIT: MOV AH,4CH

INT 21H

CODE ENDS

END START

(1)与上次实验中用二进制数显示一个字符的ASCII码程序的代码进行比较,那些地方是一致的?

(2)将第二行的’25092’改为以下5个数:32H,35H,30H,39H,32H后(BUF DB '25092'改为:BUF DB 32H,35H,30H,39H,32H )说明运行结果,并做解释。

(3)为什么要使用堆栈,如果不使用会出现什么结果?

3.二进制数到十六进制数的转换

二进制整数转换为ASCII码十六进制数的基数为16,显示时注意从9到A,ASCII码跳了7!其他类似于例4.8。其程序代码如下:

DATA SEGMENT

BUF DB 5 DUP(?) ;预留5单元空间

D0 DW 1000100110100011B

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV DI,OFFSET D0 ;将DI指向BUF的下一单元

MOV CX,0

MOV AX,D0 ;取要用来变十六进制数的数到AX

MOV BX,16 ;准备除以16

CBUF10: DEC DI ;准备存放余数,往前倒存

INC CX

MOV DX,0;将除数的高16位(在DX中)清0,DX也将用来存放余数 DIV BX ;DX,AX除以BX (BX=16)

ADD DL,30H ;余数变为ASCII码值

MOV BYTE PTR[DI],DL ;存储十六进制数

CMP AX,0 ;是否为0?

JNZ CBUF10 ;不为0转CBUF10

CHANGE11: MOV DL,BYTE PTR[DI];取出存放在BUF中的十六进制数到DL供显示

CMP DL,3AH ;是否小于10?

JB CHANGE12 ;如果小于10转显示

ADD DL,7 ;否则为A到F之间数,加7

CHANGE12: MOV AH,2 ;显示1个字符

INT 21H

INC DI

LOOP CHANGE11

MOV AH,4CH ;程序结束并返回DOS

INT 21H

CODE ENDS

END START

(1)请改变第三行的数改变为0A3B9H、2374、35DH后分别说明运行结果,并做解释。

改为0A3B9H

改为2374

改为35DH

相关文档
最新文档