gpt4 book ai didi

c - 函数调用是否与 %rax 以外的其他寄存器混淆?

转载 作者:太空宇宙 更新时间:2023-11-04 02:25:16 30 4
gpt4 key购买 nike

<分区>

这是我的编译器生成的 gcc 汇编代码。评论描述了应该发生的事情(在我看来),我正在输入零。然而程序的输出是 4(或 4 + 我在提示符中输入的任何值)。

.globl main
main:
pushq %rbp
movq %rsp, %rbp
subq $0, %rsp
movq $1, %rbx ; rbx = 1
movq $46, %rdx ; rbx = 1 rdx = 46
movq %rbx, %rcx ; rbx = 1 rdx = 46 rcx = 1
addq $7, %rcx ; rbx = 1 rdx = 46 rcx = 8
movq $4, %rbx ; rbx = 4 rdx = 46 rcx = 8
addq %rcx, %rbx ; rbx = 12 rdx = 46 rcx = 8
addq %rdx, %rcx ; rbx = 12 rdx = 46 rcx = 54
callq read_int ; rbx = 12 rdx = 46 rcx = 54
movq %rax, %rdx ; rbx = 12 rdx = R rcx = 54
negq %rbx ; rbx = -12 rdx = R rcx = 54
addq %rbx, %rcx ; rbx = -12 rdx = R rcx = 42
movq %rdx, %rbx ; rbx = R rdx = R rcx = 42
addq %rcx, %rbx ; rbx = R rdx = R rcx = 42 + R
movq %rbx, %rax ; rax = 42 + R
movq %rax, %rdi
callq print_int
addq $0, %rsp
movq $0, %rax
popq %rbp
retq

不太明白为什么会这样。如果我尝试在没有读取指令的情况下编译它,它就可以正常工作。代码的唯一区别是

movq $0, %rdx

代替

callq read_int
movq %rax, %rdx

但是%rax 寄存器以前没有用过。并且没有寄存器保存 4。read_int 的代码是

int64_t read_int() {
int64_t i;
scanf("%" SCNd64, &i);
return i;

而且它本身运行良好,例如仅调用 read int 并将 rax 移动到 rdi,然后打印它的代码工作正常。

这个函数调用是否以某种方式干扰了其他寄存器?

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com