2016-04-22 75 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中包含的值。