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,…,R7 (8 thanh ghi, khởi tạo giá trị 0) 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←v, trong đó v là một số nguyên hằng hoặc một thanh ghi Rj.ADD Ri, Rj, Rk: Ri←Rj+Rk.SUB Ri, Rj, Rk: Ri←Rj−Rk.MUL Ri, Rj, Rk: Ri←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=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=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×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+⋯+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=1, các thanh ghi còn lại bằng 0.
Dòng đầu chứa số nguyên n (0≤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). n 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á 109.
In ra một dòng chứa 8 số nguyên là giá trị cuối cùng của R0,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...