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à 0):
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 r giá trị v (v 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 r.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 r bằng 0 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 r khác 0 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×106.
Dòng đầu là số nguyên n (1≤n≤500) — số dòng chương trình. n dòng tiếp theo là các dòng chương trình như mô tả.
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=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...