汇编语言实验2数据转换实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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