环境:MASM 2012.5
主要思路:将输入字符串转为单独的数值,通过循环累加得到字符串代表的值,随后通过移位和与运算得到每一位单独的16进制数并输出。
DATAS SEGMENT
buf dw 6
dw ?
dw 6 dup(?)
mulnum dw 10000,1000,100,10,1
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea dx,buf
mov ah,0AH
int 21H
lea si,buf+1
mov cx,[si]
mov ch,0
lea si,buf+2
change_num: ;将字符转为数字
mov ax,[si]
sub ax,30H
mov [si],ax
inc si
loop change_num
lea si,buf+1
mov cx,[si] ;计数器重置
mov ch,0
lea si,buf+2 ;si指向字符串
lea di,mulnum ;因输入位数不同对di进行操作
add di,10
mov al,cl
mov bl,2
mul bl
sub di,ax ;使di指向相应位数对应的位置
mov bx,0 ;bx置零用于存累加结果
mov ax,0
multi_num: ;乘法得到字符串代表的值
push bx
mov ax,[si]
mov ah,0
mov dx,0
mov bx,[di]
mul bx ;乘法结果存到dx中
pop bx
add bx,ax ;将乘法结果累加到bx中
add si,1
add di,2
loop multi_num
shuchu:
;输出回车换行
mov dl,0DH
mov ah,02H
int 21H
mov dl,0AH
mov ah,02H
int 21H
;输出第1个数字
mov cx,4
mov ch,0
mov dh,bh
shr dh,cl ;得到高8位中的高位
and dh,0FH
cmp dh,09H
jbe shuzi1
ja zimu1
shuzi1:
add dh,30H
jmp shuchu1
zimu1:
add dh,37H
jmp shuchu1
shuchu1:
mov dl,dh
mov ah,02H ;输出高8位中的高位
int 21H
;输出第2个数字
mov dh,bh
and dh,0FH ;得到高8位中的低位
cmp dh,09H
jbe shuzi2
ja zimu2
shuzi2:
add dh,30H
jmp shuchu2
zimu2:
add dh,37H
jmp shuchu2
shuchu2:
mov dl,dh
mov ah,02H ;输出高8位中的低位
int 21H
;输出第3个数字
mov dl,bl
shr dl,cl ;得到低8位中的高位
and dl,0FH
cmp dl,09H
jbe shuzi3
ja zimu3
shuzi3:
add dl,30H
jmp shuchu3
zimu3:
add dl,37H
jmp shuchu3
shuchu3:
mov ah,02H ;输出低8位中的高位
int 21H
;输出第4个数字
mov dl,bl
and dl,0FH ;得到低8位中的低位
cmp dl,09H
jbe shuzi4
ja zimu4
shuzi4:
add dl,30H
jmp shuchu4
zimu4:
add dl,37H
jmp shuchu4
shuchu4:
mov ah,02H ;输出低8位中的低位
int 21H
mov dl,48H
mov ah,02H
int 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START