一、实验名称:实验6 输入一个16进制数,把它转换为10进制数输出
- 实验目的:
培养汇编中设计子程序的能力
- 实验过程:
源代码:
data segment
buff1 db 'Please input a number(H):$'
buff2 db 30,?,30 dup(?),13,10
buff3 db 'The consequent is:$'
data ends
code segment
assume cs:code,ds:data
main proc far
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
call tips1 ;调用第一个字符串,提示用户输入
call input1 ;调用程序,将数字输入进缓冲区保存
call get4h ;将缓冲区的ASCII码转换成实际的二进制
xor ax,ax
mov al,byte ptr[buff2+1] ;di用来计数(处理4位的十六进制)
mov di,ax
lea si,buff2+2
mov bx,0;
mov bp,1000h ;dx位权
call function
call tips2 ;调用第三个字符串,显示结果
call btod ;将缓冲区的二进制转换成10进制ASCII码输出
mov ah,4ch
int 21h
ret
main endp
tips1 proc near
mov dx,offset buff1
mov ah,9
int 21h
ret
tips1 endp
tips2 proc near
mov dx,offset buff3
mov ah,9
int 21h
ret
tips2 endp
input1 proc near
lea dx,buff2
mov ah,0ah
int 21h
mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
ret
input1 endp
get4h proc near
lea si,buff2+2 ;将第二个字符串的首地址给si寄存器保存
mov bx,0 ;用bx当作计数器和相对偏移量
input:
mov al,byte ptr[si+bx]
cmp al,30h
jl exit
cmp al,39h
jle dig ;>='0'&&<='9'
cmp al,41h ;<'A',exit 判断输入的合法性
jl exit
cmp al,46h ;>='A'&&<='F' 如果是0~9,就进入dig,如果是A~F就进入hex
jle hex
cmp al,61h
jl exit
cmp al,66h
jle shex ;如果是在a~f之间
jmp exit
dig:
sub al,30h
mov byte ptr[si+bx],al ;原来的缓冲区位置存放输入的真实数值
jmp exit
hex:
sub al,37h
mov byte ptr[si+bx],al ;原来的缓冲区位置存放输入的真实数值
jmp exit
shex:
sub al,57h
mov byte ptr[si+bx],al ;原来的缓冲区位置存放输入的真实数值
jmp exit
exit:
inc bl
mov dl,buff2+1
cmp bl,dl ;计数功能
jz return
jmp input
return:ret
get4h endp
function proc near
lea si,buff2+2 ;用si寄存器保存第二个字符串的首地址
mov bx,0
mov bp,1000h
xor ax,ax
start0:
mov al,byte ptr[si] ;内层循环,用cx计数
start1:
mul bp ;存在(DX,AX)
mov cx,4
ror bp,cl ;得到新的位权
dec di
add bx,ax
xor ax,ax ;清零
inc si ;下一个字符
cmp di,0 ;结束
je exit1
jmp start0
exit1:ret
function endp
btod proc near
mov ax, bx ;把bp寄存器的值给ax
mov cx, 1 ;计数器
mov bx, 10 ;10作除数
xor dx,dx
div1:
idiv bx
push dx ;保存ax/10后的结果,ah存放余数,al存放商
cmp ax, 0 ;商为0则开始输出
jz output
mov dx, 0 ;置余数为0,继续除
inc cx
jmp div1
output:
pop dx
add dl, 30h
mov ah, 2
int 21h
loop output
ret
btod endp
code ends
end main
实验运行结果:
- 实验小结:
本次实验,一开始我理解题意错误,以为是分开输出对应的BCD码,这提醒我们看清题意很重要。
在本次代码中,首先我们做一个输入提示:
然后我们把缓冲区输入的所有数,进行真实数值处理
假如我们输入的是1011,那么现在在缓冲区存放的就不是31,30,31,31了,而是01,00,01,01,这一步操作方便我们接下来输出成10进制。
这一步是将二进制数全部乘以它对应的位权,得到实际的十进制数值,方法就是,向左移动寄存器,将其乘以对应位权后保存下来。
这一步就是,我们把最后的数分别输出,方法就是除以10得到余数,然后把余数压栈最后输出。
这是本学期最后一次汇编实验课,但是整体感觉自己的汇编编程能力,还有很多不足,平时还是应该要多上机实验。