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]
)