输入四位十六进制数,显示对应的十进制数(还有位对应的值,以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 版权协议,转载请附上原文出处链接和本声明。