MS-DOS TASMMASM 函数以十进制格式打印 16 位数字

以十进制格式打印 16 位无符号数

中断服务 Int 21 / AH = 02h 用于打印数字。使用 div 指令执行
数字数字的标准转换,被除数最初是 10 个拟合 16 位(10 4 ) 的最高功率,并且在每次迭代时被降低到更低的功率。

参数

参数按推动顺序显示。
每一个都是 16 位。

参数 描述
number 要以十进制格式打印的 16 位无符号数
show leading zeros 如果 0 没有打印出非重要的零,那么它们就是。数字 0 始终打印为 0

用法

push 241
push 0
call print_dec          ;prints 241

push 56
push 1
call print_dec          ;prints 00056

push 0
push 0
call print_dec          ;prints 0

;Parameters (in order of push):
;
;number
;Show leading zeros
print_dec:
 push bp
 mov bp, sp

 push ax
 push bx
 push cx
 push dx

 ;Set up registers:
 ;AX = Number left to print
 ;BX = Power of ten to extract the current digit
 ;DX = Scratch/Needed for DIV
 ;CX = Scratch

 mov ax, WORD PTR [bp+06h]
 mov bx, 10000d
 xor dx, dx

_pd_convert:     
 div bx                           ;DX = Number without highmost digit, AX = Highmost digit
 mov cx, dx                       ;Number left to print

 ;If digit is non zero or param for leading zeros is non zero
 ;print the digit
 or WORD PTR [bp+04h], ax
 jnz _pd_print

 ;If both are zeros, make sure to show at least one digit so that 0 prints as "0"
 cmp bx, 1
 jne _pd_continue

_pd_print:

 ;Print digit in AL

 mov dl, al
 add dl, '0'
 mov ah, 02h
 int 21h

_pd_continue:
 ;BX = BX/10
 ;DX = 0

 mov ax, bx
 xor dx, dx
 mov bx, 10d
 div bx
 mov bx, ax

 ;Put what's left of the number in AX again and repeat...
 mov ax, cx

 ;...Until the divisor is zero
 test bx, bx
jnz _pd_convert

 pop dx
 pop cx
 pop bx
 pop ax

 pop bp
 ret 04h

NASM 移植

要将代码移植到 NASM,请从内存访问中删除 PTR 关键字(例如,mov ax, WORD PTR [bp+06h] 变为 mov ax, WORD [bp+06h]