汇编–子程序设计(1)–非压缩bcd码和十进制的转换

  • Post author:
  • Post category:其他


输入四位十六进制数,显示对应的十进制数(还有位对应的值,以T作为结束符).

;PROGRAM GOES HERE;13:34 2023/4/15-------17:38 2023/4/16----17:30 2023/4/17
;FOLLOWED BY DESCRIPTIVE PHRASES
;EQU STATEMENTS GO HERE 1.ds:bx指向数据区存放ascii码的首地址,ax存放转换后的二进制数,cf=1则不成功,cf=0则成功.
ST_SEG SEGMENT STACK  ;2.ax中存放要转换的十六进制数,ds:bx指向数据区中存放非压缩bcd码的末地址.        
DB 1000 DUP('STACK')    ;3.把非压缩的bcd十进制码显示出来.
ST_SEG ENDS
                  ;****************
DATAREA SEGMENT          ;DEFINE CODE SEGMENT
buffer1 db 100 dup('$') ;定义bcd存放的缓冲区
buffer db  5,100 dup(?)  ;定义输入数据区,能够输入四位十六进制数,存放ascii码,根据输入的原则,先存的是高位.
changeline db 13,10,'$'
ERROR DB 'PLEASE WRITE AGAIN!',10,13,'$'
DATAREA ENDS
                ;*****************
PROGRAM SEGMENT
               ;-------------------
MAIN PROC FAR          ;MAIN PART OF PROGRAM
               ASSUME CS:PROGRAM,DS:DATAREA,SS:ST_SEG
 
                   ;SAVE IT ON STACK,SAVE OLD DATA SEGMENT
START:
 MOV AX,DATAREA    ;SET DS REGISTER TO CURRENT DATA SEGMENT,DATEREA SEGMENT ADDR
 MOV DS,AX               ;INTO DS REGISTER
 ;MAIN PART OF PROGRAM GOES HERE
JMP S
RETS:LEA DX,ERROR
        MOV AH,09H
        INT 21H
S:MOV AH,0AH
LEA DX,BUFFER
INT 21H
LEA DX,BUFFER
INC DX
INC DX
MOV BX,DX
;--------------------CHANGE_LINE
MOV AH,09H
LEA DX,CHANGELINE
INT 21H
;------------------------
CALL ASC_BIN  ;数据存入ax中
JC   RETS   
MOV CL,4
ROR AX,CL
push ax
LEA BX,BUFFER1
CALL HEX_BCD       ;17:52 2023/4/16在这一行代码中出现了卡死的情况,忽略了跳出的情况(分支),Q的位置错误造成死循环.
LEA BX,BUFFER1
CALL DIS_DEC
LEA DX,BUFFER1
MOV AH,09H
INT 21H
lea dx,changeline
mov ah,09h
int 21h
;------------------倒序ax开始.
pop ax
mov bl,al
mov cl,4
rol bl,cl
mov bh,ah
rol bh,cl
mov al,bh
mov ah,bl
;-----------------倒序ax结束.
CMP AX,0EA60H
JB WAN5
CALL NSIX
SUB AX,0EA60H
JMP QIAN9
;-------------------
WAN5:CMP AX,0C350H
JB WAN4
CALL NFIVE
SUB AX,0C350H
JMP QIAN9
;-----------------
WAN4:CMP AX,9C40H
JB WAN3
CALL NFOUR
SUB AX,9C40H
JMP QIAN9
;------------------
WAN3:CMP AX,7530H
JB WAN2
CALL NTHREE
SUB AX,7530H
JMP QIAN9
;------------------
WAN2:CMP AX,4E20H
 JB WAN1
CALL NTWO
SUB AX,4E20H
JMP QIAN9
;--------------
WAN1:CMP AX,2710H
JB QIAN9
CALL NONE
SUB AX,2710H
;------------------------
QIAN9:CMP AX,2328H
JB QIAN8
CALL NNINE
SUB AX,2328H
JMP BAI9
;------------------------
QIAN8:CMP AX,1F40H
JB QIAN7
CALL NEIGHT
SUB AX,1F40H
JMP BAI9
;------------------------
QIAN7:CMP AX,1B58H
JB QIAN6

CALL NSEVEN

SUB AX,1B58H
JMP BAI9
;------------------------
QIAN6:CMP AX,1770H
JB QIAN5

CALL NSIX

SUB AX,1770H
JMP BAI9
;------------------------
QIAN5:CMP AX,1388H
JB QIAN4

CALL NFIVE

SUB AX,1388H
JMP BAI9
;------------------------
QIAN4:CMP AX,0FA0H
JB QIAN3

CALL NFOUR

SUB AX,0FA0H
JMP BAI9
;------------------------
QIAN3:CMP AX,0BB8H
JB QIAN2

CALL NTHREE

SUB AX,0BB8H
JMP BAI9
;------------------------
QIAN2:CMP AX,07D0H
JB QIAN1

CALL NTWO

SUB AX,07D0H
JMP BAI9
;------------------------
QIAN1:CMP AX,03E8H
JB QIAN0

CALL NONE

SUB AX,03E8H
JMP BAI9
;------------------------
QIAN0:

CALL NZERO

BAI9:CMP AX,384H
JB BAI8

CALL NNINE

SUB AX,384H
JMP SHI9
;------------------------!!!
BAI8:CMP AX,800
JB BAI7

CALL NEIGHT

SUB AX,800
JMP SHI9
;------------------------
BAI7:CMP AX,700
JB BAI6

CALL NSEVEN

SUB AX,700
JMP SHI9
;------------------------
BAI6:CMP AX,600
JB BAI5
CALL NSIX
SUB AX,600
JMP SHI9
;------------------------
BAI5:CMP AX,500
JB BAI4

CALL NFIVE

SUB AX,500
JMP SHI9
;------------------------?
BAI4:CMP AX,400
JB BAI3

CALL NFOUR

SUB AX,400
JMP SHI9
;------------------------
BAI3:CMP AX,300
JB BAI2

CALL NTHREE

SUB AX,300
JMP SHI9
;------------------------
BAI2:CMP AX,200
JB BAI1

CALL NTWO

SUB AX,200
JMP SHI9
;------------------------
BAI1:CMP AX,100
JB BAI0

CALL NONE

SUB AX,100
JMP SHI9
;---------------
BAI0:

CALL NZERO

;------------------------
SHI9:CMP AX,90
JB SHI8

CALL NNINE

SUB AX,90
JMP GE9
;------------------------
SHI8:CMP AX,80
JB SHI7

CALL NEIGHT

SUB AX,80
JMP GE9
;------------------------
SHI7:CMP AX,70
JB SHI6

CALL NSEVEN

SUB AX,70
JMP GE9
;------------------------
SHI6:CMP AX,60
JB SHI5

CALL NSIX

SUB AX,60
JMP GE9
;------------------------
SHI5:CMP AX,50
JB SHI4

CALL NFIVE

SUB AX,50
JMP GE9
;------------------------
SHI4:CMP AX,40
JB SHI3

CALL NFOUR

SUB AX,40
JMP GE9
;------------------------
SHI3:CMP AX,30
JB SHI2
CALL NTHREE
SUB AX,30
JMP GE9
;------------------------
SHI2:CMP AX,20
JB SHI1
CALL NTWO
SUB AX,20
JMP GE9
;------------------------
SHI1:CMP AX,10
JB SHI0
CALL NONE
SUB AX,10
JMP GE9
SHI0:

CALL NZERO

;-----------------
GE9:CMP AX,9
JB GE8

CALL NNINE

JMP EXIT
;-----------
GE8:CMP AX,8
JB GE7

CALL NEIGHT

JMP EXIT
;-------------
GE7:CMP AX,7
JB GE6

CALL NSEVEN

JMP EXIT
;--------------
GE6:CMP AX,6
JB GE5

CALL NSIX

JMP EXIT
;--------------
GE5:CMP AX,5
JB GE4

CALL NFIVE

JMP EXIT
;--------------
GE4:CMP AX,4
JB GE3

CALL NFOUR

JMP EXIT
;--------------
GE3:CMP AX,3
JB GE2

CALL NTHREE

JMP EXIT
;--------------
GE2:CMP AX,2
JB GE1

CALL NTWO

JMP EXIT
;--------------
GE1:CMP AX,1
JB GE0

CALL NONE

JMP EXIT
;--------------
GE0:
CALL NZERO

;----------------------------以下为结束部分
exit:
       MOV AH,4CH
       INT 21H
MAIN ENDP          
;----------------------------------START--------------------------------SUB_PROCEDURE                 
ASC_BIN PROC NEAR          ;1.ds:bx指向数据区存放ascii码的首地址,ax存放转换后的二进制数,cf=1则不成功,cf=0则成功.    
MOV AX,0
MOV CH,3;比较3次
ONCE_AGAIN:
MOV   DL,[BX]                             ;BX,BP,SI,DI,INDIRECT ADDRESSING
CMP DL,30H
JB JIESHU1
CMP DL,39H
JNA ACCESS1
CMP DL,41h
JB JIESHU   
CMP DL,46h
JNA ACCESS2; 大写A~F转到相应输出
CMP DL,61h
JB JIESHU; 小于a重写
CMP DL,66h
JNA ACCESS3;  小写a~f转到相应输出
jieshu1:JMP JIESHU;其余全部跳转重写
;--------------
ACCESS1:SUB DL,30h
              MOV AL,DL
              MOV CL,4
              ROR AX,CL
              JMP TWO
;-------------
ACCESS2:SUB Dl,37h
              MOV AL,DL
              MOV CL,4
              ROR AX,CL
              JMP TWO
;-------------
ACCESS3:SUB Dl,57h
              MOV AL,DL
              MOV CL,4
              ROR AX,CL
TWO:DEC CH
         INC BX
         CMP CH,0
         JNE ONCE_AGAIN
MOV DL,[BX];----------------
CMP DL,30H
JB JIESHU
CMP DL,39H
JNA ACCESS_1
CMP DL,41h
JB JIESHU   
CMP DL,46h
JNA ACCESS_2; 大写A~F转到相应输出
CMP DL,61h
JB JIESHU; 小于a重写
CMP DL,66h
JNA ACCESS_3;  小写a~f转到相应输出
JMP JIESHU;其余全部跳转重写
;--------------
ACCESS_1:SUB DL,30h
              add AL,DL
              JMP TW
;-------------
ACCESS_2:SUB Dl,37h
              add AL,DL
              JMP TW
;-------------
ACCESS_3:SUB Dl,57h
              add al,dl
              jmp tw
;----------------------------------------
tw:     CLC
         RET
         JIESHU: STC
         RETURN:  RET                   
ASC_BIN ENDP         
 ;-------------------第一部分完成.
HEX_BCD PROC NEAR                    ;ax中存放要转换的十六进制数,ds:bx指向数据区中存放非压缩bcd码的末地址. 
MOV CH,4
Q:PUSH AX
   AND AL,0FH
   CMP AL,0ah
   JB SMALL
   JMP BIG
SMALL:MOV [BX],AL
              JMP NEXT
BIG:SUB AL,0AH
      MOV DL,AL
      MOV AL,01H
      MOV [BX],AL
      INC BX
      MOV [BX],DL
NEXT:POP AX
         DEC CH
         INC BX
         MOV CL,4
         ROR AX,CL
         CMP CH,0
         JNE   Q
RETURN_1:RET                  
HEX_BCD ENDP       
;----------------------------------------------------------------------
DIS_DEC PROC NEAR
MOV CX,8
loop1:
    MOV DL,30H     
    ADD [BX],DL
    INC BX 
   loop loop1   
RET                    
DIS_DEC ENDP           
;-------------------
NZERO PROC NEAR
PUSH AX
MOV DL,30H
MOV AH,02H
INT 21H
POP AX
RET
NZERO ENDP
;----------------------------
NONE PROC NEAR
PUSH AX
MOV DL,31H
MOV AH,02H
INT 21H
POP AX
RET
NONE ENDP
;----------------------------
NTWO PROC NEAR
PUSH AX
MOV DL,32H
MOV AH,02H
INT 21H
POP AX
RET
NTWO ENDP
;----------------------------
NTHREE PROC NEAR
PUSH AX
MOV DL,33H
MOV AH,02H
INT 21H
POP AX
RET
NTHREE ENDP
;----------------------------
NFOUR PROC NEAR
PUSH AX
MOV DL,34H
MOV AH,02H
INT 21H
POP AX
RET
NFOUR ENDP
;----------------------------
NFIVE PROC NEAR
PUSH AX
MOV DL,35H
MOV AH,02H
INT 21H
POP AX
RET
NFIVE ENDP
;----------------------------
NSIX PROC NEAR
PUSH AX
MOV DL,36H
MOV AH,02H
INT 21H
POP AX
RET
NSIX ENDP
;----------------------------
NSEVEN PROC NEAR
PUSH AX
MOV DL,37H
MOV AH,02H
INT 21H
POP AX
RET
NSEVEN ENDP
;----------------------------
NEIGHT PROC NEAR
PUSH AX
MOV DL,38H
MOV AH,02H
INT 21H
POP AX
RET
NEIGHT ENDP
;----------------------------
NNINE PROC NEAR
PUSH AX
MOV DL,39H
MOV AH,02H
INT 21H
POP AX
RET
NNINE ENDP
;----------------------------
PROGRAM ENDS ;代码段结束               
END START    

结论:1ret.

2.push pop.

3.正序和倒序.



版权声明:本文为quaer原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。