繁体   English   中英

使用尾调用优化打印换行符

[英]print a newline using tail call optimization

Igor Zhirkov 的《低级编程》一书中有一个未回答的问题:

“尝试在不调用 print_char 或复制其代码的情况下重写 print_newline。提示:阅读有关尾调用优化的信息。”。

我花了一些时间阅读关于尾调用优化的文章,但我不知道什么是正确的做法。

原始代码(无尾调用): print_newline => print_char => print_string=>string_length=>print_string

string_length:
    xor rax, rax
.loop:
    cmp byte [rdi+rax], 0   ; if rdi =  0 (not an address), then seg fault
    je .end 
    inc rax
    jmp .loop 
.end:
    ret
print_string:
    push rdi
    call string_length
    pop rsi
    mov rdx, rax
    mov rax, 1
    mov rdi, 1
    syscall
    ret
print_char:
    push rdi
    mov rdi, rsp 
    call print_string 
    pop rdi
    ret
print_newline:
    mov rdi, 10
    jmp print_char

什么是尾调用优化?

为了参考,我也会在这个线程中提供解决方案。

  1. 没有优化
print_newline:
    mov rdi, 10
    call print_char
    ret
print_char:
    push rdi
    mov rdi, rsp 
    call print_string 
    pop rdi
    ret
  1. 尾调用优化。 一系列指令call Xret总是可以用jmp X代替。
print_newline:
    mov rdi, 10
    jmp print_char
print_char:
    push rdi
    mov rdi, rsp 
    call print_string 
    pop rdi
    ret
  1. 刚刚落入print_char 基本上制作一个有两个入口点的子程序。
print_newline:
    mov rdi, 10
print_char:
    push rdi
    mov rdi, rsp 
    call print_string 
    pop rdi
    ret

这是我的博客中更深入的解释

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM