Linux nasm程序中余数的分离

Linux nasm程序中余数的分离,linux,assembly,x86,nasm,Linux,Assembly,X86,Nasm,我目前正在x86Linux上编写一个NASM程序,并尝试执行一个计算,将第一个命令行arg(一年)除以第一个闰年检查。我想检查余数是否为0,但我正在努力解决如何做到这一点。我知道div命令将答案存储在某个寄存器中,将余数存储在另一个寄存器中,但现在我只使用test。这是密码 global main extern puts extern printf extern atoi section .text m

我目前正在x86Linux上编写一个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
中。首先,函数返回值进入
eax
,因此
atoi
结果将在这里。然后像这样使用
div

xor edx,edx
div 4

现在除法的结果将出现在
eax
中,剩下的结果将出现在
edx

中,不确定您正在努力解决什么问题,显然您知道
div
的工作原理,因为您对它的描述非常好(如果有点模糊)。还要注意,要使用
test
获得
模4
,您需要执行
test rdi,3
而不是
test rdi,4
。@Jester抱歉,我对汇编和x86体系结构相当陌生,所以我可能无法始终完美地描述事情。我将行改为测试rdi,3我的跳转仍然不符合我的notLeapYear部分,该部分应打印“not a leap year”。例如,我将2005输入到我的命令行中,当使用4进行修改时,该命令行不应为0,但是它忽略了jnz并直接跳到done。还要注意,
atoi
eax
中返回结果,而不是
rdi
@Jester,这是我的问题!多谢各位Jester@MichaelPetch是的,迈克尔!非常感谢。抱歉,没有回复其他线程。巨大的帮助。不确定你在挣扎什么,显然你知道
div
是如何工作的,因为你对它描述得很好(虽然有些模糊)。还要注意,要使用
test
获得
模4
,您需要执行
test rdi,3
而不是
test rdi,4
。@Jester抱歉,我对汇编和x86体系结构相当陌生,所以我可能无法始终完美地描述事情。我将行改为测试rdi,3我的跳转仍然不符合我的notLeapYear部分,该部分应打印“not a leap year”。例如,我将2005输入到我的命令行中,当使用4进行修改时,该命令行不应为0,但是它忽略了jnz并直接跳到done。还要注意,
atoi
eax
中返回结果,而不是
rdi
@Jester,这是我的问题!多谢各位Jester@MichaelPetch是的,迈克尔!非常感谢。抱歉,没有回复其他线程。巨大的帮助。
test edi,3
为零意味着它可以被4平均整除,而不需要
div
@MichaelPetch是的,它可以工作四年,但我们还需要检查年份输入是否为100和400=0的模。而test仅在2的幂次方(按位和)下工作。因此,在接下来的两个示例中,我们将尝试使用div并关注剩余部分。谢谢。我不知道NASM被允许除以一个立即数,就像在
div 4
测试edi中一样,3为零意味着它可以被4整除,而不需要
div
的开销@MichaelPetch是的,它可以被4整除,但是我们还需要检查年份输入是否是以100和400=0为单位的。而test仅在2的幂次方(按位和)下工作。因此,在接下来的两个示例中,我们将尝试使用div并关注剩余部分。谢谢。我不知道NASM可以像
第4部分那样被立即数除。