打印有符号整数优化

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_newlineprint_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