DATA SEGMENT
BUF1 DB 20
DB ?
DB 20 DUP(?)
BUF2 DB 20
DB ?
DB 20 DUP(?)
INPUT DB '记得带符号啊亲,Input:$'
OUTPUT DB 'Output:$'
CTRL DB 0DH,0AH,'$'
SHI DW 0AH ;不能是DB,用DW,要用字乘法
FUHAO DB ? ;保存符号
Iint DW 0
DATA ENDS
STACK SEGMENT
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
;输出提示符‘Input:’
LEA DX,INPUT
MOV AH,9
INT 21H
;输入数值
LEA DX,BUF1
MOV AH,10
INT 21H
;输出回车换行
LEA DX,CTRL
MOV AH,9
INT 21H
;把ASCII码化成十进制
MOV CL,BUF1+1 ;获取字符个数
LEA SI,BUF1+2 ;首地址
MOV AL,[SI]
MOV [FUHAO],AL
;转化好的存在Iint中
;因为MUL DL,所以单独处理第一个字符
INC SI ;从第一个非符号开始
DEC CL ;这一步别忘了啊
MOV BX,0
MOV Dl,[SI]
MOV DH,0
MOV AX,DX
SUB Al,30H
DEC CL
INC SI
NEXT:
;MOV DL,10 ;用这两行的话,如果是字乘法,那么结果存在DX,AX中,所以导致转化成的16进制为4位时,AX的高字节一部分在DL中,所以老是出错
;MUL 10
MUL [SHI]
ADD AH,DL
MOV DL,[SI]
MOV BL,DL
SUB BL,30H
ADD AX,BX
DEC CL
INC SI
CMP CL,0
JNE NEXT
MOV [Iint],AX
CMP [FUHAO],02BH ;符号为正
JE ZHENG
;符号位负
MOV BX,0FFFFH
SUB BX,[Iint]
ADD BX,01H
MOV [Iint],BX
ZHENG:
;把十进制转化为十六进制
MOV CL,0 ;记录有多少个数据入栈
MOV AX,[Iint]
MOV DX,0
TO:
MOV BX,16
DIV BX ;AX/(OPS)==>AL,AH
MOV BX,AX ;保存商,用于辗转相除
PUSH DX ;把余数入栈,所以要把商赋为0
INC CL
MOV AX,BX ;还原商,用于辗转相除
MOV DX,0 ;消除上次的余数
CMP AX,0
JNE TO
;处理位数
MOV BL,4
SUB BL,CL
MOV CL,BL
CMP CL,0
JBE AAAA ;小于等于0,则说明已经有4位了
BU0:
MOV AX,0H
PUSH AX
DEC CL
CMP CL,0
JNE BU0
AAAA:
;出栈
MOV SI,0
MOV CL,0
OUTSTACK:
POP AX
CMP AL,9 ;把16进制转化成ascii
JA DAYU9
ADD AL,30H
JMP XIAOYU9
DAYU9:
ADD AL,37H
XIAOYU9:
MOV [SI][BUF2],AL
INC SI
INC CL
CMP CL,4
JNE OUTSTACK
MOV [SI][BUF2],'H'
;输出提示提示符
LEA DX,OUTPUT
MOV AH,9
INT 21H
;输出数值
LEA SI,BUF2
MOV CL,5
PRINT:
MOV DX,[SI]
MOV AH,2
INT 21H
INC SI
DEC CL
JNZ PRINT
MOV AH,4CH
INT 21H
CODE ENDS
END START
BUF1 DB 20
DB ?
DB 20 DUP(?)
BUF2 DB 20
DB ?
DB 20 DUP(?)
INPUT DB '记得带符号啊亲,Input:$'
OUTPUT DB 'Output:$'
CTRL DB 0DH,0AH,'$'
SHI DW 0AH ;不能是DB,用DW,要用字乘法
FUHAO DB ? ;保存符号
Iint DW 0
DATA ENDS
STACK SEGMENT
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
;输出提示符‘Input:’
LEA DX,INPUT
MOV AH,9
INT 21H
;输入数值
LEA DX,BUF1
MOV AH,10
INT 21H
;输出回车换行
LEA DX,CTRL
MOV AH,9
INT 21H
;把ASCII码化成十进制
MOV CL,BUF1+1 ;获取字符个数
LEA SI,BUF1+2 ;首地址
MOV AL,[SI]
MOV [FUHAO],AL
;转化好的存在Iint中
;因为MUL DL,所以单独处理第一个字符
INC SI ;从第一个非符号开始
DEC CL ;这一步别忘了啊
MOV BX,0
MOV Dl,[SI]
MOV DH,0
MOV AX,DX
SUB Al,30H
DEC CL
INC SI
NEXT:
;MOV DL,10 ;用这两行的话,如果是字乘法,那么结果存在DX,AX中,所以导致转化成的16进制为4位时,AX的高字节一部分在DL中,所以老是出错
;MUL 10
MUL [SHI]
ADD AH,DL
MOV DL,[SI]
MOV BL,DL
SUB BL,30H
ADD AX,BX
DEC CL
INC SI
CMP CL,0
JNE NEXT
MOV [Iint],AX
CMP [FUHAO],02BH ;符号为正
JE ZHENG
;符号位负
MOV BX,0FFFFH
SUB BX,[Iint]
ADD BX,01H
MOV [Iint],BX
ZHENG:
;把十进制转化为十六进制
MOV CL,0 ;记录有多少个数据入栈
MOV AX,[Iint]
MOV DX,0
TO:
MOV BX,16
DIV BX ;AX/(OPS)==>AL,AH
MOV BX,AX ;保存商,用于辗转相除
PUSH DX ;把余数入栈,所以要把商赋为0
INC CL
MOV AX,BX ;还原商,用于辗转相除
MOV DX,0 ;消除上次的余数
CMP AX,0
JNE TO
;处理位数
MOV BL,4
SUB BL,CL
MOV CL,BL
CMP CL,0
JBE AAAA ;小于等于0,则说明已经有4位了
BU0:
MOV AX,0H
PUSH AX
DEC CL
CMP CL,0
JNE BU0
AAAA:
;出栈
MOV SI,0
MOV CL,0
OUTSTACK:
POP AX
CMP AL,9 ;把16进制转化成ascii
JA DAYU9
ADD AL,30H
JMP XIAOYU9
DAYU9:
ADD AL,37H
XIAOYU9:
MOV [SI][BUF2],AL
INC SI
INC CL
CMP CL,4
JNE OUTSTACK
MOV [SI][BUF2],'H'
;输出提示提示符
LEA DX,OUTPUT
MOV AH,9
INT 21H
;输出数值
LEA SI,BUF2
MOV CL,5
PRINT:
MOV DX,[SI]
MOV AH,2
INT 21H
INC SI
DEC CL
JNZ PRINT
MOV AH,4CH
INT 21H
CODE ENDS
END START