- 论坛徽章:
- 0
|
用gcc -S 生成汇编程序如下:
.file "testjmp.c"
.local statval.3342
.comm statval.3342,4,4
.section .rodata
.LC0:
.string "after longjmp:"
.align 4
.LC1:
.string "globval = %d, autoval = %d, regival = %d, volaval = %d, statval = %d\n"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $52, %esp
movl $1, globval
movl $2, -8(%ebp)
movl $3, -24(%ebp)
movl $4, -12(%ebp)
movl $5, statval.3342
movl $jmpbuffer, (%esp)
call _setjmp
testl %eax, %eax
je .L2
movl $.LC0, (%esp)
call puts
movl statval.3342, %eax
movl -12(%ebp), %edx
movl globval, %ecx
movl %eax, 20(%esp)
movl %edx, 16(%esp)
movl -24(%ebp), %eax
movl %eax, 12(%esp)
movl -8(%ebp), %eax
movl %eax, 8(%esp)
movl %ecx, 4(%esp)
movl $.LC1, (%esp)
call printf
movl $0, (%esp)
call exit
.L2:
movl $95, globval
movl $96, -8(%ebp)
movl $97, -24(%ebp)
movl $98, -12(%ebp)
movl $99, statval.3342
movl statval.3342, %eax
movl -12(%ebp), %edx
movl %eax, 12(%esp)
movl %edx, 8(%esp)
movl -24(%ebp), %eax
movl %eax, 4(%esp)
movl -8(%ebp), %eax
movl %eax, (%esp)
call f1
movl $0, (%esp)
call exit
.size main, .-main
.section .rodata
.LC2:
.string "in f1():"
.text
.type f1, @function
f1:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $.LC2, (%esp)
call puts
movl globval, %edx
movl 20(%ebp), %eax
movl %eax, 20(%esp)
movl 16(%ebp), %eax
movl %eax, 16(%esp)
movl 12(%ebp), %eax
movl %eax, 12(%esp)
movl 8(%ebp), %eax
movl %eax, 8(%esp)
movl %edx, 4(%esp)
movl $.LC1, (%esp)
call printf
call f2
leave
ret
.size f1, .-f1
.type f2, @function
f2:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $1, 4(%esp)
movl $jmpbuffer, (%esp)
call longjmp
.size f2, .-f2
.local jmpbuffer
.comm jmpbuffer,156,32
.local globval
.comm globval,4,4
.ident "GCC: (GNU) 4.1.2 20070626 (Red Hat 4.1.2-14)"
.section .note.GNU-stack,"",@progbits
|
从这个程序里可以看到,globval 和statval并非是分配在栈上,
照理说longjmp后输出的应该是改变后的值啊?
高手帮忙看下,
谢谢了~~ |
|