这个程序可以很好地打印小数字,但不能打印大数字,我不知道为什么。
例如print 1346269
将打印为“c1346269”
和print 40000
将打印为“40000”,就像它应该的那样。
这是宏:
%macro print 1
mov rax, %1
%%printInt:
mov rcx, digit ; set rcx to digit memory address
mov rbx, 10 ; moving a newline into rbx
mov [rcx], rbx ; setting digit to rbx
inc rcx ; increment rcx position by one byte
%%storeLoop:
xor rdx, rdx ; zero out rdx
mov rbx, 10
div rbx ; rax / rbx (10)
; rdx holds the remainder of the divison
add rdx, 48 ; add 48 to rdx to make in ascii character
mov [rcx], dl ; get the character part of rdx
inc rcx ; increment digit position again
cmp rax, 0
jnz %%storeLoop ; continue looping until rax is 0
%%printLoop:
push rcx
;perform sys write
mov rax, SYSWRITE
mov rdi, 1
mov rsi, rcx
mov rdx, 1
syscall
pop rcx
dec rcx
cmp rcx, digit ; first byte of digit (10)
jge %%printLoop
%endmacro
这是我的使用方法:
_start:
print 40000
exit
The 存储循环以一个结尾inc rcx
,离开RCXbehind最后一个字符。因此,打印循环 must 预减调用之前的指针syscall
.
%%printLoop:
dec rcx
push rcx
...
pop rcx
cmp rcx, digit ; first byte of digit (10)
ja %%printLoop
“长”和“短”数字之间的差异纯粹是因为内存中您打印的第一个地址处发生了什么(垃圾)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)