我目前正在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
中。