Tại sao mã này không được viết theo cách đơn giản hơn nhiều?


8

Tôi đã gặp một câu hỏi trong khi làm việc về ngôn ngữ lắp ráp. Đây là câu hỏi:

Giả sử rằng bit P2.2 được sử dụng để điều khiển ánh sáng ngoài trời và bit P2.5 ánh sáng bên trong tòa nhà. Chỉ ra cách bật đèn bên ngoài và tắt đèn bên trong.

Giải pháp đưa ra:

SETB C            ; CY = 1
ORL C, P2.2       ; CY = P2.2 ORed w/ CY
MOV P2.2, C       ; turn it on if not on
CLR C             ; CY = 0
ANL C, P2.5       ; CY = P2.5 ANDed w/P2.5
MOV P2.5,C        ; turn it off if not off

Tôi chỉ cảm thấy như nó sẽ làm cùng một công việc để viết mã:

SETB P2.2
CLR P2.5

Có chuyện gì với nó vậy?


2
Có lẽ chỉ là didactics - chỉ ra cách sử dụng bit carry như một bộ tích lũy. Không có lợi thế mà tôi có thể thấy trong trường hợp cụ thể này. Điều này trông giống như mã lắp ráp 8051.
Spehro Pefhany

@SpehroPefhany Nhưng theo tôi biết, thanh ghi Acc được sử dụng trong một số trường hợp vì nó là thanh ghi duy nhất hỗ trợ một số hướng dẫn như DA, RR, RL, v.v. Tôi không nghĩ đây là trường hợp ở đây. Tôi có lầm không?
İlker Demirel

Mang là một chút rộng. Bạn có thể muốn sử dụng nó như một bộ tích lũy trong một số trường hợp như đánh giá logic bậc thang.
Spehro Pefhany

Câu trả lời:


11

Bạn đúng ở chỗ nó xuất hiện mã bạn hiển thị là ngớ ngẩn. Có lẽ bất cứ máy nào chạy trên này đều không thể thực hiện các thao tác ngay lập tức để đặt bit trên các cổng I / O và đó là lý do tại sao một cái gì đó như SETB P2.2 không thể thực hiện được.

Vẫn đặt bit CY thành 1, sau đó OR bất cứ thứ gì vào đó chỉ là ngớ ngẩn. Cũng vậy với việc đặt bit CY thành 0, sau đó AND một cái gì đó vào nó. Rõ ràng bit CY có thể được sao chép trực tiếp vào bit pin I / O, vì mã thực hiện điều đó. Nhiều nhất đây là 4 hướng dẫn, chắc chắn không phải 6.


Vì vậy, tôi có thể nói rằng nếu một bit là địa chỉ bit, tôi được phép sử dụng các hướng dẫn bit trên bất cứ bit nào, phải không?
İlker Demirel

1
@ İlk: Không nhất thiết. Có thể có các hạn chế như các lệnh bit chỉ hoạt động trên một số thanh ghi nhất định, bộ nhớ "gần" nhất định và tương tự. Nếu không biết bộ xử lý, chúng tôi không thể nói chắc chắn liệu SETB P2.2 có khả thi hay không. Tuy nhiên, SETB C theo sau là MOV P2.2, C, rõ ràng là có thể.
Olin Lathrop

1
@OlinLathrop: Bộ xử lý gần như chắc chắn là một số biến thể 8051 và tập lệnh được đặt cho những vị trí tương tự sẽ được sử dụng SETB bitCLR bithướng dẫn như đối với MOV bit,C. Hơn nữa, trong khi sử dụng các hướng dẫn riêng biệt để đọc cổng I / O, cập nhật giá trị và viết lại sẽ mang lại các ngữ nghĩa khác nhau từ việc sử dụng các hướng dẫn đọc-sửa đổi-ghi, tất cả các hướng dẫn sử dụng cùng một ngữ nghĩa đọc-sửa đổi-ghi trên I / Cổng O.
supercat

9

Mã này gần như chắc chắn cho một bộ xử lý sử dụng tập lệnh 8051. Trên bộ xử lý đó, biến thể mã bạn cung cấp sẽ có tác dụng tương tự như bản gốc ngoại trừ việc nó sẽ chạy nhanh hơn. Thực hiện "ORL C, P2.2" khi cài đặt sẽ không có hiệu ứng có thể quan sát được ngoại trừ việc lãng phí một số chu kỳ (hai chu kỳ CPU tổng cộng 24 chu kỳ xung nhịp trên 8051 nếu tôi nhớ chính xác; có thể là một số khác trên một số biến thể khác) . Tương tự như vậy với việc thực hiện "ANL C, P2.5" khi thực hiện rõ ràng. Mặc dù có thể có một số loại bộ xử lý trong đó yêu cầu đọc một số vị trí I / O sẽ có hiệu quả rõ rệt, tôi không nghĩ rằng bất kỳ bộ xử lý kiểu 8051 nào cũng từng có hành vi như vậy đối với bất kỳ vị trí I / O có thể định địa chỉ bit nào, nhiều ít hơn cho các bit của P2.

Có lẽ mục đích của mã là để chứng minh ORL C,bitANL C,bithướng dẫn, nhưng đây có vẻ như là một ví dụ kỳ lạ để chứng minh chúng.


6

Mã lắp ráp được đưa ra có khả năng do trình biên dịch tạo ra. Đây là phiên bản chưa được tối ưu hóa của các câu lệnh C sau, trong đó P2_2P2_5là các đối tượng có thể định địa chỉ bit:

P2_2 |= 1;
P2_5 &= 0;

Điều này có vẻ tương đương P2_2 = 1;P2_5 = 0;, nhưng không phải nếu các thanh ghi có địa chỉ bit là các đối tượng dễ bay hơi. Một hoạt động đọc-sửa-ghi trên một đối tượng dễ bay hơi phải thực hiện việc đọc và ghi, theo thứ tự đó. Điều này đảm bảo rằng bất kỳ tác dụng phụ nào từ việc đọc hoặc ghi thanh ghi thực sự xảy ra.

Mặc dù tôi biết không có thanh ghi địa chỉ 8051 bit nào có tác dụng phụ, trình biên dịch không thể giả sử là không có hoặc sẽ không bao giờ có.


1
Điểm tốt về khả năng được biên dịch tạo. Tuy nhiên, sau đó nó chuyển câu hỏi sang lý do tại sao một người nào đó sẽ viết P2_2 | = 1 thay vì chỉ P2_2 = 1.
Olin Lathrop

3

Sự khác biệt thực sự giữa những điều này có thể là tinh tế.

Trong câu trả lời đơn giản của bạn, logic là đọc cổng, đặt hoặc xóa giá trị bit và sau đó ghi lại ra cổng. Lưu ý toàn bộ cổng có thể được viết lại ở đây.

Mặt khác, giải pháp sử dụng lệnh MOV bit có thể hoạt động theo cách khá khác nhau.

Không đi sâu vào chi tiết của phần cụ thể được sử dụng ở đây, rất khó để xác định xem có sự khác biệt hay không, nếu nó có vấn đề.

Hoặc đó chỉ có thể là người hướng dẫn quyết định khiến bạn phải suy nghĩ .... đó là tất cả .. công việc thực sự của anh ấy.


0

Câu trả lời duy nhất là bộ xử lý không hỗ trợ hướng dẫn 1 bit trực tiếp. Tuy nhiên, khi bit carry được sử dụng, nó biết rằng nó chỉ bị thao tác một bit.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.