汇编语言中如何打印Push/Pop操作后的16位寄存器AX的值?
如何在DOS汇编中打印16位寄存器AX的数值
你目前掌握的INT 21H 02H功能只能输出单个ASCII字符,但AX中的数值是二进制/十进制整数,必须先转换成对应的ASCII字符序列才能打印。以你的例子AX=60为例,需要把60拆成'6'和'0'两个ASCII字符,再分别输出。
方法1:针对AX=60的简易打印(两位数场景)
直接分解十位和个位,转成ASCII后逐个输出:
MOV AX, 60 ; 你的AX当前值为60 MOV BX, AX ; 保存AX的值,避免后续操作覆盖 ; 分解十位:60 ÷ 10 = 6(商),余数0 MOV AX, BX MOV CX, 10 XOR DX, DX ; 16位除法需要DX清零,被除数为DX:AX DIV CX ; AX=6(十位),DX=0(个位) ; 打印十位数字'6' MOV DL, AL ADD DL, '0' ; 数字0-9转ASCII,等价于ADD DL, 30H MOV AH, 02H INT 21H ; 打印个位数字'0' MOV DL, DL ; DX中是余数0,直接取DL ADD DL, '0' MOV AH, 02H INT 21H
方法2:通用十进制打印函数(支持1-5位16位数值,最大65535)
如果需要打印任意16位十进制数,可以写一个循环分解每一位,用栈反转数字顺序(除法得到的是低位到高位,栈可实现高位到低位打印):
; 函数:打印AX中的十进制数值,依赖INT 21H 02H功能 PRINT_AX_DEC: PUSH AX ; 保存用到的寄存器 PUSH BX PUSH CX PUSH DX MOV CX, 0 ; 记录数字位数 MOV BX, 10 ; 除数为10,用于分解十进制位 PRINT_LOOP: XOR DX, DX DIV BX ; AX=商,DX=当前位的数字(余数) PUSH DX ; 余数压栈,后续弹出时顺序反转 INC CX CMP AX, 0 ; 商为0时停止分解 JNE PRINT_LOOP PRINT_DIGITS: POP DX ; 从栈中弹出数字(从高位到低位) ADD DL, '0' MOV AH, 02H INT 21H LOOP PRINT_DIGITS ; 循环打印所有位 POP DX ; 恢复寄存器 POP CX POP BX POP AX RET
调用示例:
MOV AX, 60 CALL PRINT_AX_DEC ; 输出60
方法3:打印十六进制数值(汇编中常用)
如果需要打印AX的十六进制值(比如60的十六进制是3C),可以用类似思路,除数改为16,同时处理10-15到'A'-'F'的转换:
; 函数:打印AX中的4位十六进制数值 PRINT_AX_HEX: PUSH AX PUSH CX PUSH DX MOV CX, 4 ; 16位对应4个十六进制位 PRINT_HEX_LOOP: ROL AX, 4 ; 把最高4位移到最低位 MOV DL, AL AND DL, 0FH ; 提取低4位 ADD DL, '0' CMP DL, '9' JBE PRINT_HEX_SKIP ADD DL, 7 ; 10-15转成'A'-'F'('A'-'9'的ASCII差值为7) PRINT_HEX_SKIP: MOV AH, 02H INT 21H LOOP PRINT_HEX_LOOP POP DX POP CX POP AX RET
调用示例:
MOV AX, 60 CALL PRINT_AX_HEX ; 输出3C
内容的提问来源于stack exchange,提问作者hellooooo
相关产品推荐
相关产品推荐

