2014-04-07 94 views
-1

我有问题。 如果我报警== 60我需要切换INC alarmM并重置报警,但是我有一个问题装配闹钟

increment_alarm_second: 
inc alarmS       ; increment alarmS 
cpi alarmS , 0x5A ; 0x3C   ; Compare alarmS to 60 
breq increment_alarm_minute   ; If true, jump incMinute 
swap alarmS       ; swap here to save registers (swap nibbles) 
cpi alarmS , 0xA0     ; compares alarmS register to an inverted 10 
brlo endIncSecal     ; branch if lower then an inverted 10 to endIncSecal 

    incSecTenal:    
     andi alarmS, 0x0F   ; does an AND + increment on the alarmS register 
     inc alarmS     ; increments the alarmS register 
     swap alarmS     ; swaps alarm_s register 
    ret        ; returns from the calll 

endIncSecal:       
swap alarm_s      ; swap back 
ret 

为什么CPI报警,0x5A?而不是0x3C,即60 ..

之后,我们交换半字节,并与之比较,0xA0?为什么是这样?

预先感谢

回答

0

该代码段被单独地跟踪的秒的数字。也就是说,第一个半字节是10秒的倍数。剩余的是第二个半字节。

当第二个半字节达到10时,它被清除并且第一个半字节增加。

如果该值达到“50和10”(即60秒),那么它被清除并且分钟递增。

这段代码的主要问题是所有这些都需要在代码的注释中解释。要求它是意想不到的。

+0

好吧,谢谢你有道理,但你怎么知道它是检查小节? 有没有更简单的方法来做这个片段? –