gpt4 book ai didi

overflow - Mips溢出检测,打印结果

转载 作者:行者123 更新时间:2023-12-02 03:41:04 25 4
gpt4 key购买 nike

我写下这段简单的代码只是为了验证 Mips 处理器中的溢出以用于我的最终测试:

.data
.text
.globl main
main:
li $s0, 2000000000
li $s1, 2000000000


addu, $s2 , $s0, $s1

li $v0, 1
move $a0, $s2
syscall
j end


end:

li $v0, 10
syscall

它当然会导致 0xee6b2800,十进制 -294967296,只是因为 mips 将数字编码为二进制补码,并且它将 MSB 识别为符号位(1 及其负数)。我怎样才能实现一个循环来打印(在同一个程序中)正确的值? (在本例中为 40 亿,4x10^9)非常感谢

最佳答案

如果您同时知道操作数和结果,检测溢出并不困难:

li $s0, 2000000000
li $s1, 2000000000

addu $s2 , $s0, $s1

xor $t0, $s0, $s2 # $t0 = op1 ^ result
xor $t1, $s1, $s2 # $t1 = op2 ^ result
and $t0, $t0, $t1 # $t0 = (op1 ^ result) & (op2 ^ result)
bltz $t0, overflow

当两个符号相同的数字相加得到一个符号相反的数字时,就会发生符号溢出。

对于 32 位数字,如果 ((op1 ^ result) & 0x80000000) == 0x80000000),则 op1result 有相反的标志。

因此,如果 (((op1 ^ result) & (op2 ^ result)) & 0x80000000) == 0x80000000),那么这一定意味着 op1result 符号相反,AND op2result 也符号相反,因此 op1op2 必须有相同的符号。这正是我们想要检查的。 bltz 只是检查最高有效位 (0x80000000) 是否已设置的一种更简单的方法。


要将值打印为无符号整数,您可能必须编写自己的整数到字符串转换例程,然后使用 print_string 系统调用打印结果字符串。这是一个相当简单的操作,如果您进行一些搜索,您应该能够找到示例(也许不是专门针对 MIPS,但无论指令集如何,算法都是相同的)。

关于overflow - Mips溢出检测,打印结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48619934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com