Cho đoạn mã Assembler sau:
ORG 0000H
MOV A, #18
MOV R1, #48
MOV 30H, #3EH
XRL A, @R1 61
END.
Kết quả của thanh ghi A là:
Trả lời:
Đáp án đúng: C
Đoạn mã Assembler thực hiện các bước sau:
1. **MOV A, #18**: Gán giá trị 18H vào thanh ghi A. A = 18H
2. **MOV R1, #48**: Gán giá trị 48H vào thanh ghi R1. R1 = 48H (địa chỉ)
3. **MOV 30H, #3EH**: Gán giá trị 3EH vào ô nhớ có địa chỉ 30H. Tuy nhiên, lệnh này không ảnh hưởng đến kết quả cuối cùng vì không được sử dụng.
4. **XRL A, @R1**: Thực hiện phép XOR giữa giá trị của thanh ghi A và giá trị chứa tại địa chỉ được lưu trong thanh ghi R1.
* @R1 có nghĩa là nội dung tại địa chỉ mà R1 trỏ tới. R1 = 48H, như vậy @R1 chính là nội dung tại địa chỉ 48H.
* Đề bài không cho biết giá trị tại ô nhớ 48H là gì. Tuy nhiên, có vẻ như có một sự nhầm lẫn trong đề bài, vì giá trị 61 xuất hiện ngay sau lệnh `XRL A, @R1`. Giả sử rằng địa chỉ 48H chứa giá trị là 61 (tức 3DH) thì ta có:
* A = A XOR (nội dung tại địa chỉ 48H) = 18H XOR 3DH
* 18H XOR 3DH = 00011000 XOR 00111101 = 00100101 = 25H
* Tuy nhiên, không có đáp án nào là 25H cả. Do đó, chúng ta phải giả sử rằng 61 là giá trị tại địa chỉ 48H. Như vậy @R1 = 61 = 3DH
* A = 18H XOR 30H. Chúng ta cần tìm giá trị của ô nhớ có địa chỉ 48H. Giả sử giá trị tại ô nhớ 48H là 30H. Khi đó: A = 18H XOR 30H = 00011000 XOR 00110000 = 00101000 = 28H. Không có đáp án nào là 28H cả
* Giả sử giá trị tại ô nhớ 48H là 61 = 0x3D. Ta có A = 0x18 XOR 0x3D = 0x25
* Nếu giá trị ô nhớ 48H = 0x3E (giá trị khởi tạo ở địa chỉ 30H), ta có A = 0x18 XOR 0x3E = 0x56
* Bây giờ xem xét các đáp án. Nếu kết quả của thanh ghi A là 2CH. Khi đó, giá trị tại ô nhớ 48H phải là 0x04. A = 18H XOR 0x04 = 2CH
* Nếu kết quả của thanh ghi A là 20H. Khi đó, giá trị tại ô nhớ 48H phải là 38H. A = 18H XOR 38H = 20H
Tuy nhiên, trong các đáp án thì chỉ có đáp án C có vẻ đúng nhất nếu chúng ta giả sử rằng giá trị tại địa chỉ 48H là một giá trị nào đó để khi XOR với 18H sẽ ra 2CH.
Nhưng với thông tin đề bài cho thì không thể tính ra kết quả chính xác.





