一个简单的汇编程序:ascii码显示

我的代码如下: 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

温馨提示:答案为网友推荐,仅供参考
相似回答