如果不想看作文的話請點這裡
作文練習
『欸,今年是閏年嗎?』
突然間被問了這樣的問題
「我不知道耶」
閏年,就是所謂「多一天的年」。多的這個日子,可能開心,可能悲傷。我們無法預知未來,所以就把它當作是神大人賜予的,多一場大冒險吧!正式因為是一場未知的旅途,所以才會有所期待,並展開雙臂來迎接它不是嗎?
很明顯的扯遠了XD。仔細想想,但還是無法參透到底為什麼會有閏年呢...我還給老師了吧?一邊打字一邊這樣想著。
『以公曆为例,為「年」的計算基礎是回歸年,而一個回歸年大約等於365.24220日。...』維基百科如是說。
所以是小數點後面數字的總和囉?記得小學老師有說過某規則可以判斷...有了,寫在下面:
目前使用的格里曆閏年規則如下: 1.西元年份除以4可整除,为闰年。 2.西元年份除以4及100可整除,为平年。 3.西元年份除以4、100、400可整除,为閏年。「格里?Gregorian吧?唸起來像格里?嗯是有點啦」我這麼吐槽著
另外
每逢閏年,2月份有29日,平年的2月份為28日。難怪說2/29生日的人們四年才能過一次生日...好可憐。不過,親友們應該會替229君補救吧。
「查到規則了喔~」
『喔喔~所以2012年是閏年。謝謝啦!』
目送他離開的時候,我想到我現在正在進行的組合語言程式練習。
「這題目,或許意外的很適合呢!」
=========================
所以囉,下面這裡就是「計算今年是否為閏年」的程式。想跑跑看的話,使用
gcc leap_year.s組譯並連結。
.section .text .global main .type main, %function main: sub $8, %rsp /*堆疊位址現在已經和16對齊了!*/ mov $.Linput_msg, %rdi call puts mov $.Lin_format, %rdi mov %rsp, %rsi xor %rax, %rax call scanf mov (%rsp), %rax /* 千萬記得div : rdx:rax / Op 若是 rdx:rax 太大的話,就會造成rax裝不下結果 ,並使「除以零」的錯誤被丟出來! */ mov $100, %rdi mov %rax, %rsi xor %rdx, %rdx /* % 4 == 0 ? 如果某個數字可以被4除盡,則其二進位必定是: ....0000 */ test $3, %rax jnz .Lnot_leap_year /* % 100 == 0? */ divq %rdi cmp $0, %rdx jne .Lleap_year /* % 400 == 0? %rdi原本是100,那麼,100*4=400 以二進位的角度來說,如果把整個「條碼」向右移動 那就會有乘以2的效果 相反的,把「條碼」左移,則是除以2 向右 向左 001 (1) <=====> 010 (2) */ mov %rsi, %rax shl $2, %rdi divq %rdi cmp $0, %rdx jne .Lnot_leap_year /* 標籤的名稱如果以.L開頭, 那麼這個標籤就不匯出現在組譯後的 執行檔裡面。 */ .Lleap_year: mov $.Lleap_year_fmt, %rdi xor %rax, %rax call printf jmp .Lend_printer .Lnot_leap_year: mov $.Lnonleap_fmt, %rdi xor %rax, %rax call printf .Lend_printer: xor %rax, %rax add $8, %rsp ret .section .rodata .Lin_format: .string "%u" .Linput_msg: .string "Please input the year." .Lleap_year_fmt: .string "Year %u is a leap year.\n" .Lnonleap_fmt: .string "Year %u is not a leap year.\n" .end
沒有留言:
張貼留言