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

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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值