我编译了这段代码:
int main()
{
int x;
try
{
x=2/0;
}
catch (...)
{
x=1;
}
return 0;
}
到mips,这就是我得到的:
.file 1 "main.cpp"
.section .mdebug.abi32
.previous
.nan legacy
.gnu_attribute 4, 1
.abicalls
.option pic0
.text
.align 2
.globl main
.cfi_sections .eh_frame_entry
$LFB6 = .
.cfi_startproc
.set nomips16
.set nomicromips
.ent main
.type main, @function
main:
.frame $fp,24,$31 # vars= 8, regs= 1/0, args= 0, gp= 8
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-24
.cfi_def_cfa_offset 24
sw $fp,20($sp)
.cfi_offset 30, -4
move $fp,$sp
.cfi_def_cfa_register 30
li $2,2 # 0x2
move $3,$0
teq $3,$0,7
div $0,$2,$3
mfhi $2
mflo $2
sw $2,8($fp)
move $2,$0
.cfi_epilogue_begin
move $sp,$fp
.cfi_def_cfa_register 29
lw $fp,20($sp)
addiu $sp,$sp,24
.cfi_restore 30
.cfi_def_cfa_offset 0
j $31
nop
.set macro
.set reorder
.end main
.cfi_endproc
$LFE6:
.size main, .-main
.ident "GCC: (Sourcery CodeBench Lite 2014.11-22) 4.9.1"
我想特别询问指令teq
,我知道这意味着“陷阱如果相等”,所以当被除数为零时它会陷阱(这里它为零)。
我不明白陷阱后会发生什么,我的意思是这个汇编文件中的catch块在哪里?在搜索网络时,我看到了不同的东西,如协处理器0,异常代码寄存器等等。
那么这里发生了什么?