您的位置:首页 > 其它

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

2012-04-09 19:47 405 查看
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,要用字乘法

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 ;首地址

;转化好的存在Iint中

;因为MUL DL,所以单独处理第一个字符

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位时,高字节存

;MUL 10 ;在DX中,所以老是出错

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

;把十进制转化为十六进制

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

由于MUL这个地方没注意,搞得好纠结,故贴上其解释,前车之鉴啊

MUL 无符号数乘法指令

格式:MUL SRC

执行的操作:

字节操作数:(AX)←(AX)*(SRC)

字操作数:(DX,AX)←(AX)*(SRC)

·IMUL 带符号数乘法指令

格式:IMUL SRC

执行的操作:与MUL相同,担必须是带符号数,而MUL是无符号数。

在乘法指令里,目的操作数必须是累加器,字运算为AX,字节运算为AL。两个8位数相乘得到的是16们乘积存放在AX中,两个16位数相乘得到的是32位乘积,存放在DX,AX中,其中DX存放高位字,AX存放低位字。指令中的源操作数可以使用除立即数方式以外的任一种寻址方式。

MUL指令和IMUL指令的使用条件是由数的格式决定的。很明显(11111111b)*(11111111b)当把它看作无符号数时应为255d×255d=65025d,而把它看作带符号数时则为(-1)×(-1)=1。因此必须根据所要相乘的格式来决定选用哪一种指令。

乘法指令对除CF和OF以外的条件码位无定义(注意:无定义的意义和不影响不同,无定义是指指令执行后这些条件码位的状态不定,而不影响则是指该指令的结果并不影响条件码,因而条件码应保持原状态不变。),对于MUL指令,如果乘积的高一半为0,即字节操作的(AH)或字操作的(DX)为0,则CF和OF均为1。这样的条件码设置可以用来检查字节相乘的结果是字节还是字,或者可以检查字相乘的结果是字还是双字。对于IMUL指令,如果乘积的高一半是低一半的符号扩展则CF和OF均为0,否则就均为1。

例:

如(AL)=0B4H,(BL)=11H求执行指令IMUL BL和MUL BL后的乘积值。

(AL)=0B4H为无符号数的180D,带符号数的-76D,

(BL)=11H为无符号数的17D,带符号数的17D,

执行IMUL BL的结果为:

(AX)=0FAF4H=-1292D

CF=0F=1


执行MUL的结果为:

(AX)=0BF4H=3060D

CF=0F=1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐