2012-04-05 35 views
7

Theo số DCPU specification, thời gian duy nhất lệnh SET không thành công nếu giá trị a là chữ.Bạn có thể viết thư cho [PC] không?

Vậy công việc sau đây sẽ như thế nào?

SET [PC],0x1000 

Một phiên bản hữu ích hơn sẽ được thiết lập một bù đắp của PC, do đó, một vòng lặp vô hạn khá lạ sẽ là:

SET [PC+0x2],0x89C3 ; = SUB PC,0x2 
+0

"Đặc điểm DCPU" là gì? Vui lòng cung cấp liên kết nếu bạn có. –

+1

@AaronDigulla, http://0x10c.com/doc/dcpu-16.txt – Matt

+1

+1 Ồ cách tôi yêu máy tính ảo :) –

Trả lời

7

lẽ (= Tôi nghĩ rằng nó sẽ làm việc nhưng tôi đã không cố gắng) .

Điều này được gọi là "tự sửa đổi" mã và khá phổ biến thời đại 8bit vì a) giới hạn RAM và b) giới hạn kích thước mã. Mã như vậy là rất mạnh mẽ nhưng dễ bị lỗi. Nếu cơ sở mã của bạn phát triển, điều này có thể nhanh chóng trở thành cơn ác mộng bảo trì.

trường hợp sử dụng nổi tiếng:

  1. Windows 95 sử dụng mã như thế này để xây dựng đồ họa render mã trên stack.
  2. virus và trojan sử dụng như là một vector tấn công (ghi mã trên stack hay thao tác các địa chỉ trở về simluate một JMP)
  3. báo cáo chuyển đổi Simulate trên C64
+0

Sự khác biệt duy nhất Tôi có thể thấy là bạn không thể thực thi mã trên ngăn xếp với DCPU, vì các giá trị 'PC' nằm trong một không gian bộ nhớ hoàn toàn khác với ngăn xếp/ram, vì vậy không thể thực hiện' SET PC, ### 'để nhảy lên ngăn xếp. – Matt

+0

@Mat - Bạn có thể thực thi mã trên ngăn xếp với DCPU. Hãy xem phần dưới cùng của đặc tả DCPU. Kết xuất bộ nhớ của mã đó. – flumpb

+0

@kisplit, Bạn có thể đặt mã trên ngăn xếp, nhưng làm thế nào để bạn nhảy vào nó? Đó là kết xuất chỉ là mã thực thi. – Matt

4

Không có giá trị cho [PC], Vì vậy, tôi đoán bạn cần phải làm điều đó trong một cách vòng quanh bằng cách lưu trữ PC trong một cái gì đó bạn có thể sử dụng như một con trỏ (đăng ký hoặc bộ nhớ).

 
     SET A , PC 
     SET [A+3], 0x8dc3 ; SUB PC, 3 (if A can't be changed from outside SUB PC,2 works too.) 
+0

Mã đó sẽ không hoạt động vì phần mã sử dụng cùng số với ram/ngăn xếp.'A' sau câu lệnh đó sẽ đánh giá đến một số, và sau đó' [A + 3] 'sẽ tham chiếu đến vị trí đó trong bộ nhớ, thay vì trong phần mã. – Matt

+1

@Mat - Không có phần riêng biệt. Bạn có thể viết mã tự sửa đổi với DCPU. – flumpb

Các vấn đề liên quan