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] Mô phỏng máy ảo dựa trên thanh ghi

    Khác với máy ảo ngăn xếp, một máy ảo dựa trên thanh ghi (register-based VM, như trong CPython hay Lua) lưu trữ giá trị trung gian trong các thanh ghi R0,R1,…,R7R_0, R_1, \ldots, R_7R0​,R1​,…,R7​ (8 thanh ghi, khởi tạo giá trị 000) thay vì trên ngăn xếp. Chương trình gồm các dòng lệnh và nhãn (label). Một dòng chỉ chứa tên_nhãn: (không có khoảng trắng, kết thúc bằng dấu :) định nghĩa một nhãn tại vị trí đó. Tập lệnh:

    • MOV Ri, v: gán Ri←vR_i \gets vRi​←v, trong đó vvv là một số nguyên hằng hoặc một thanh ghi Rj.
    • ADD Ri, Rj, Rk: Ri←Rj+RkR_i \gets R_j + R_kRi​←Rj​+Rk​.
    • SUB Ri, Rj, Rk: Ri←Rj−RkR_i \gets R_j - R_kRi​←Rj​−Rk​.
    • MUL Ri, Rj, Rk: Ri←Rj×RkR_i \gets R_j \times R_kRi​←Rj​×Rk​.
    • JMP L: nhảy vô điều kiện đến nhãn L.
    • JZ Ri, L: nhảy đến nhãn L nếu Ri=0R_i = 0Ri​=0, ngược lại thực hiện lệnh kế tiếp.
    • JNZ Ri, L: nhảy đến nhãn L nếu Ri≠0R_i \ne 0Ri​=0, ngược lại thực hiện lệnh kế tiếp.
    • HALT: dừng chương trình.

    Chương trình luôn đảm bảo dừng sau tối đa 2×1062 \times 10^62×106 bước, và nếu không có lệnh HALT thì việc thực thi kết thúc khi con trỏ lệnh vượt quá lệnh cuối cùng.

    Ví dụ: chương trình tính tổng 1+2+⋯+51+2+\cdots+51+2+⋯+5:

    MOV R0, 5
    MOV R1, 0
    MOV R2, 1
    loop:
    JZ R0, end
    ADD R1, R1, R0
    SUB R0, R0, R2
    JMP loop
    end:
    HALT
    

    cho kết quả cuối: R0=0,R1=15,R2=1R_0=0, R_1=15, R_2=1R0​=0,R1​=15,R2​=1, các thanh ghi còn lại bằng 000.

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

      Dòng đầu chứa số nguyên nnn (0≤n≤20000 \le n \le 20000≤n≤2000) là tổng số dòng chương trình (bao gồm cả dòng lệnh và dòng nhãn). nnn dòng tiếp theo là nội dung chương trình. Các hằng số và giá trị trung gian có trị tuyệt đối không vượt quá 10910^9109.

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

      In ra một dòng chứa 8 số nguyên là giá trị cuối cùng của R0,R1,…,R7R_0, R_1, \ldots, R_7R0​,R1​,…,R7​ (theo đúng thứ tự), cách nhau bởi một dấu cách.

    Ví dụ:

    Đầu vào:

    10
    MOV R0, 5
    MOV R1, 0
    MOV R2, 1
    loop:
    JZ R0, end
    ADD R1, R1, R0
    SUB R0, R0, R2
    JMP loop
    end:
    HALT
    

    Đầu ra:

    0 15 1 0 0 0 0 0
    

    Đầu vào:

    3
    MOV R0, 5
    MOV R1, 10
    ADD R2, R0, R1
    

    Đầu ra:

    5 10 15 0 0 0 0 0
    

    Đang tải editor...