Cho đoạn mã Assembler sau:
ORG 0000H
MOV R1, #8
MOV A, #3BH
LAP: RR A
DJNZ R1, LAP
END.
Kết quả của thanh ghi A là:
Trả lời:
Đáp án đúng: C
Đoạn mã Assembly thực hiện các bước sau:
1. **ORG 0000H**: Khởi tạo chương trình bắt đầu từ địa chỉ 0000H.
2. **MOV R1, #8**: Gán giá trị 8 (08H) vào thanh ghi R1. R1 đóng vai trò là bộ đếm vòng lặp.
3. **MOV A, #3BH**: Gán giá trị 3BH vào thanh ghi A. Đây là giá trị khởi đầu mà chúng ta sẽ thực hiện phép toán.
4. **LAP: RR A**: Lệnh `RR A` (Rotate Right Accumulator) thực hiện dịch phải vòng (rotate right) nội dung của thanh ghi A đi 1 bit. Bit thấp nhất (LSB) sẽ được chuyển sang bit cao nhất (MSB).
5. **DJNZ R1, LAP**: Lệnh `DJNZ R1, LAP` (Decrement and Jump if Not Zero) giảm giá trị của thanh ghi R1 đi 1. Nếu R1 khác 0, chương trình sẽ nhảy về nhãn `LAP` để tiếp tục vòng lặp. Vòng lặp này sẽ được thực hiện 8 lần.
6. **END**: Kết thúc chương trình.
Bây giờ, ta sẽ mô phỏng 8 lần lặp của vòng lặp `LAP` để xem giá trị của thanh ghi A thay đổi như thế nào:
* **Lần 1:** A = 3BH = 00111011B. Sau khi `RR A`: A = 10011101B = 9DH
* **Lần 2:** A = 9DH = 10011101B. Sau khi `RR A`: A = 11001110B = CEH
* **Lần 3:** A = CEH = 11001110B. Sau khi `RR A`: A = 01100111B = 67H
* **Lần 4:** A = 67H = 01100111B. Sau khi `RR A`: A = 10110011B = B3H
* **Lần 5:** A = B3H = 10110011B. Sau khi `RR A`: A = 11011001B = D9H
* **Lần 6:** A = D9H = 11011001B. Sau khi `RR A`: A = 11101100B = ECH
* **Lần 7:** A = ECH = 11101100B. Sau khi `RR A`: A = 01110110B = 76H
* **Lần 8:** A = 76H = 01110110B. Sau khi `RR A`: A = 00111011B = 3BH
Vậy, sau khi thực hiện xong đoạn mã, giá trị của thanh ghi A là 3BH.