我目前正在x86 linux上编写一个nasm程序,并试图执行一个计算,将第一个命令行arg(一年)除以第一个闰年检查。我想检查剩余部分是否为0,但我正在努力解决这个问题。我知道div命令将答案存储在一个特定的寄存器中,剩余的存储在另一个寄存器中,但现在我只使用test。这是密码

        global  main
        extern  puts
        extern  printf
        extern  atoi

        section  .text

main:
        sub     rsp, 8
        cmp     rdi, 2
        jne     error1              ; jump if aguments != 1
        mov     rdi, [rsi+8]
        call    atoi
        test    rdi, fourTest
        jnz     notLeapYear
        jmp     done
testTwo:
        jmp     done

notLeapYear:
        mov     edi, nLeap
        call    puts
        jmp     done
error1:
        mov     edi, badArgs
        call    puts
        jmp     done

done:
        add     rsp, 8
        ret

badArgs:
        db      "Requires exactly one argument", 5, 0

nLeap:
        db      "Not a leap year", 5, 0

        section  .data
fourTest:      dq       4
hundTest:      dq       100
fHundTest:     dq       400

我认为我需要将测试rdi,fourtest改为使用div,但不知道如何隔离其余部分,并确定我是否应该跳转到下一个测试,或者我是否应该跳转到不是闰年。

最佳答案

首先,函数的返回值进入eax,所以atoi结果就在这里。然后像这样使用div

xor edx,edx
div 4

现在除法的结果将在eax中,其余的将在edx中。

08-16 11:30