;name: leapyear.asm ; ;build: nasm -felf64 leapyear.asm -o leapyear.o ; ;description: determine if a year is a leapyear or not. ; bits 64 section .text global leapyear leapyear: ;leapyear ; in : rdi = uint year ; out : rax is true(1) or false(0) push rbx ;save used registers push rcx push rdx mov rax,rdi xor rcx,rcx ;rcx = false(0), assume not leap test rax,3 ;last two bits 0? jnz .done ;if not year is not divisible by 4 -> no leapyear inc rcx ;assume year is a leapyear, rcx = true(1) xor rdx,rdx ;prepare rdx for division mov rbx,100 ;year / 100 div rbx and rdx,rdx ;remainder = 0? jnz .done ;not leap test rax,3 ;multiples of 100 aren't leap years except if last two bits ;are zero 0 (divisible by 4) then also divisible by 400 jz .done ;yes, leap year dec rcx ;no, not leap year, rcx = false(0) .done: mov rax,rcx ;mov result in RAX pop rdx pop rcx pop rbx ret
C test program
// leapyear test program // gcc -o leapyear leapyear.c leapyear.o #include <stdio.h> extern int leapyear(unsigned int year); int main() { for (unsigned int i = 0;i < 3000;i=i+100){ printf(" %d - %d \n",i,leapyear(i)); } }