gpt4 book ai didi

有人可以告诉我以下汇编代码有什么问题吗?出现段错误

转载 作者:行者123 更新时间:2023-11-30 20:59:35 32 4
gpt4 key购买 nike

由于指令,函数中出现段错误movq -8(%rbp), %rax,printf 之前的一位。我不明白为什么?注意:这不是 gcc 生成的程序集,而是由我正在编写的编译器生成的。汇编代码几乎与 gcc 生成的类似。

.text
.globl main
.type main, @function
main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl $2, -4(%rbp)
leaq -4(%rbp), %rax
movl %eax, %edi
movb $0, %al
call fcvt2
movl %eax, -4(%rbp)
leaq .LC0(%rip), %rdi
movl -4(%rbp), %esi
movb $0, %al
call printf
leave
ret

.globl fcvt2
.type fcvt2, @function
fcvt2:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movq %rdi, -8(%rbp)
leaq .LC1(%rip), %rdi
movq -8(%rbp), %rax
movl (%rax), %esi
movb $0, %al
call printf
movq -8(%rbp), %rax
movl (%rax), %edi
movl %edi, %eax
leave
ret

.section .rodata
.LC1:
.string "It should be : %d\f"
.LC0:
.string "%d\n"

C 程序是:

int fcvt2(int *ip) {
int i;
printf("It should be : %d\f", *ip);
return *ip;
}

void main() {
int i;
i = 2;
i = fcvt2(&i);
printf("%d\n",i);
return;
}

故障点处的gdb输出:

rax            0xffffdd4c   4294958412
rbx 0x0 0
rcx 0x7ffffff7 2147483639
rdx 0x7ffff7dd3780 140737351858048
rsi 0x7fffffffdd48 140737488346440
rdi 0xffffdd4c 4294958412
rbp 0x7fffffffdd30 0x7fffffffdd30
rsp 0x7fffffffdd00 0x7fffffffdd00
r8 0x0 0
r9 0x9 9
r10 0x7ffff7dd1b78 140737351850872
r11 0x246 582
r12 0x400430 4195376
r13 0x7fffffffde30 140737488346672
r14 0x0 0
r15 0x0 0
rip 0x40059c 0x40059c <fcvt2+20>
eflags 0x10206 [ PF IF RF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0

最佳答案

调用者中的 movl %eax, %edi 将指针 arg 截断为 fcvt2 。您实际上在 mov (%rax),%esi. rax 上出现了段错误,而不是像您声称的那样在它之前的指令上出现了段错误。 (是时候复习一下您的 GDB 技能了吗?)

leaq -4(%rbp), %rax%rax 中正确生成了它,但是编译器忘记了它是一个指向 32 位值的 64 位指针。 (理想情况下,您希望直接将 leaq -4(%rbp), %rdi 写入 arg 寄存器中。)

<小时/>

题外话:如果不需要保留 EAX 的高字节, movb $0, %al 的效率低于 xor %eax, %eax 。我认为您正在为 x86-64 SysV 可变参数函数约定执行此操作,并且您是对的,只有 %al 需要说明有多少个 XMM 寄存器参数,而不是整个 %eax ,所以您是对的。但将 eax 归零是将 al 归零的最有效方法。当然,您根本不需要对非可变参数函数执行此操作,但您的编译器显然仍处于“just-get-it-working”阶段,因此无条件执行此操作并不是正确性问题;您永远不需要在 rax 中传递任何其他内容,并且函数调用始终被假定为破坏 rax

(也相关:Haswell/Skylake partial registers have false dependencies: al isn't renamed separately from rax anymore)

关于有人可以告诉我以下汇编代码有什么问题吗?出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46878861/

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