程式需求:能被4整除但不能被100整除,或者年被400整除的年份是閏年。程式設計寫一個完整的程式,求出2012年~2099年中的所有閏年年份,把它們存放在數組Lyear中并輸出到螢幕上。
程式設計思路:彙編中ESI用來做年份計數器,ECX用來做閏年個數計數器,用DIV指令來求餘數。
開發環境
Win10 + VS2017
C語言代碼實作如下:
#include <stdio.h>
int main()
{
printf("Leap year is follow:\n");
for (int i = 2012; i < 2100; i++)
{
if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
printf("%d\t",i);
}
return 0;
}
彙編語言代碼實作如下:
INCLUDELIB kernel32.lib
INCLUDELIB ucrt.lib
INCLUDELIB legacy_stdio_definitions.lib
.386
.model flat,stdcall
ExitProcess PROTO,
dwExitCode:DWORD
printf PROTO C : dword,:vararg
scanf PROTO C : dword,:vararg
.data
Lyear dword 25 dup(0)
msg byte 'Leap year is follow:',10,0
format byte '%d',9,0
.code
main Proc
xor ecx,ecx
mov esi,2012
jmp testing
body:
mov eax,esi
mov ebx,4
cdq
div ebx
cmp edx,0
jne next
mov eax,esi
mov ebx,100
cdq
div ebx
cmp edx,0
je next
mov dword ptr Lyear[ecx*4],esi
inc ecx
jmp over
next:
mov eax,esi
mov ebx,400
cdq
div ebx
cmp edx,0
jne over
mov dword ptr Lyear[ecx*4],esi
inc ecx
over:
inc esi
testing:
cmp esi,2100
jl body
pushad
invoke printf,offset msg
popad
xor esi,esi
again:
pushad
invoke printf,offset format,dword ptr Lyear[esi*4]
popad
inc esi
loop again
push 0h
call ExitProcess
main endp
end main