实验一:
实验内容:输入一个十进制数把它转换为二进制数并且输出在控制台中
实验要点:(1)利用乘法(2)从高位开始处理
实验思路:(1)通过调用10号功能调用,将键入的十进制数存入定义的缓冲区IBUF中
(2)缓冲区IBUF由三部分组成,第一个字节空间是分配的缓冲区字节数,第二个字节
空间是实际使用的字节数,后面的空间则是数据内容。
IBUF DB 6,0,6,DUP(0)
6是分配字节数(1B),0是实际使用空间的字节数(1B,键入数值后会自动更改),6是分配字节空间(6B)
所以这个缓冲区能够容纳6个字节,且整个缓冲区占用8个字节的内存空间
(3)十进制数在IBUF中是以ASCII码存在,且用十六进制表示。
譬如输入61(十进制)在内存中占用两个字节空间表示为3631H,
因此我们要一个字节一个字节处理,即处理6然后处理1
(4)用指针SI指向IBUF+2(数据空间第一个字节)将其与0FH与屏蔽字节高四位,
使得36H变为06H将其变为实际的二进制数
(5)然后再处理下一个字节数(61中的1),依然按照上面的处理方法循环,
在循环体开始前要将前面处理的数乘以10(就相当于6*10),
处理完1后加上则表示6*10+1
实验代码:
.model samll
.stack
.data
INF1 db "Please input a number(0-65535):$"
IBUF db 6
db 0
db 6 dup(0)
.code
START: MOV ax,@data
MOV ds,ax
;输出字符串INF1
MOV dx,offset INF1
MOV ah,9
INT 21h
;向缓冲区IBUF中输入字符串
MOV dx,offset IBUF
MOV ah,10
INT 21h
;指定循环次数
MOV cl,IBUF+1 ;传值
MOV ch,0
;SI指向第一个字符
MOV si,offset IBUF+2 ;传址
MOV ax,0 ;用于记录二进制结果值
AGAIN: MOV dx,10
MUL dx ;将上个结果扩大10倍
;处理输入字符将其转化为二进制并且加入ax中
AND byte ptr [si],0fh
ADD al,[si]
ADC ah,0 ;al进位加入ah
INC si
LOOP AGAIN
;显示ax中的二进制数
MOV cx,16
MOV bx,ax
MOV dl,0dh
MOV ah,2
INT 21h
MOV dl,0ah
MOV ah,2
INT 21h
OUTPUT:MOV dl,0
SHL bx,1
ADC dl,30h
MOV ah,2
INT 21h
LOOP OUTPUT
MOV ah,4ch
INT 21h
END START
实验结果:
实验二:
实验内容:内存中有一个二进制数,将其转换为十进制并输出在显示台上
实验要点:(1)利用除法(2)从低位开始处理
实验思路:(1)输出的数存在内存中,其变量名为NUMBER
(2)定义一个缓冲区OBUF用于输出十进制数,bx指向其末端即数据区尾部,
因为处理是是从低位处理,则先存的数是低位的十六进制。
(3)将NUMBER放入al中,除以10得到余数(除法余数在dx中,商在ax中)
将余数dx加上30h即可得到低位的ASCII码存在[bx]中
(4)bx指针向前移动一个字节继续处理更高位直到所有位处理完
(5)最后调用10号功能调用输出缓冲区OBUF中的数即可实现
实验代码:
.model small
.stack
.data
NUMBER DW 65535
OBUF DB 6 dup(0) ;用于存储要输出的十进制字符
.code
START:MOV ax,offset @data
MOV ds,ax
MOV ax,NUMBER ;ax存储将要显示的二进制数据
MOV bx,offset OBUF+5 ;将bx作为指针指向缓冲区尾部用于存放地位
MOV byte ptr [bx],'$' ;用于结束十进制字符
MOV cx,10 ;做除10运算
LOOP1:MOV dx,0 ;被除数高位置0
DIV cx ;相当于ax除以10
ADD dl,30h ;dx中存储是余数(地位),形成余数对应的ASCII码
DEC bx ;指针移动存储这位十进制字符数据
MOV [bx],dl
OR ax,ax ;判断ax是否为0,商是否为0就可以知道是否已经处理完数据
JNZ LOOP1
;输出字符串,调用十号功能调用
MOV dx,bx ;dx指向数据最高位
MOV ah,9
INT 21h
MOV ah,4ch
INT 21h
END START
实验结果: