溢出时跳转(装配)

时间:2014-10-16 00:32:37

标签: assembly x86 overflow att

在这段代码中,如果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

2 个答案:

答案 0 :(得分:1)

请注意,溢出标志用于带符号算术。您的操作数在被视为已签名时将不会溢出,因为4100000000-194967296并且添加400000000不会溢出。如果您想要无符号溢出,请测试进位标志。如果要签名溢出,请使用不同的数字,接近32位的最大有符号数,即2^31-1=2147483647

答案 1 :(得分:0)

看起来这是一个带有sys_exiteax=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