teq是如何在mips中工作的
how does teq work in mips
我编译了以下代码:
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
视为整数除以零的指示符。(浮点除以零的处理方式不同,不一定会陷波。)
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- teq是如何在mips中工作的