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 assembly có nhãn (label)

    Xây dựng trình thông dịch cho một ngôn ngữ assembly mini dùng thanh ghi (register) và nhãn (label) để điều khiển luồng thực thi một cách tổng quát (không giới hạn ở cấu trúc IF/WHILE lồng nhau). Mỗi dòng chương trình là một trong các dạng sau (thanh ghi là định danh chữ cái thường, giá trị mặc định của một thanh ghi chưa từng được gán là 000):

    • ten_nhan:: khai báo một nhãn tên ten_nhan tại vị trí dòng này (không thực hiện gì).
    • SET r v, ADD r v, SUB r v: gán/cộng/trừ vào thanh ghi rrr giá trị vvv (vvv là số nguyên hoặc tên một thanh ghi khác).
    • PRINT r: in ra giá trị hiện tại của thanh ghi rrr.
    • JMP nhan: nhảy vô điều kiện tới dòng ngay sau dòng khai báo nhan:.
    • JZ r nhan: nếu giá trị thanh ghi rrr bằng 000 thì nhảy tới ngay sau nhan:; ngược lại thực hiện tiếp dòng kế.
    • JNZ r nhan: nếu giá trị thanh ghi rrr khác 000 thì nhảy tới ngay sau nhan:; ngược lại thực hiện tiếp dòng kế.
    • HALT: dừng thực thi ngay lập tức.

    Mỗi nhãn được tham chiếu bởi JMP/JZ/JNZ được đảm bảo xuất hiện đúng một lần trong chương trình dưới dạng nhan:. Dữ liệu đảm bảo tổng số lệnh được thực thi thực tế (kể cả lặp lại do nhảy) không vượt quá 5×1065 \times 10^{6}5×106.

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

      Dòng đầu là số nguyên nnn (1≤n≤5001 \le n \le 5001≤n≤500) — số dòng chương trình. nnn dòng tiếp theo là các dòng chương trình như mô tả.

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

      In ra các giá trị được lệnh PRINT xuất ra theo đúng thứ tự thực thi, mỗi giá trị một dòng.

      Ví dụ:

      Input:

      9
      SET n 4
      SET s 0
      loop:
      JZ n end
      ADD s n
      SUB n 1
      JMP loop
      end:
      PRINT s
      

      Output:

      10
      

      (vì s=4+3+2+1=10s = 4+3+2+1 = 10s=4+3+2+1=10)

    Ví dụ:

    Đầu vào:

    9
    SET n 4
    SET s 0
    loop:
    JZ n end
    ADD s n
    SUB n 1
    JMP loop
    end:
    PRINT s
    

    Đầu ra:

    10
    

    Đầu vào:

    4
    SET a 5
    ADD a 3
    PRINT a
    HALT
    

    Đầu ra:

    8
    

    Đang tải editor...