打印有符号整数优化
printing a signed integer optimization
Igor Zhirkov 的书中有这个未解答的问题 Low-Level Programming :
"尝试在不调用 print_uint、复制其代码或使用 jmp 的情况下重写 print_int。您将
只需要一条指令和仔细的代码放置。
阅读有关协同例程的信息。"。
为“print_int”和“print_uint”提供的代码:
print_uint:
mov rax, rdi
mov rdi, rsp
push 0
sub rsp, 16
dec rdi
mov r8, 10
.loop:
xor rdx, rdx
div r8
or dl, 0x30
dec rdi
mov [rdi], dl
test rax, rax
jnz .loop
call print_string
add rsp, 24
ret
print_int:
test rdi, rdi
jns print_uint
push rdi
mov rdi, '-'
call print_char
pop rdi
neg rdi
jmp print_uint
print_char:
push rdi
mov rdi, rsp
call print_string
pop rdi
ret
print_string:
push rdi
call string_length
pop rsi
mov rdx, rax
mov rax, 1
mov rdi, 1
syscall
ret
他说的那条特殊的单一指令可能是什么?
非常抱歉,很遗憾这是一个错误。
有一对函数print_newline
和print_char
,其中print_newline
可以表示为一个指令,如果之后控制落到print_char
。我写了一个blog post about it。基本思想是打印一个特定的字符,即换行符,就像在其参数分配了所述字符的代码时启动“打印任何字符”子例程。
print_newline:
mov rdi, '\n' ; first integer argument is in rdi
print_char:
...
至于print_int
我敢肯定,在AMD64上你不能通过一条指令来表达它而落到print_uint
。
Igor Zhirkov 的书中有这个未解答的问题 Low-Level Programming :
"尝试在不调用 print_uint、复制其代码或使用 jmp 的情况下重写 print_int。您将 只需要一条指令和仔细的代码放置。
阅读有关协同例程的信息。"。
为“print_int”和“print_uint”提供的代码:
print_uint:
mov rax, rdi
mov rdi, rsp
push 0
sub rsp, 16
dec rdi
mov r8, 10
.loop:
xor rdx, rdx
div r8
or dl, 0x30
dec rdi
mov [rdi], dl
test rax, rax
jnz .loop
call print_string
add rsp, 24
ret
print_int:
test rdi, rdi
jns print_uint
push rdi
mov rdi, '-'
call print_char
pop rdi
neg rdi
jmp print_uint
print_char:
push rdi
mov rdi, rsp
call print_string
pop rdi
ret
print_string:
push rdi
call string_length
pop rsi
mov rdx, rax
mov rax, 1
mov rdi, 1
syscall
ret
他说的那条特殊的单一指令可能是什么?
非常抱歉,很遗憾这是一个错误。
有一对函数print_newline
和print_char
,其中print_newline
可以表示为一个指令,如果之后控制落到print_char
。我写了一个blog post about it。基本思想是打印一个特定的字符,即换行符,就像在其参数分配了所述字符的代码时启动“打印任何字符”子例程。
print_newline:
mov rdi, '\n' ; first integer argument is in rdi
print_char:
...
至于print_int
我敢肯定,在AMD64上你不能通过一条指令来表达它而落到print_uint
。