Tôi không quen thuộc với vi điều khiển PIC, vì vậy tôi sẽ đưa ra câu trả lời tổng quát hơn. (chỉnh sửa: Câu trả lời cụ thể cho PIC được thêm ở cuối bài này)
Đặc biệt là các bộ vi điều khiển nhỏ hơn, như 8 bit và các dẫn xuất của chúng, bị giới hạn trong những gì chúng có thể làm trong một lệnh đơn. Một lệnh có thể chứa địa chỉ đích cho một bước nhảy, nhưng không phải là hai trong số chúng, vì vậy then-else
là hết. Bạn chỉ có if-then
một phần, nhưng thế là đủ. Có hai cách tiếp cận. Một số bộ điều khiển cho phép bạn chuyển đến một địa chỉ nhất định nếu một điều kiện được đáp ứng, những điều kiện khác chỉ cho phép bạn bỏ qua hướng dẫn tiếp theo. Trong trường hợp trước, mã của bạn sẽ trông như sau:
if-test-succeeds goto test-success
test-failed first instruction of `else` block
...
goto continue
test-success first instruction of `then` block
...
continue first instruction after if-then-else
Nếu bạn chỉ có thể bỏ qua hướng dẫn tiếp theo, bạn sẽ viết một cái gì đó như
if-test-succeeds skip next instruction
goto test-failed
test-success first instruction of `then` block
...
goto continue
test-failed first instruction of `else` block
...
continue first instruction after if-then-else
Bản thân bài kiểm tra cũng có khả năng hạn chế. Giống như bạn không thể vượt qua hai số để so sánh chúng. Những gì bạn làm là tải bộ tích lũy với số thứ nhất và trong hướng dẫn tiếp theo trừ đi số thứ hai. Điều này sẽ khiến các mã điều kiện như số 0 và cờ mang được đặt / xóa. Hướng dẫn có điều kiện sẽ kiểm tra cho những lá cờ. Vì vậy, nếu bạn muốn viết if A = B then do-equal else do-not-equal
này sẽ trở thành
load accumulator with A
subtract B from accumulator
if zero-flag set goto do-equal
do-not-equal first instruction of `else` block
...
goto continue
do-equal first instruction of `then` block
...
continue first instruction after if-then-else
Quan trọng: hướng dẫn tập lệnh sẽ cho bạn biết mã điều kiện nào sẽ bị ảnh hưởng bởi một lệnh đã cho. Chẳng hạn, trong Z80, ld
lệnh (đối với "bộ tích lũy tải") sẽ không thay đổi bất kỳ cờ nào. Vì vậy, ở đây tải bộ tích lũy là không đủ để xác định nếu dữ liệu bằng không.
chỉnh sửa
OK, vì vậy tôi đã thực hiện một số nghiên cứu và tôi thấy như sau:
PIC chỉ có 2 hướng dẫn nhảy có điều kiện BTFSS
và BTFSC
.
BTFSS : Kiểm tra bit F, Bỏ qua nếu đặt
Cú pháp: BTFSS f, b
trong đó f là thanh ghi [0..127]
và b là bit trong thanh ghi được kiểm tra [0..7]
Mô tả: Nếu bit trong thanh ghi là 0
hướng dẫn tiếp theo được thực hiện. Nếu bit là 1
lệnh tiếp theo bị loại bỏ và NOP
thay vào đó sẽ được thực thi.
BTFSC : Bit Test F, Skip if Clear
Cú pháp: BTFSC f, b
trong đó f là thanh ghi [0..127]
và b là bit trong thanh ghi được kiểm tra [0..7]
Mô tả: Nếu bit trong thanh ghi là 1
hướng dẫn tiếp theo được thực hiện. Nếu bit là 0
lệnh tiếp theo bị loại bỏ và NOP
thay vào đó sẽ được thực thi.