[英]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
什么是尾调用优化?
为了参考,我也会在这个线程中提供解决方案。
print_newline:
mov rdi, 10
call print_char
ret
print_char:
push rdi
mov rdi, rsp
call print_string
pop rdi
ret
call X
和ret
总是可以用jmp X
代替。print_newline:
mov rdi, 10
jmp print_char
print_char:
push rdi
mov rdi, rsp
call print_string
pop rdi
ret
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.