我的代码如下: STACKS SEGMENT STACK
DB 512 DUP(?)
STACKS ENDS
DATA SEGMENT
N DB ?
S1 DB 'input num',0DH,0AH,'$'
S2 DB 0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,SS:STACKS
PRINTF PROC ;显示子程序
MOV DL,':'
MOV AH,2
INT 21H
SHR AL,4
CALL P1
MOV AL,N
AND AL,0FH
CALL P1
MOV DL,'H'
INT 21H
MOV DL,20H
INT 21H
MOV AL,N
MOV CX,8
P: MOV DL,31H
SAL AL,1
JC A
MOV DL,30H
A: INT 21H
LOOP P
RET
PRINTF ENDP
P1 PROC ;判断字母还是数字,并显示,服务于上个子程序
ADD AL,30H
CMP AL,39H
JBE NEXT
ADD AL,7H
NEXT: MOV DL,AL
INT 21H
RET
P1 ENDP
START:
MOV AX,DATA
MOV DS,AX
MOV SS,AX
MOV AH,9
MOV DX,OFFSET S1
INT 21H
MOV AH,1
INT 21H
CMP AL,0DH
JZ DONE
MOV N,AL
CALL PRINTF
MOV DX,OFFSET S2
MOV AH,9
INT 21H
JMP START
DONE: MOV AX,4C00H
INT 21H
CODE ENDS
END START
显示格式如下,如:B:42H 01000010
但是我试了我的程序,16进制的高位总是显示3,且输出二进制时全为0,
本人已走投无路了,特请哪位好心大虾帮忙解决。由于财富已用完,故只能心意到了
STACKS SEGMENT STACK
DB 512 DUP(?)
STACKS ENDS
DATA SEGMENT
N DB ?
S1 DB 'input num',0DH,0AH,'$'
S2 DB 0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,SS:STACKS
PRINTF PROC ;显示子程序
MOV DL,':'
MOV AH,2
INT 21H;;;;;这个int 21h调用后,ax的值是有可能会变改的,
;你这个程序al的值改变了,高4位变成3,故你这个程序老是输出3.如图所示
;注意看AX的值在int 21h执行前后的变化
mov CL,4
MOV AL,N ;;;;;;;不加这句al的值并不是原来你从键盘得到的值
SHR AL,CL
CALL P1 ;显示16进制高4位
MOV AL,N
AND AL,0FH
CALL P1;;显示低4位
MOV DL,'H'
INT 21H
MOV DL,20H;;空格的ASCII码
INT 21H
MOV AL,N
MOV CX,8
P: MOV DL,31H
SAR AL,1
push ax;int 21h调用后,ax的值是有可能会变改的,故先把ax给保存起来
JC A
MOV DL,30H
A: INT 21H;
pop ax;
LOOP P
RET
PRINTF ENDP
P1 PROC ;判断字母还是数字,并显示,服务于上个子程序
;ADD AL,30H
;CMP AL,39H
;JBE NEXT
;ADD AL,7H
;NEXT: MOV DL,AL
cmp al, 9
JBE below_10
add al, 87; a代表10,而a的ASCII值是97,97-10=87
jmp show_hex
below_10: add al, 30h;0~9转成ASCII
show_hex: mov dl,al
INT 21H
RET
P1 ENDP
START:
MOV AX,DATA
MOV DS,AX
mov ax, STACKS;;;;;;;
MOV SS,AX
MOV AH,9
MOV DX,OFFSET S1
INT 21H
MOV AH,1
INT 21H
CMP AL,0dH ;al为输入字符的ASCII,如果按下回车直接退出
JZ DONE
MOV N,AL
CALL PRINTF
MOV DX,OFFSET S2
MOV AH,9
INT 21H
JMP START
DONE: MOV AX,4C00H
INT 21H
CODE ENDS
END START