2016-04-22 132 views
-1

我開始學習彙編,我有這個疑問。我有下面的代碼段AVR彙編程序中的SBIC指令

LDI R16, 0 
OUT DDRB, R16 ; Configures port B as an input port 
SBIC PORTB, 0 
LDI R18, 0xAA 
OUT PORTC, R18 
RETI 

我讀過什麼SBIC做的是檢查(在這種情況下),如果B口的0位是顯而易見的。如果是,則跳過下一條指令。

我的問題是:

1)是否OUT DDRB, R16寫0的所有端口B的位,或者是它只是一個配置指令,但它不什麼?換句話說:端口B的所有位都設置爲0?

2)如果它們都設置爲0,那麼在SBIC之後的指令將被跳過。但是,僅僅是第一個跳過的指令,或者直到RETI才被觸發?

+0

正如註釋所說,它將端口配置爲輸入。它不寫任何東西。 'SBIC'將返回連接到端口引腳的外部電路提供的任何信息,它只檢查一個位,它也只跳過一條指令。這全部寫在手冊中。 – Jester

+0

是不是可以在端口的引腳上寫入'LDI R16,0xFF',然後是'OUT PORTA,R16',並將1和0寫入?在這種情況下,SBIC返回的內容不取決於外部電路,還是我錯了?還有最後一件事:是否有可能知道'SBIC'是否會跳過下一條指令,只用我在問題中寫的那段代碼? – Tendero

+0

如果端口配置爲輸入,寫入它通常會控制內部上拉(但請查閱您的特定芯片文檔以確保)。不,你不知道'SBIC'是否會跳過。如果可以的話,那裏就不會有任何意義。 – Jester

回答

1

第一條指令在DDRB寄存器的所有位寫入0。我從註釋和寄存器名稱中假設這使得端口B輸入的所有引腳。這不會明確輸出任何內容,但根據設備電配置的方式,嘗試讀取端口B引腳的任何外部設備可能會看到值的更改,因爲它們不再配置爲讀取。

下一條指令測試PORTB寄存器的第0位,其值取決於連接相應引腳的任何值。如果很明顯,跳過下一條指令LDI R18, 0xAA。如果它被設置,則執行下一條指令。

這意味着存儲在PORTC寄存器中OUT PORTC, R18的值取決於端口B的第一個引腳的狀態和執行示例代碼開始時R18中包含的值。