teq是如何在mips中工作的

how does teq work in mips

本文关键字:工作 mips teq      更新时间:2023-10-16

我编译了以下代码:

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、异常代码寄存器。。。等

那么这里发生了什么?

teq指令是编译器选择如何处理由除以零产生的未定义行为;没有指示除以零触发CCD_ 3块将处理的异常。

然后您会想知道catch块在列表中的位置。事实并非如此。没有任何内容表示x=1语句,这可能是因为此后再也不会使用赋值。div指令就是另一个例子。它将结果存储在寄存器$0中,这相当于丢弃结果。

如果您想了解如何处理异常,请使用throw语句。

在MIPS中,有一个异常的概念,但它与C++的异常概念不同。根据MIPS IV指令集手册,当teq的前两个参数相等时,CPU将发出陷阱异常信号,并"将控制权转移到内核中的软件异常处理程序"。内核可能会打印一条消息并终止程序,除非程序要求内核执行其他操作。(编译器的运行库可能已经提供了一些东西来控制CPU异常的处理,甚至可能将它们转换为可以在catch块中捕获的C++异常。)

teq的第三个参数对CPU来说没有固有的意义,但异常处理程序可能知道将7视为整数除以零的指示符。(浮点除以零的处理方式不同,不一定会陷波。)