我正在使用Jon Bartlett的“从头开始编程”来学习汇编程序。我的环境是Linux上的x86-64。
我的档案是:
.code32
.section .data
.section .text
# if I uncomment these lines, compile, I get a segfault
#.section .bss
# .lcomm buff, 500
.globl _start
_start:
pushl $97
call toUppercase
addl $4,%esp
movl %eax, %ebx
exit:
movl $1, %eax
int $0x80
# args: ch
# ch -- character to upper case
#
# ret: uppercase version of ch, untouched if not a character
.type toUppercase,@function
toUppercase:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp),%eax
cmpl $97, %eax
jl toUppercase_return
cmpl $122, %eax
jg toUppercase_return
subl $32, %eax
toUppercase_return:
movl %ebp, %esp
popl %ebp
ret
我使用
编译gcc -m32 -g file.s -o file
如果我取消注释.section .bss周围文件中的行,运行程序时会出现段错误,否则运行正常。此外,如果我取消注释所述行,即使它编译和链接,我也无法再在gdbtui中打开该程序。注释掉,它在gdbtui中打开就好了。
我终于在.text之前移动了.bss,它在编译和工作时同时加载到调试器中。所以我的问题已成为,为什么必须在.text部分之前出现.text部分才能避免这个问题?
答案 0 :(得分:1)
.section .bss
会覆盖前.section .text
。以下每个代码
将被解释为.BSS数据而不是.TEXT代码。您应该将.bss-block放在不会打扰其他部分的地方,例如:到剧本的最后。