在nasm程序中隔离余数

时间:2016-04-27 21:57:16

标签: linux assembly x86 nasm

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

        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但不知道如何隔离剩余部分并确定我是否应该跳到下一个测试或者我是否应该跳到不是闰年。

1 个答案:

答案 0 :(得分:0)

首先,函数的返回值进入eax,以便atoi结果的位置。然后像这样使用div

xor edx,edx
div 4

现在,除法的结果将在eax,其余部分将在edx