汇编语言:键盘输入一个十进制数,分别转换成十六进制数、BCD码,并显示对应结果

键盘输入任意位十进制数,分别转换成十六进制数、BCD码,并显示对应结果

输出如下
汇编语言:键盘输入一个十进制数,分别转换成十六进制数、BCD码,并显示对应结果_第1张图片

代码如下:

STACK1  SEGMENT STACK
         DW 256 DUP(?)
STACK1  ENDS

DDATA	SEGMENT
MES1	DB	0ah,0dh,'The BCD code of decimal are:$'
two     db  2;定义two=2
ten     dw 10;
sixt    dw 16;
BUF	    db  10
        DB	?
	    DB	10 DUP(?)
emt  dw ?
emp   db 4 dup(?);在这里倒腾那单位的bcd码,
;1在这里面就是1000,也就是31h,30h,30h,30h这四个ascll码,再给它倒着输出来
sixteen db 8 dup(?)
shu db ?
MES2	DB	0ah,0dh,'The 16 code of decimal are:$'
DDATA	ENDS

CODE SEGMENT
	ASSUME CS:CODE,DS:DDATA,ss:stack1
START: MOV	AX,DDATA
	   MOV	DS,AX
	   MOV	AX,stack1
	   MOV	ss,Ax

	   mov dx,offset buf
       mov ah,10
       int 21h; 输入任意位的十进制数,保存到buf中,
       ;可以查一查中断10  的用法,从第三个字节开始记入输入的数
       
 
 
 ;;;;; -------------------	   ; bcd码这一部分     
       MOV	DX,OFFSET MES1
	   MOV	AH,09H
	   INT 	21H
       
	   mov si,offset buf
       inc si
       mov cl,[si]; buf里面第二个数为实际键入的个数,把它给cl控制循环
       inc si;指针移动到第三个内存空间,这里面之后是存的数,
       ;输入12,这个内存里面依次就是31h.32h,cl这时等于2,
      
a1:    
       push cx; 保护cx
       CALL show1;把之前的31h给到那个子例程中,
       ;子例程会求出31h的bcd 并显示。第二次循环开始对32h进行操作
       pop cx
	   MOV	DL,20H;输出空格
	   MOV	AH,02H
	   INT	21H
	   INC	SI	
	   LOOP	A1
 ;;;;; -------------------	
	   
	   

;;;;;-----------------以下是十六进制的这一部分
	   
   
       mov si,offset buf
       inc si
       mov ch,0
       mov cl,ds:[si]
       inc si
       mov bx,0
       
a2:    mov ah,0
       mov al,ds:[si]
       sub al,30h
       mov emt,ax
       mov ax,bx
       mul ten
       mov bx,ax
       add bx,emt
       inc si
       loop a2
       
       MOV	DX,OFFSET MES2
	   MOV	AH,09H
	   INT 	21H
       call show0
;;;;;-----------------   
	   

WAIT1: MOV AH,1                   ;判断是否有按键按下
       INT 16H
       JZ  WAIT1                  ;无按键则跳回继续等待,有则退出

	   MOV	AX,4C00H
	   INT	21H
	   

show0 proc  ; 展示十六进制
      mov di,offset sixteen
      mov cx,bx
      
  w:  mov dx,0
      mov ax,cx
      div sixt
      cmp dl,09h
      jna w3
      add dl,07h
  w3: add dl,30h
      mov ds:[di],dl
      inc di
      mov cx,ax
      cmp cx,0
      jnz w
      
      dec di
      
  w2 : mov dl,ds:[di]
       mov ah,2
       int 21h
       dec di
       cmp di,0036h
       jnb w2
     ret
     show0 endp
     
     
show1 proc; 展示二进制的bcd,输入一个数的ascll码,30~39h,输出bcd码
      MOV AL,DS:[SI];
      mov shu,al; 保护al,
      sub al,30h
      mov di,offset emp
      mov cx,4; 循环四次,除以四次2
      
  d1: mov ah,0
      mov al,shu
      div  two; 余数在ah,商在al
      mov shu,al
      add ah,30h
      mov ds:[di],ah; 余数加30h放到emp里面
      inc di
      loop d1
      
      mov cx,4; 单个数的bcd码就是四位
      
  d2: dec di   ; 倒着把emp里面的数输出
      mov dl,ds:[di] 
      MOV AH,02H
	  INT 21H
	  loop d2
	  
	  ret 
	  show1 endp

CODE ENDS
       END START

你可能感兴趣的:(汇编语言,数码转换,栈)