WinAli là một trình biên dịch mô hình cho Windows. Nó mô phỏng một CPU thực sự và có nghĩa là giúp sinh viên học và hiểu ngôn ngữ hội.
Bài viết Wikipedia tiếng Đức: http://de.wikipedia.org/wiki/WinAli (hiện tại không có bài viết tiếng Anh nào)
Trong trường hợp bạn muốn kiểm tra đầu ra được sản xuất của mình: Liên kết với Google Drive (bản thân chương trình bằng tiếng Đức nhưng rất dễ sử dụng ngay cả khi bạn không hiểu tiếng Đức)
Một số thông tin về WinAli (dữ liệu và cú pháp)
Loại dữ liệu:Kiểu dữ liệu duy nhất trong WinAli là "Số nguyên" dài 2 byte, trên thực tế là Nhỏ hoặc ngắn . Vì vậy, bạn không cần phải chăm sóc các loại chính xác. Điều này cũng được làm tròn khi chia.
Các biến và hằng:Các biến được định nghĩa như thế này sau các lệnh:
name DS F
- Tên rõ ràng là tên của biến
- DS là từ khóa cho một biến mới
- F xác định độ dài của biến tính theo bit; đây là không dựa trên cơ sở và thập lục phân nên F = 16 bit
Các hằng số rất giống nhau:
name DC value
- Tên chỉ đơn giản là tên của hằng số
- DC là từ khóa cho một hằng số mới
- giá trị là giá trị được gán cho hằng số đó, vd
two DC '2'
- Bạn không cần chỉ định các hằng số ở cuối mã. Bạn cũng có thể viết chúng nội tuyến với thao tác
LDA
(tải), vdLDA 0,'2'
. Điều này tải "2" vào thanh ghi 0 (bộ tích lũy).
Mã được căn chỉnh thành 4 cột được phân tách bằng khoảng trắng hoặc tab:
label command params comment
- nhãn được sử dụng cho
b label
lệnh (goto label
) và thường bị bỏ qua. - lệnh một trong các lệnh được liệt kê dưới đây.
- params một hoặc hai tham số có ít nhất một đăng ký và nếu cần thiết khác đăng ký, thay đổi, chồng hoặc địa chỉ; các tham số này được phân tách bằng dấu phẩy (
,
). - bình luận (tùy chọn) một bình luận có tiền tố
;
hoặc*
cho đến cuối dòng.
Tham chiếu mã nhỏ:
Có nhiều lệnh hơn nhưng đối với thử thách này, bạn chỉ cần những lệnh đó:
INI A
Lưu trữ đầu vào người dùng tiếp theo vào biếnA
OUTI A
Xuất ra giá trị mà biếnA
đang giữ. Bạn không thể sử dụng một đăng ký ở đây vì một số lý do.LDA 0,A
Tải giá trị củaA
vào thanh ghi 0STA 0,A
Lưu giá trị của thanh ghi 0 vào biếnA
ADD 0,A
Thêm giá trị củaA
vào giá trị của thanh ghi 0SUB 0,A
Nhân giá trị củaA
với giá trị của thanh ghi 0DIV 0,A
Chia giá trịA
theo giá trị của thanh ghi 0EOJ
Xác định kết thúc công việc tức là mã thực thi. Khai báo biến và liên tục bắt đầu sau dấu này.
Không rõ ràng cần thiết cho thử thách này:
program START 0
Đặt địa chỉ đầu tiên được thực thi thành 0 tức là dòng tiếp theo (program
chỉ là tên của chương trình nhưng cần thiết cho trình biên dịch)END program
Kết thúc chương trình tức là dừng thực thi, ngay cả khi các hoạt động khác sẽ tuân theo
Thử thách của bạn!
Viết chương trình hoặc tập lệnh lấy biểu thức toán học có số và biến không đổi và xuất mã WinAli lấy tất cả các biến làm đầu vào và xuất kết quả của biểu thức đó.
- Bạn không cần phải xuất
START
vàEND
lệnh - Mặc dù có 16 thanh ghi được định nghĩa trong WinAli, chúng tôi chỉ sử dụng thanh ghi 0, đây là bộ tích lũy cho tất cả các tính toán
- Bạn không thể sử dụng hai biến làm tham số của lệnh. Bạn phải lưu tất cả các kết quả của bạn vào bộ tích lũy (đăng ký 0)
- Đầu vào luôn ở dạng
x:=(a+b)/c
hoặc đơn giản(a+b)/c
, bạn quyết định - Bạn chỉ cần chăm sóc
+ - * / (ADD, SUB, MUL, DIV)
, vì vậy không có tính toán phức tạp như rễ, hình vuông hoặc thậm chí là xoang - Mẹo: Trước tiên hãy thử trích xuất các biểu thức đơn giản chỉ với 2 đối số,
a:=a+b
sau đóx:=a/c
- Mẹo: Chương trình của bạn được phép sử dụng các biến bổ sung (phụ trợ) nếu bạn không thể ghi đè lên các biến không được sử dụng sau này trong mã của bạn. Xác định chúng là
h1 DS F
. - Mẹo: Dòng trống là vô dụng. Cố gắng tránh chúng. (Bạn thực sự không cần chúng)
Thí dụ:
Biểu thức toán học: x: = (a + b) * c Đầu ra dự kiến (dòng trống để đọc dễ dàng hơn): INI a INI b INI c LDA 0, một THÊM 0, b MUL 0, c STA 0, một NGOÀI a EOJ một DS F b DS F c DS F
Ghi điểm:
Điểm của bạn được xác định bởi độ dài mã của bạn + độ dài đầu ra của các biểu thức sau:
x:=a+b+c*c/d
x:=(a+b)/c-d
x:=a-b*c-d/e
x:=2*a-b*c+d
- -10% nếu mã của bạn có thể xử lý dấu trừ đơn phương trong biểu thức.
Trong trường hợp hòa, câu trả lời tạo ra mã WinAli hoạt động ngắn nhất sẽ thắng.
Các giải pháp có thể không được mã hóa theo bất kỳ cách nào. Tôi sẽ xác nhận từng câu trả lời bằng các biểu thức bổ sung để đảm bảo câu trả lời của bạn là chính xác.
MUL 0,-a
? điều này là không thể bởi vì không có địa chỉ âm ( a
chỉ là một con trỏ tới một giá trị), nhưng bạn có thể trừ giá trị từ 0 để có được biểu diễn âm ( SUB 0,a
) và sau đó làm việc với giá trị âm này; bạn thậm chí có thể lưu trữ điều này trong biến ban đầu.
x:=-a*b
hay x:=a/-(b+c)
. Vì thứ tự đầu vào không được chỉ định, tôi đoán chúng ta phải sử dụng cùng tên biến trong mã WinAli, có phải vậy không? Với những hạn chế đó, có những định danh không bao giờ có trên đầu vào? Ví dụ có thể h1
là một tên biến đầu vào?