【发布时间】:2017-10-17 12:30:43
【问题描述】:
让我们考虑这个非常简单的程序:
#include<stdio.h>
int main ()
{
int num1=4, num2=5;
printf("Welcome\n");
printf("num1 + num2 = %d\n", num1+num2);
return 0;
}
使用gcc -S prog.c查看生成的汇编代码时:
.file "p.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "Welcome\0"
LC1:
.ascii "num1 + num2 = %d\12\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB10:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
call ___main
movl $4, 28(%esp)
movl $5, 24(%esp)
movl $LC0, (%esp)
call _puts
movl 28(%esp), %edx
movl 24(%esp), %eax
addl %edx, %eax
movl %eax, 4(%esp)
movl $LC1, (%esp)
call _printf
call _getchar
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE10:
.ident "GCC: (GNU) 5.3.0"
.def _puts; .scl 2; .type 32; .endef
.def _printf; .scl 2; .type 32; .endef
.def _getchar; .scl 2; .type 32; .endef
我知道 CPU 看到的是编译器为其生成的汇编代码,我不明白程序如何在用户设置的 breakpoint 处停止?为什么CPU不继续运行程序?这是怎么回事?
我的意思是,为什么它在获取指令后会停止?
我对此有点困惑,是 Code::Blocks 关心这个还是用户正在使用的任何程序?
提前致谢!
【问题讨论】:
-
调试器会处理这个问题。它要么使用软件断点指令 (
int3) 覆盖您的程序,要么设置硬件辅助断点。 -
CPU 怎么知道
addl是加法?如何处理ret指令? -
@Olaf 他在生成的代码中看不到导致程序停止的命令。这与他对
addl或ret的理解无关,我想。 -
@TonyTannous:如果您知道 RAM 中的断点是如何使用的,那么您就知道了。
-
答案因处理器而异。
标签: c debugging exception assembly operating-system