天天看點

【彙程式設計式】實作輸出2012-2100年之間所有閏年

程式需求:能被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
           

編譯運作後結果如下:

【彙程式設計式】實作輸出2012-2100年之間所有閏年

繼續閱讀