Kiến thức của tôi về bộ chỉ dẫn intel là một chút gỉ. Bạn có thể cho tôi biết lý do tại sao tôi có thể bị lỗi phân đoạn trong phiên bản tối ưu hóa chức năng của tôi (điểm thưởng nếu bạn có thể cho tôi biết tại sao tôi không nhận được nó trong bản dựng mã -O0. biên soạn bởi GCC 4.1.2SIGSEGV trong phiên bản tối ưu của mã
Dưới đây là kết quả của "disas" lệnh GDB tại vụ tai nạn:.
0x00000000004263e5 <+0>: sub $0x8,%rsp
0x00000000004263e9 <+4>: movsd %xmm2,(%rsp)
0x00000000004263ee <+9>: divsd %xmm1,%xmm0
0x00000000004263f2 <+13>: callq 0x60f098 <[email protected]>
=> 0x00000000004263f7 <+18>: andpd 0x169529(%rip),%xmm0
0x00000000004263ff <+26>: movsd (%rsp),%xmm1
0x0000000000426404 <+31>: ucomisd %xmm0,%xmm1
0x0000000000426408 <+35>: seta %al
0x000000000042640b <+38>: movzbl %al,%eax
0x000000000042640e <+41>: add $0x8,%rsp
0x0000000000426412 <+45>: retq
Và đây là nguồn gốc của hàm:
char is_within_range(double a, double b, double range) {
double ratio = a/b;
double logRatio = fabs(log(ratio));
return logRatio < range;
}
Để tham khảo đây là phiên bản không được tối ưu hóa của mã:
0x00000000004263e5 <+0>: push %rbp
0x00000000004263e6 <+1>: mov %rsp,%rbp
0x00000000004263e9 <+4>: sub $0x30,%rsp
0x00000000004263ed <+8>: movsd %xmm0,-0x18(%rbp)
0x00000000004263f2 <+13>: movsd %xmm1,-0x20(%rbp)
0x00000000004263f7 <+18>: movsd %xmm2,-0x28(%rbp)
0x00000000004263fc <+23>: movsd -0x18(%rbp),%xmm0
0x0000000000426401 <+28>: divsd -0x20(%rbp),%xmm0
0x0000000000426406 <+33>: movsd %xmm0,-0x10(%rbp)
0x000000000042640b <+38>: mov -0x10(%rbp),%rax
0x000000000042640f <+42>: mov %rax,-0x30(%rbp)
0x0000000000426413 <+46>: movsd -0x30(%rbp),%xmm0
0x0000000000426418 <+51>: callq 0x610608 <[email protected]>
0x000000000042641d <+56>: movapd %xmm0,%xmm1
0x0000000000426421 <+60>: movsd 0x16b6b7(%rip),%xmm0
0x0000000000426429 <+68>: andpd %xmm1,%xmm0
0x000000000042642d <+72>: movsd %xmm0,-0x8(%rbp)
0x0000000000426432 <+77>: movsd -0x8(%rbp),%xmm1
0x0000000000426437 <+82>: movsd -0x28(%rbp),%xmm0
0x000000000042643c <+87>: ucomisd %xmm1,%xmm0
0x0000000000426440 <+91>: seta %al
0x0000000000426443 <+94>: movzbl %al,%eax
0x0000000000426446 <+97>: leaveq
0x0000000000426447 <+98>: retq
Bạn đã kiểm tra sự khác biệt với mã không được tối ưu hóa (đầu ra lắp ráp) chưa?Nếu có, bạn có thể đăng nó không? – Macmade
Đầu vào có quan trọng không? – sehe
Tôi không nghĩ rằng đầu vào thực sự quan trọng ... – Macmade