在这段代码中,如果32位整数溢出则尝试打印1,否则打0。 但是不管它是否溢出,我都会一直收到0。这是我的代码,其中包含一个应该溢出并打印的示例1.感谢任何帮助。
.section .data
x:
.int 4100000000
y:
.int 400000000
.section .text
.global _start
_start:
movl y, %eax #moves the value y to %eax
addl x, %eax #adds the value x to %eax
jo output_with_overflow #jump if overflow
movl $0, %eax
jmp end
output_with_overflow:
movl $1, %eax
jmp end
end:
movl %eax, %ebx
movl $1, %eax
int $0x80
答案 0 :(得分:1)
请注意,溢出标志用于带符号算术。您的操作数在被视为已签名时将不会溢出,因为4100000000
为-194967296
并且添加400000000
不会溢出。如果您想要无符号溢出,请测试进位标志。如果要签名溢出,请使用不同的数字,接近32位的最大有符号数,即2^31-1=2147483647
。
答案 1 :(得分:0)
看起来这是一个带有sys_exit
和eax=1
的Linux ebx=<exit code>
系统调用...
您的程序检查溢出标志,但对于无符号值,应检查进位。
我还简化了一点以避免不必要的移动 - 您可以在检查后立即在ebx
准备退出代码。
.section .data
x:
.int 4100000000
y:
.int 400000000
.section .text
.global _start
_start:
movl y, %eax #moves the value y to %eax
addl x, %eax #adds the value x to %eax
jc output_with_overflow #jump if carry
movl $0, %ebx
jmp end
output_with_overflow:
movl $1, %ebx
jmp end
end:
movl $1, %eax
int $0x80
结果在进位标志中有一个技巧:
_start:
movl $0, %ebx
movl y, %eax #moves the value y to %eax
addl x, %eax #adds the value x to %eax
adcl $0, %ebx
movl $1, %eax
int $0x80