平成30年度秋期のアセンブラプログラム
プログラム1
- プログラム名:DAYOFFST
- IN GR2:指定年月日格納アドレス
- OUT GR0:経過日数
プログラム2
- プログラム名:LEAPYEAR
- IN GR2:指定年
- OUT GR0:0 平年、1 うるう年
プログラム3
- プログラム名:DIVISIBL
- IN GR2 : 被除数、GR3 : 除数
- OUT GR0 : 0 割切れない、1 割切れる
DAYOFFST START
RPUSH
LD GR5,0,GR2 ; GR5 : 年
LD GR3,1,GR2 ; GR3 : 月
LD GR1,2,GR2 ; GR1 : 日
SUBL GR1,=1 ; GR1で日数をカウント
[ a ]
ADDL GR1,-1,GR4 ; 1月1日からの日数(平年)を求める
CPA GR3,=3 ; 月が3月以降のときうるう年を考慮
JMI SKIP
LD GR2,GR5
CALL LEAPYEAR
ADDL GR1,GR0
SKIP LD GR2,=1970 ; 1970年から(年-1)年までの間(ただし,
LOOP CPA GR2,GR5 ; 年>1970),1年の日数を加算
[ b ]
CALL LEAPYEAR
ADDL GR0,=365
ADDL GR1,GR0
ADDA GR2,=1
JUMP LOOP
BREAK LD GR0,GR1
EXIT RPOP
RET
; ACCMDAYSは,平年の各月1日の1月1日からの日数(1月1日は0日目)
ACCMDAYS DC 0,31,59,90,120,151,181,212,243,273,304,334
END
LEAPYEAR START
RPUSH
SUBA GR0,GR0
LD GR3,GR2
AND GR3,=3
[ c ]
LD GR3,=100
CALL DIVISIBL
[ d ]
JNZ FIN
LD GR3,=400
CALL DIVISIBL
FIN RPOP
RET
END
DIVISIBL START ; 入力 GR2 : 被除数、 GR3 : 除数
RPUSH
SUBA GR0,GR0 ; 復帰値 0:割切れない
DLOOP SUBA GR2,GR3
JPL DLOOP
JMI DFIN
LD GR0,=1 ; 復帰値 1:割切れる
DFIN RPOP
RET ; 出力 GR0 : 0:割切れない、1:割切れる
END
0 件のコメント:
コメントを投稿