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] Thông dịch máy thanh ghi có nhảy điều kiện

    Nhiều trình thông dịch trung gian (bytecode interpreter) mô phỏng một máy thanh ghi (register machine) đơn giản với các lệnh nhảy có điều kiện để thực hiện vòng lặp và rẽ nhánh.

    Chương trình gồm nnn dòng lệnh đánh số 1..n1..n1..n. Các thanh ghi được đặt tên là chuỗi chữ cái thường độ dài từ 1 đến 10, khởi tạo ngầm định bằng 000 khi được nhắc đến lần đầu. Tập lệnh:

    • SET r v: gán thanh ghi r := v (v là hằng số nguyên).
    • ADD r1 r2: r1 := r1 + r2.
    • SUB r1 r2: r1 := r1 - r2.
    • JMP L: nhảy tới dòng số L.
    • JZ r L: nếu r = 0 thì nhảy tới dòng L, ngược lại thực hiện tiếp dòng kế tiếp.
    • JNZ r L: nếu r \ne 0 thì nhảy tới dòng L, ngược lại thực hiện tiếp dòng kế tiếp.
    • HALT: dừng chương trình.

    Chương trình bắt đầu chạy tại dòng 111. Cho trước giới hạn số bước thực thi tối đa SSS. Có ba khả năng xảy ra:

    1. Dừng bình thường: chương trình thực hiện HALT trong vòng không quá SSS bước (mỗi lần thực hiện một lệnh tính là một bước, kể cả HALT).
    2. CRASH: tại một thời điểm nào đó (trước khi vượt quá SSS bước), con trỏ lệnh (program counter) rơi ra ngoài phạm vi [1,n][1, n][1,n] — do một lệnh JMP/JZ/JNZ nhảy tới dòng không tồn tại, hoặc do lệnh cuối cùng (nnn) không phải HALT/lệnh nhảy nên con trỏ tự động tăng vượt quá nnn.
    3. TIMEOUT: chương trình chạy đủ SSS bước mà vẫn chưa HALT và cũng chưa CRASH.

    Yêu cầu: xác định chương trình rơi vào trường hợp nào; nếu dừng bình thường, in ra giá trị cuối cùng của mọi thanh ghi đã từng được nhắc đến (dù ở vai trò r, r1 hay r2 trong bất kỳ lệnh nào).

    • Định dạng đầu vào:
      • Dòng 1: hai số nguyên nnn và SSS (1≤n≤10001 \le n \le 10001≤n≤1000, 1≤S≤1061 \le S \le 10^61≤S≤106).
      • nnn dòng tiếp theo, mỗi dòng một lệnh theo đúng cú pháp trên.
    • Định dạng đầu ra:
      • Nếu CRASH: in ra CRASH.
      • Nếu TIMEOUT (chưa CRASH, chưa HALT sau đúng SSS bước): in ra TIMEOUT.
      • Nếu dừng bình thường bằng HALT: in ra các thanh ghi đã từng được nhắc đến, theo thứ tự bảng chữ cái của tên thanh ghi, mỗi thanh ghi một dòng theo định dạng ten=gia_tri.

    Ví dụ:

    Đầu vào:

    6 100
    SET n 5
    SET one 1
    JZ n 6
    SUB n one
    JMP 3
    HALT
    

    Đầu ra:

    n=0
    one=1
    

    Đầu vào:

    2 10
    SET x 42
    HALT
    

    Đầu ra:

    x=42
    

    Đang tải editor...