Skip to the content.

VỀ CÔNG CỤ GIẢ LẬP RARS

Bắt đầu làm việc

Tải về và chạy như sau:

  1. Tải về Java Runtime Environment, JRE, để chạy công cụ RARS http://www.oracle.com/technetwork/java/javase/downloads/index.html
  2. Cài đặt JRE
  3. Tải về công cụ RARS ở URL sau https://github.com/TheThirdOne/rars

Công cụ RARS có thể thực hiện ngay mà không cần cài đặt. Click đúp vào file rars1_6.jar để chạy.

Cơ bản về giao diện lập trình IDE

Figure 1. IDE of RARS Tool

  1. Menus: Hầu hết các mục trong menu đều có các icon tương ứng
    • Di chuyển chuột lên trên của icon -> Tooltip giải thích về chức năng tương ứng sẽ hiển thị. Figure 2. Tooltip giải thích chức năng trong các Menu
    • Các mục trong menu cũng có phím tắt tương ứng.
  2. Toolbar:
    • Chứa các tính năng soạn thảo cơ bản như copy, paste, open …
    • Các tính năng gỡ lỗi (trong hình chữ nhật màu đỏ)
    • Run: chạy toàn bộ chương trình
    • Run one step at a time: chạy từng lệnh rồi dừng
    • Undo the last step: khôi phục lại trạng thái ở lệnh trước đó
    • Pause: tạm dừng quá trình chạy toàn bộ (Run)
    • Stop: kết thúc quá trình gỡ lỗi
    • Reset memory and register: khởi động lại bộ nhớ và thanh ghi
  3. Edit tab: RARS có bộ soạn thảo văn bản tích hợp sẵn với tính năng tô màu theo cú pháp, giúp người dùng dễ theo dõi mã nguồn. Đồng thời, khi lệnh được nhập mà chưa hoàn tất, một popup sẽ hiện ra để trợ giúp. Vào menu Settings / Editor… để thay đổi các thiết lập liên quan đến chức năng soạn thảo. Figure 3. Popup trợ giúp hoàn tất lệnh và giải thích lệnh
  4. Edit/Execute: Mỗi file mã nguồn ở giao diện soạn thảo có 2 cửa sổ (2 tab): Edit và Execute
    • Edit tab: viết chương trình hợp ngữ với tính năng tô màu theo cú pháp.
    • Execute tab: biên dịch chương trình hợp ngữ đã viết ở Edit tab thành mã máy, chạy và gỡ lỗi.
  5. Message Areas: Có 2 cửa sổ ở cạnh dưới của giao diện IDE.
    • Run I/O chỉ có tác dụng khi chạy chương trình.
      • Hiển thị các kết quả xuất ra console
      • Nhập dữ liệu vào cho chương trình qua console.
        RARS có tùy chọn để mọi thông tin nhập liệu vào qua console sẽ được hiển thị lại ra message area.
    • Messages được dùng để hiển thị cho các thông báo còn lại như là các thông báo lỗi trong quá trình biên dịch hay trong quá trình chạy chương trình. Click vào thông báo lỗi để chương trình tự động nhảy tới dòng lệnh gây ra lỗi.
  6. Registers: Bảng hiển thị giá trị của các thanh ghi của bộ xử lý, luôn luôn được hiển thị, bất kể chương trình hợp ngữ có được chạy hay không. Khi viết chương trình, bảng này sẽ giúp sinh viên nhớ được tên của các thanh ghi và số hiệu của chúng. Có 3 tab trong bảng này:
    • Registers: các thanh ghi số nguyên với có thứ tự từ 0 đến 31, và cả thanh ghi bộ đếm chương trình Program Counter.
    • Floating Point: các thanh ghi số thực dấu phẩy động.
    • Control and Status: các thanh ghi điều khiển và trạng thái, phục vụ cho xử lý ngắt.

Bắt đầu lập trình và hiểu các công cụ với chương trình HelloWorld

  1. Click vào file rars1_6.jar để bắt đầu chương trình.
  2. Ở thanh menu, chọn File / New để tạo một file hợp ngữ mới. image
  3. Cửa sổ soạn thảo file hợp ngữ sẽ hiện ra. Bắt đầu lập trình.
  4. Hãy gõ đoạn lệnh sau vào cửa sổ soạn thảo.
.data                   # Vung du lieu, chua cac khai bao bien
    x:      .word   0x01020304    # Bien x, khoi tao gia tri
    msg:    .asciz  "Truong Cong nghe thong tin va Truyen thong"
.text                   # Vung lenh, chua cac lenh hop ngu
   la   a0, msg         # Dua dia chi bien mesage vao thanh ghi a0
   li   a7, 4           # Gan thanh ghi a7 = 4
   ecall                # Goi ham he thong in chuoi ky tu
   
   addi t1, zero, 2     # Thanh ghi t1 = 2
   addi t2, zero, 3     # Thanh ghi t2 = 3
   add  t0, t1, t2      # Thanh ghi t0 = t1 + t2
  1. Để biên dịch chương trình hợp ngữ trên thành mã máy, thực hiện một trong các cách sau:
    • Vào menu Run / Assemble.
    • Trên thanh menu, bấm vào biểu tượng setting
    • Bấm phím tắt F3.
  2. Nếu đoạn hợp ngữ đúng, RARS sẽ chuyển từ Edit tab sang Execute tab. Execution tab

Chú ý: nếu đoạn hợp ngữ có lỗi, cửa sổ Messages sẽ hiển thị chi tiết lỗi. Bấm vào dòng thông báo lỗi để trình soạn thảo tự động nhảy tới dòng code bị lỗi, rồi tiến hành sửa lại cho đúng. image

  1. Execute tab, có 2 cửa số chính là Text Segment, và Data Segment. Text Segment và Data Segment

Chú ý: vì lý do nào đó, nếu ta khai báo biến sau chỉ thị .text hoặc ngược lại thì trình biên dịch sẽ báo lỗi hoặc bỏ qua khai báo sai đó.

  1. Execute tab, sử dụng checkbox bên dưới để thay đổi cách hiển thị dữ liệu cho dễ quan sát
    • image: hiển thị địa chỉ ở dạng số nguyên hệ 16
    • image: hiển thị giá trị thanh ghi ở dạng số nguyên hệ 16
    • image: hiển thị giá trị trong bộ nhớ ở dạng kí tự ASCII

image

  1. Ở Execute tab, trong cửa sổ Text Segment, bảng có 4 cột.

Text Segment

  1. Execute tab, trong cửa sổ Data Segment, bảng có 9 cột

Data Segment

Trong hình ảnh trên, có thể thấy rõ giá trị của biến x = 0x01020304 được hiển thị chính xác trong Data Segment khi hiển thị dữ liệu ở dạng số image, và giá trị của chuỗi “Truong Cong nghe thong tin va Truyen thong” khi hiển thị ở dạng kí tự image.

Lưu ý rằng việc lưu trữ chuỗi trong bộ nhớ ở dạng little-endian là do cách lập trình hàm phần mềm ecalll, chứ không phải do bộ xử lý RISC-V qui định. Có thể thấy, công cụ giả lập qui định hiển thị chuỗi theo kiểu big-endian.

Bấm vào cặp nút image để dịch chuyển tới vùng địa chỉ lân cận.

Bấm vào ComboBox để dịch tới vùng bộ nhớ chứa loại dữ liệu được chỉ định. Trong đó lưu ý:

image

  1. Cửa sổ Label: hiển thị tên nhãn và hằng số địa chỉ tương ứng với nhãn khi được biên dịch ra mã máy. Cửa sổ Label không tự động hiển thị. Vào menu Settings / chọn Show Labels Windows để bật tắt hiển thị cửa sổ Label. Trong ảnh sau, ta thấy các thông tin quan trọng:
    • Trong cửa số Labels cho biết:
    • x chỉ là tên gợi nhớ, x sẽ được qui đổi thành hằng số 0x10010000.
    • msg cũng chỉ là tên gợi nhớ, sẽ được qui đổi thành hằng số 0x10010004.
    • Click đúp vào tên biến, sẽ tự động chuyển sang vị trí tương ứng trong cửa sổ Data Segment.
    • Trong cửa sổ Text Segment cho biết:
    • Ở lệnh gán la a0, msg tên gợi nhớ msg đã được chuyển thành hằng số 0x10010004 thông qua cặp lệnh auipcaddi.
    • Trong cửa sổ Data Segment cho biết:
    • Để giám sát giá trị của biến x, ta mở Data Segment ở hằng số 0x10010000 sẽ nhìn thấy giá trị của x.
    • Để giám sát giá trị của biến msg, ta mở Data Segment ở hằng số 0x10010004 sẽ nhìn thấy giá trị của msg.

Chạy giả lập

  1. Tiếp tục chạy chương trình Hello World ở trên.
  2. Sử dụng slider bar để thay đổi tốc độ thực thi lệnh hợp ngữ.
    slider Mặc định, tốc độ thực thi là tối đa, và ở mức này, ta không thể can thiệp được nhiều vào quá trình hoạt động của các lệnh và kiểm soát chúng. Có thể dịch chuyển slider bar vể khoảng 2 lệnh/giây để dễ quan sát.
  3. Execute tab, chọn cách để thực thi chương trình
    • Bấm vào icon image, Run, để thực hiện toàn bộ chương trình. Khi sử dụng Run, ta quan sát dòng lệnh được tô màu vàng cho biết chương trình hợp ngữ đang được xử lý tới chỗ nào. Đồng thời, quan sát sự biến đổi dữ liệu trong cửa sổ Data Segment và cửa sổ Registers.
    • Bấm vào icon image, Reset, để khởi động lại trình giả lập về trạng thái ban đầu. Tất cả các ngăn nhớ và các thanh ghi đều được gán lại về 0.
    • Bấm vào icon image, Run one step, để thực thi chỉ duy nhất 1 lệnh rồi chờ bấm tiếp vào icon đó, để thực hiện lệnh kế tiếp.
    • Bấm vào icon image, Run one step backwards, để khôi phục lại trạng thái và quay trở lại lệnh đã thực thi trước đó.
    • Sau khi chạy xong tất cả các lệnh của ví dụ Hello Word, sẽ thấy cửa sổ Run I/O hiển thị chuỗi. image

Giả lập & gỡ rối: Quan sát sự thay đổi của các biến

Trong quá trình chạy giả lập, hãy chạy từng lệnh với chức năng Run one step. Ở mỗi lệnh, quan sát sự thay đổi giá trị trong cửa sổ Data Segment và cửa sổ Registers, và hiểu rõ ý nghĩa của sự thay đổi đó.

Giả lập & gỡ rối: Thay đổi giá trị biến khi đang chạy run-time

Trong khi đang chạy giả lập, ta có thể thay đổi giá trị của một ngăn nhớ bất kì bằng cách

  1. Nhập giá trị mới.
    image

  2. Tiếp tục chạy chương trình.

Giả lập & gỡ rối: Thay đổi giá trị thanh ghi khi đang chạy run-time

Cách làm tương tự như thay đổi giá trị của biến, áp dụng cho cửa sổ Registers.
image

Tra cứu Help

Bâm nút Help image để xem giải thích các lệnh của RISC-V, các giả lệnh, chỉ dẫn biên dịch và các hàm dịch vụ hệ thống.

Các hằng địa chỉ

Chọn menu Settings / Memory Configuration… Cửa sổ Memory Configuration chứa bảng qui định các hằng địa chỉ mà công cụ RARS sử dụng.

Theo bảng này, có thể thấy các mã lệnh luôn bắt đầu từ địa chỉ 0x00400000, còn dữ liệu luôn bắt đầu từ địa chỉ 0x10000000. image