Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Trình dịch ngược bytecode nhị phân

    Một máy ảo mã hoá mỗi lệnh (instruction) thành đúng 2 byte: byte thứ nhất là mã lệnh (opcode), byte thứ hai là toán hạng (operand, dùng 0x00 nếu lệnh không có toán hạng). Bảng mã lệnh:

    Opcode (hex) Mnemonic Có toán hạng?
    01 PUSH Có, số nguyên có dấu 8-bit (bù 2), −128≤x≤127-128 \le x \le 127−128≤x≤127
    02 ADD Không
    03 SUB Không
    04 MUL Không
    05 DUP Không
    06 POP Không
    07 HALT Không

    Cho một chuỗi hex (chữ thường, không dấu cách) biểu diễn dãy byte của chương trình đã biên dịch, hãy dịch ngược (disassemble) thành danh sách các lệnh dạng văn bản (mnemonic).

    Việc giải mã dừng lại ngay khi gặp lệnh HALT (các byte sau đó, nếu có, bị bỏ qua). Nếu chuỗi hex không chứa HALT, giải mã cho đến hết chuỗi.

    Ví dụ: chuỗi 010501fd020006000700 được giải mã thành:

    PUSH 5
    PUSH -3
    ADD
    POP
    HALT
    

    (vì byte toán hạng fd = 253, và 253−256=−3253 - 256 = -3253−256=−3 theo quy tắc bù 2 cho số 8-bit có dấu).

    • Định dạng đầu vào:

      Một dòng duy nhất chứa chuỗi hex (có thể rỗng), độ dài luôn là bội số của 4 ký tự hex (2 byte/lệnh), độ dài không vượt quá 400040004000 ký tự.

    • Định dạng đầu ra:

      In ra danh sách mnemonic đã giải mã, mỗi lệnh một dòng, theo đúng thứ tự xuất hiện trong bytecode. Lệnh PUSH in kèm giá trị toán hạng đã quy đổi dấu (ví dụ PUSH -3), các lệnh khác chỉ in tên. Nếu chuỗi hex rỗng (không có lệnh nào), in ra một dòng trống.

    Ví dụ:

    Đầu vào:

    Đầu ra:

    
    

    Đầu vào:

    010501fd020006000700

    Đầu ra:

    PUSH 5
    PUSH -3
    ADD
    POP
    HALT
    

    Đang tải editor...