您的位置:首页 > 其它

输入一个带符号的十进制数字串,以四位十六进制的形式输出该串对应的值

2012-04-09 20:43 651 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐