Cho đoạn mã Assembler sau:SETB CMOV A, #0C9HMOV R2, #54HSUBB A, R2Kết quả của thanh ghi A là:
Đáp án đúng: C
Đoạn mã Assembler thực hiện các bước sau:
SETB C
: Đặt bit nhớ (Carry flag) C = 1.MOV A, #0C9H
: Gán giá trị 0C9H vào thanh ghi A. A = 0xC9.MOV R2, #54H
: Gán giá trị 54H vào thanh ghi R2. R2 = 0x54.SUBB A, R2
: Thực hiện phép trừ A = A - R2 - C. Vì C = 1, nên A = 0xC9 - 0x54 - 1 = 0xC9 - 0x55 = 0x74.
Vậy, sau khi thực hiện đoạn mã, giá trị của thanh ghi A là 74H.
Câu hỏi liên quan
* C/T (Timer/Counter): Chọn chế độ hoạt động của Timer, hoặc là Timer (đếm xung clock nội) hoặc là Counter (đếm xung clock ngoại).
* TR (Timer Run): Bit điều khiển cho phép Timer hoạt động (chạy) hay dừng.
Để dừng Timer khi nó đã được thiết lập, ta cần reset (đặt về 0) bit TR. Khi TR = 0, Timer sẽ dừng đếm. Việc thay đổi giá trị của C/T không ảnh hưởng trực tiếp đến việc dừng Timer.
Vậy đáp án đúng là C. TR = 0.
Để giải bài này, ta cần phân tích đoạn code và tính toán thời gian delay:
- TMOD, #02H: Timer 0 được cấu hình ở Mode 2 (8-bit auto-reload).
- TH0, # -50: Giá trị ban đầu của TH0 là -50, tương đương 256 - 50 = 206. Vậy bộ đếm sẽ đếm từ 206 đến 255, tức là 255 - 206 + 1 = 50 xung clock.
- TR0: Bắt đầu đếm.
- JNB TF0, LOOP: Chờ đến khi cờ TF0 được set (khi tràn bộ đếm).
- CLR TF0: Xóa cờ TF0.
- CPL P1.0: Đảo bit P1.0.
- SJMP LOOP: Quay lại LOOP.
Như vậy, mỗi lần tràn bộ đếm, bit P1.0 sẽ đảo trạng thái. Chu kỳ của sóng vuông trên P1.0 sẽ bằng hai lần thời gian tràn bộ đếm.
Giả sử tần số clock của vi điều khiển là 12MHz (thường gặp). Khi đó, chu kỳ của một xung clock là 1/12MHz = 1/(12 * 10^6) giây.
Vì Timer 0 ở Mode 2, nó sẽ tự động nạp lại giá trị TH0 khi tràn. Thời gian để Timer 0 tràn là 50 * (1/12MHz) = 50 / (12 * 10^6) giây.
Chu kỳ của sóng vuông trên P1.0 là 2 * (50 / (12 * 10^6)) = 100 / (12 * 10^6) giây = 100 / 12 µs ≈ 8.33 µs. Tuy nhiên, đề bài không cho tần số clock, ta xét đến các yếu tố khác.
Nếu ta giả sử tần số clock là 12MHz và mỗi lệnh máy tốn 1 chu kỳ máy thì thời gian thực hiện mỗi vòng lặp LOOP sẽ là thời gian delay cộng với thời gian thực hiện các lệnh JNB, CLR, CPL, SJMP. Tuy nhiên, câu hỏi chỉ tập trung vào tính delay.
Quan trọng nhất, ta thấy rằng giá trị TH0 được nạp là #-50 (tương đương 206). Khi bộ đếm đếm từ 206 đến 255 thì TF0 sẽ được set. Sau đó TF0 sẽ được clear và P1.0 được đảo bit. Do đó, cứ sau 50 xung clock thì P1.0 sẽ đảo trạng thái. Vì vậy, chu kỳ của sóng vuông tạo ra trên P1.0 tỉ lệ với 50 * 2 = 100.
Nếu tần số hoạt động là 12MHz thì sẽ có chu kỳ nhỏ, nhưng do không có thông tin về tần số clock và xem xét các đáp án đưa ra, đáp án C (100mS) có vẻ hợp lý nếu tần số clock đủ nhỏ.
Để chính xác, cần có thông tin về tần số clock của vi điều khiển.
Tuy nhiên, vì không có đáp án nào tính toán trực tiếp từ tần số 12MHz (nếu có) nên ta sẽ chọn đáp án gần đúng nhất dựa trên logic đếm của timer.
Để giải bài này, chúng ta cần phân tích đoạn chương trình và tính toán chu kỳ của sóng vuông tạo ra trên chân P1.1.
- Khởi tạo Timer 0:
TMOD = #01H: Timer 0 được cấu hình ở chế độ 1 (16-bit timer). - Giá trị nạp cho Timer 0:
TH0 = #3CH và TL0 = #0B0H. Giá trị này cần được chuyển đổi sang số thập phân để tính toán.
Giá trị ban đầu của timer là: (3C * 256) + B0 = (60 * 256) + 176 = 15360 + 176 = 15536. - Tính toán thời gian đếm:
Timer 16-bit có thể đếm từ 0 đến 65535. Vậy số xung clock cần thiết để tràn timer là:
65536 - 15536 = 50000 xung. - Giả sử tần số clock của vi điều khiển là 12MHz:
Chu kỳ của một xung clock là 1 / 12MHz = 1 / (12 * 10^6) giây = 0.0833 µs.
Vì Timer 0 được cấu hình ở chế độ 1 (16-bit), bộ chia tần số là 12. Do đó, thời gian cho một xung timer là 1 µs. - Thời gian để Timer 0 tràn:
Thời gian tràn = 50000 * 1µs = 50000µs = 50ms. - Tạo sóng vuông:
Chân P1.1 được đảo trạng thái (CPL P1.1) mỗi khi Timer 0 tràn. Điều này có nghĩa là thời gian ở mức cao và thời gian ở mức thấp bằng nhau. Do đó, chu kỳ của sóng vuông là gấp đôi thời gian tràn của Timer 0.
Chu kỳ = 2 * 50ms = 100ms.
Vậy, chương trình này tạo ra sóng vuông có chu kỳ 100ms trên chân P1.1.
Giá trị ban đầu của Timer 0 là: 0FE0CH (hệ Hexadecimal).
Giá trị tối đa của Timer 0 (16-bit) là: 0FFFFH (hệ Hexadecimal).
Số xung clock cần thiết để Timer 0 tràn là: 0FFFFH - 0FE0CH + 1 = 01F4H = 500 (hệ Decimal).
Giả sử tần số clock của vi điều khiển là 12MHz, thì chu kỳ máy (machine cycle) là 12/12MHz = 1µs. Do đó, mỗi xung clock của timer mất 1µs.
Thời gian trễ của một vòng lặp là: 500 * 1µs = 500µs.
Trong mỗi vòng lặp, chân P1.0 được đảo trạng thái (CPL P1.0). Vì vậy, thời gian cho một chu kỳ sóng vuông (tức là thời gian để P1.0 trở về trạng thái ban đầu) sẽ là hai lần thời gian trễ của một vòng lặp.
Chu kỳ sóng vuông = 2 * 500µs = 1000µs.
Vậy, chương trình tạo ra dòng sóng vuông có chu kỳ 1000µs trên chân P1.0.
1. `ORG 0000H`: Khai báo chương trình bắt đầu từ địa chỉ 0000H.
2. `MOV 40H, #65`: Gán giá trị 65 (hệ thập phân) vào ô nhớ có địa chỉ 40H. Giá trị này tương đương 41H trong hệ thập lục phân.
3. `MOV 41H, #19`: Gán giá trị 19 (hệ thập phân) vào ô nhớ có địa chỉ 41H. Giá trị này tương đương 13H trong hệ thập lục phân.
4. `MOV A, 40H`: Chuyển nội dung của ô nhớ có địa chỉ 40H vào thanh ghi A. Vì ô nhớ 40H đang chứa giá trị 65 (tương đương 41H), thanh ghi A sẽ nhận giá trị này.
5. `END`: Kết thúc chương trình.
Vậy, sau khi thực hiện đoạn mã, thanh ghi A sẽ có giá trị là 65 (tương đương 41H).

Bộ Đồ Án Tốt Nghiệp Ngành Trí Tuệ Nhân Tạo Và Học Máy

Bộ 120+ Đồ Án Tốt Nghiệp Ngành Hệ Thống Thông Tin

Bộ Đồ Án Tốt Nghiệp Ngành Mạng Máy Tính Và Truyền Thông

Bộ Luận Văn Tốt Nghiệp Ngành Kiểm Toán

Bộ 370+ Luận Văn Tốt Nghiệp Ngành Kế Toán Doanh Nghiệp

Bộ Luận Văn Tốt Nghiệp Ngành Quản Trị Thương Hiệu
ĐĂNG KÝ GÓI THI VIP
- Truy cập hơn 100K đề thi thử và chính thức các năm
- 2M câu hỏi theo các mức độ: Nhận biết – Thông hiểu – Vận dụng
- Học nhanh với 10K Flashcard Tiếng Anh theo bộ sách và chủ đề
- Đầy đủ: Mầm non – Phổ thông (K12) – Đại học – Người đi làm
- Tải toàn bộ tài liệu trên TaiLieu.VN
- Loại bỏ quảng cáo để tăng khả năng tập trung ôn luyện
- Tặng 15 ngày khi đăng ký gói 3 tháng, 30 ngày với gói 6 tháng và 60 ngày với gói 12 tháng.