Hướng dẫn thực hành mip asm trên Pcspim pdf

34 396 2
Hướng dẫn thực hành mip asm trên Pcspim pdf

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

1. Giới thiệu PCSPim PCSpim là chương trình chạy và mô phỏng chương trình hợp ngữ dành cho MIPS. Sau khi cài đặt PCSpim và chạy chương trình (Start -> All Programs -> PCSpim.exe), cửa sổ chương trình PCSpim hiện lên như hình 1. Hình 1: Cửa sổ chương trình PCSpim Cửa sổ hiển thị chia làm 4 phần: Phần trên cùng hiển thị nội dung của 32 thanh ghi của CPU và FPU. Nội dung sẽ tự động cập nhật khi chương trình hợp ngữ chạy. • Phần dưới kế tiếp hiển thị mã của chương trình ở dạng hợp ngữ, dạng mã máy (số hex cột thứ 2 từ trái qua), và địa chỉ tương ứng của mỗi lệnh (cột đầu tiên bên trái). • Phần dưới kế tiếp hiển thị dữ liệu khai báo trong chương trình hợp ngữ (ví dụ: mảng hay chuỗi) và dữ liệu trong vùng ngăn xếp khi chương trình hợp ngữ được thực thi. • Phần dưới cùng hiển thị các thông tin phụ của SPIM, thông tin về lỗi nếu có. Chương trình hợp ngữ muốn chạy được phải được load trước. Đế load chương trình hợp ngữ (ở dạng một file có đuôi mở rộng là *.asm hay *.s), thực hiện thao tác File menu -> Open -> chọn file chứa chương trình cần load. Để tạo file *.asm, chúng ta có thể dùng các chương trình soạn thảo thô như Notepad, Notepad++, EditPlus… • Hình 2. Load file chứa chương trình nguồn. Sau khi chương trình hợp ngữ đã được load, chúng ta có thể thực hiện chạy chương trình và quan sát sự thay đối giá trị các thanh ghi, các ô nhớ, vị trí và lệnh đang được thực thi … Các tác vụ chạy chương trình ở trong Simulator menu. Các bước để chạy và quan sát quá trình chạy của chương trình hợp ngữ trên PCSpim: • • Chọn Simulator -> Breakpoints… (hoặc nhấn Ctrl+B). Cửa sổ hiện ra điền vào textbox Address giá trị 0x00400000, chọn Add. Chọn Simulator -> Go (hoặc nhấn F5). Điền giá trị 0x00400000 vào texbox Starting Address, chọn OK. Giá trị của thanh ghi PC lúc này là 0x00400000. Chọn Simulator -> Single Step (hoặc nhấn F10) để chạy từng dòng lện trong chương trình. Chúng ta có thể quan sát kết quả thực hiện thông qua giá trị của các thanh ghi, các ô nhớ liên quan. • Cách khác để chạy chương trình nguồn: Simularor -> SetValue…, cửa sổ hiện ra, điền vào textbox Register Name giá trị PC, điền vào textbox Value giá trị 0x00400000. Sau đó nhấn F10 để chạy từng bước hay F5 để chạy cho đến khi gặp breakpoints. 2. Các kiến thức cơ sở 2.1 Đổi qua lại giữ số thập lục phân (hexadecimal) và số nhị phân (binary) Số thập lục phân được tạo thành từ 16 ký số: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f. Số nhị phân tạo thành từ 2 ký số: 0, 1. Một ký số thập lục phân tương ứng với số nhị phân gồm 4 ký số theo bảng sau: Ví dụ: Số thập lục phân 0xeca86420 chuyển sang số nhị phân: Số nhị phân 1 0011 0101 0111 1001 1011 1101 1111 chuyển sang số thập lục phân: 2.2 Tổ chức bộ nhớ Bộ nhớ là một mảng 232 ô nhớ 8-bit, bắt đầu từ địa chỉ 0x000000 đến địa chỉ 0xFFFFFFFF. Người dùng chỉ có thể sử dụng vùng nhớ từ 0x00400000 đến 0x7FFFFFFF. Vùng nhớ người dùng chia làm 3 phần: vùng chứa mã (text segment), vùng chứa dữ liệu (data segment) và vùng nhớ stack (stack segment). Bộ xử lý tương tác với bộ nhớ thông qua việc di chuyển dữ liệu giữa các ô nhớ và các thanh ghi. Có hai thao tác để thực hiện việc di chuyển dữ liệu giữa bộ nhớ và thanh ghi: load và store. Dữ liệu di chuyển được tổ chức thành nhóm một, hai hay bốn byte liên tục nhau theo chiều tăng địa chỉ ô nhớ. • • load: nhóm byte liên tục nhau theo chiều tăng địa chỉ ô nhớ bắt đầu từ địa chỉ được chỉ định được copy vào thanh ghi. store: nhóm dữ liệu 1, 2 byte thấp của thanh ghi hay cả 4 byte của thanh ghi được copy vào bộ nhớ từ địa chỉ được chỉ định. 2.3 Tổ chức thanh ghi MIPS có tấc cả 32 thanh ghi 32-bit có thê sử dụng trong ngôn ngữ assembly được liệt kê trong bảng sau: Bộ xử lý MIPS có bộ tính toán số học/luận lý (ALU) bên trong thực hiện các phép toán số học và luận lý trên số nguyên 32-bit. Phép toán thực hiện bởi ALU gồm hai toán hạng. Một toán hạng là số nguyên chứa trong thanh ghi, toán hạng còn lại có thể chứa trên thanh ghi hay là một phần của lệnh thực hiện phép toán (hằng số). Kết quả của phép toán luôn đặt vào thanh ghi. 3. Tập lệnh của MIPS Lệnh Cộng số bù 2 Cộng không dấu Cộng với hằng số 16 bit bù 2 Cộng với hằng số 16 bit không dấu AND từng bit AND từng bit với hằng số 16 bit Nhảy nếu bằng Nhảy nếu lớn hơn hay bằng 0 Cú pháp add rd, rs, rt addu rd, rs, rt addi rd, rs, const addiu rd, rs, const and rd, rs, rt andi rd, rs, const beq rs, rt, addr bgez rs, addr Định dạng lệnh Ý nghĩa rd < rs+rt ; rd < rs+rt ; rd rd rd rs+const ; rs+const ; bitwise AND of rs with rt rd bitwise AND of rs with const nhảy đến addr nếu rs == rt. Cần phải thêm delay theo sau (nop) nhảy đến addr nếu số bù 2 trong rs >= 0. Cần thêm delay nhảy đến addr nếu số bù 2 trong rs < 0. Cần thêm delay nhảy đến addr nếu rs != rt. Cần thêm delay lo rs div rt; hi rs mod rt hai số rs và rt ở dạng bù 2 lo rs div rt; hi rs mod rt hai số rs và rt ở dạng không dấu delay sau một chu kỳ máy: PC địa chỉ của target gọi hàm target, $ra = PC +4 PC địa chỉ của target, thêm nop trở về hàm gọi, thường dùng jr $ra , PC $ra, cần thêm lệnh delay nop theo sau rd byte đã được mở rộng dấu từ ô nhớ có địa chỉ base + Nhảy nếu nhỏ hơn bltz rs, addr 0 Nhảy nếu khác Chia hai số bù 2 Chia hai số không dấu Nhảy không điều kiện Nhảy không điều kiện và link Nhảy không điều kiện theo giá trị thanh ghi Load byte và mở rộng dấu bne rs, rt, addr div rs, rt divu rs, rt j target jal target jr rs lb rd, offset(base) offset, offset là số bù 2 Load byte và mở rộng số 0 đầu Load half-word và mở rộng dấu Load half-word và mở rộng số 0 Load hằng vào 16 bit cao Load word Chuyển giá trị từ hi vào thanh ghi Chuyển giá trị từ lo vào thanh ghi Nhân hai số bù 2 Nhân hai số không dấu NOT từng bit NOR từng bit OR từng bit OR từng bit với hằng 16 bit Lưu byte thấp của thanh ghi vào bộ nhớ Lưu hai byte thấp vào bộ nhớ Lệnh nop lbu rd, offset(base) rd byte đã được mở rộng 0 từ ô nhớ có địa chỉ base + offset, offset là số bù 2 rd 2 byte liên tiếp đã được mở rộng dấu từ ô nhớ có địa chỉ base + offset , offset là số bù 2 rd 2 byte liên tiếp đã được mở rộng 0 từ ô nhớ có địa chỉ base + offset, offset là số bù 2 2 byte cao của rd 2 byte thấp của rd 16 bit const 0x0000 lh rd, offset(base) lhu rd, offset(base) lui rd, const lw rd, offset(base) mfhi rd mflo rd mult rs, rt multu rs, rt nor rd, rs, $0 nor rd, rs, rt or rd, rs, rt or rd, rs, const sb rs, offset(base) rd word bộ nhớ có địa chỉ base + offset, offset là số bù 2 rd rd hi lo rs*rt; rs và rt là value(hi, lo) hai số bù 2 value(hi, lo) rs*rt; rs và rt là hai số không dấu rd rd rd NOT từng bit của rs NOR từng bit của rs và rt OR từng bit của rs và rt rd OR từng bit của rs và hằng sau khi mở rộng 0 byte ở offset +base byte thấp của rs, offset dạng bù 2 sh rs, offset(base) sll $0, $0, 0 2 byte ở offset +base 2 byte thấp của rs, offset dạng bù 2 tạo thời gian trễ cần thiết Dịch trái không dấu So sánh hai thanh ghi dạng bù 2 sll rd, rs, shft rd rs sau khi dich trái shft bit; 0 <= shft <32 if rs < rt rd < 1 else rd < 0 slt rd, rs, rt hai toán hạng dạng bù 2 So sánh thanh ghi với hằng bù 2 slti rd, rs, const if rs < const rd < 1 else rd < 0 hai toán hạng dạng bù 2 So sánh thanh ghi với hằng không dấu sltiu rd, rs, const if rs < const rd < 1 else rd < 0 hai toán hạng dạng không dấu So sánh hai thanh ghi không dấu sltu rd, rs, rt if rs < rt rd < 1 else rd < 0 hai toán hạng dạng không dấu Dịch phải có dấu sra rd, rs, shft rd rs sau khi dich phải shft bit và mở rộng dấu; 0 <= shft <32 rd rs sau khi dich phải shft bit; 0 <= shft <32 rd rs – rt; các toán hạng dạng bù 2 rd rs – rt; các toán hạng dạng không dấu word ở địa chỉ offset + base $rs; offset dạng bù 2 rd XOR từng bit rs và rt Dịch phải luận lý Trừ hai thanh ghi dạng bù 2 Trừ hai thanh ghi dạng không dấu Lưu thanh ghi vào bộ nhớ XOR từng bit XOR từng bit với hằng srl rd, rs, shft sub rd, rs, rt subu rd, rs, rt sw rs, offset(base) xor rd, rs, rt xori rd, rs, rt rd XOR từng bit rs và hằng sau khi mở rộng 0 4. Cú pháp của MIPS Assempler Chú thích (comment) chuỗi các từ bắt đầu bằng #, tất cả các từ bắt đầu từ # cho đến cuối dòng đều được bỏ qua. Tên định danh (identifier) là chuỗi các ký tự chữ, số, dấu gạch dưới (_) và dấu chấm (.) không bắt đầu bằng số. Tên không được trùng với các từ dành riêng là opcode của lệnh. Các ví dụ về tên định danh hợp lệ: main, loop, end_if, case1.2 Các ví dụ về tên định danh không hợp lệ: 1value# số đứng đầu b# trùng với opcode lệnh nhảy add# trùng với opcode lệnh cộng Nhãn bao gồm tên định danh theo sau là dấu hai chấm (:) được đặt ở đầu dòng. Ví dụ: .data item: main: .text .globl … .word 1 main # must be global Số (number) mặc định là cơ số 10. Số thập lục phân (hexadecimal) thêm 0x vào phía trước. Hai số 256 và 0x100 diễn tả số có cùng giá trị. Chuỗi (string) được đặt giữa hai dấu nháy kép (“). Ví dụ: “Hello world!\n”. Các ký tự đặt biệt cho phép trong chuỗi: newline tab quote \n \t \” Chỉ thị (directive) được hỗ trợ gồm có: Tên chỉ thị .text <addr> .ktext <addr> .globl sym .data <addr> Ý nghĩa Tất cả các phần theo sau cho tới chỉ thị mới (.text, .ktext, .data, .kdata) được đặt trong vùng nhớ chương trình (code segment). Tham số addr nếu có quy định địa chỉ bắt đầu của vùng nhớ chương trình dùng để lưu các phần trong phân đoạn mã chương trình này. Phần theo sau thường là các lệnh. Tất cả các phần theo sau cho tới chỉ thị mới (.text, .ktext, .data, .kdata) được đặt vào vùng nhớ nhân (kernel) của hệ điều hành. Tham số addr nếu có quy định địa chỉ bắt đầu của vùng nhớ dùng để lưu. Phần theo sau thường là các lệnh. Khai báo nhãn sym là toàn cục và có thể được tham khảo từ file khác Tất cả các phần theo sau cho tới chỉ thị mới (.text, .ktext, .data, .kdata) được đặt trong vùng nhớ dữ liệu nhân (kernel data segment). Tham số addr nếu có quy định địa chỉ bắt đầu của vùng nhớ dùng để lưu. [...]... chỉ đến phần tử trên đỉnh ở vùng nhớ stack Khi chương trình bắt đầu chạy, $sp có giá trị khởi tạo 0x7FFFFFFC Vùng nhớ stack mở rộng xuống dưới đồng nghĩa giá trị thanh ghi $sp giảm đi Tác vụ PUSH phần tử vào stack tiến hành hai việc: • Thứ nhất, thay đổi giá trị thanh ghi $sp để trỏ đến phần tử đỉnh mới • Thứ hai, lưu giá trị vào vị trí đỉnh mới Tương tự, tác vụ POP phần tử ra stack tiến hành hai việc:... thủ các chú ý này Phần cuối thủ tục con (Thực hiện trước khi trở về chương trình gọi): 8 Đưa các giá trị cần trả về vào $v0-$v1 9 Pop ra khỏi stack (theo thứ tự ngược) các thanh ghi $s0-$s7 đã lưu ở bước 5 10 Pop ra khỏi stack địa chỉ trở về $ra nếu thực hiện bước 4 11 Trở về chương trình gọi sử dụng jr $ra Phục hồi điều khiển sau khi trở về từ chương trình con (thực hiện bởi chương trình gọi): 12 Pop... Lưu n byte liên tiếp nhau b1, ,bn vào bộ nhớ Lưu n phần tử 16-bit liên tiếp nhau h1, ,hn vào bộ nhớ Lưu n phần tử 32-bit liên tiếp nhau w1, ,wn vào bộ nhớ Lưu n số thực dấu chấm động độ chính xác đơn liên tiếp nhau f1, ,fn vào bộ nhớ Lưu n số thực dấu chấm động độ chính xác đơn liên tiếp nhau d1, ,dn vào bộ nhớ Cấp phát n byte liên tiếp nhau trong phân đoạn dữ liệu hiện tại Phải đặt sau chỉ thị data Khai... set Bare Machine OFF, Allow Pseudo Instructions ON, Load Trap File OFF, Delayed Branches ON, Delayed Loads ON, Mapped IO OFF, Quiet OFF Ví dụ theo sau thực hiện việc tính hóa đơn bữa ăn: tổng phí = tiền thức ăn + 8% tiền thuế +15% tiền phục vụ ## rest .asm ## ## Total restaurant bill calculator ## ## Register Use: ## ##$s0 meal cost ##$s1 tip rate ##$s2 tax rate ##$s3 total rate ##$s4 tax+tip dollars... ON, Delayed Branches ON, Delayed Loads ON, Mapped IO ON, Quiet OFF Sau đây là ví dụ chương trình yêu cầu người dùng nhập vào 2 số X, Y Chương trình thực hiện việc tính toán các biểu thức X*X, X*Y, 5*Y và in ra kết quả lớn nhất từ giá trị của 3 biểu thức trên Chương trình main gọi thủ tục con maxExp tính và tìm ra giá trị lớn nhất từ ba biểu thức X*X, X*Y và 5*Y sau khi đã có giá trị X, Y Thủ tục con... toán các biểu thức (5.8), thanh ghi sp có thể thay đổi nên khó sử dụng thanh ghi này để quản lý biến cục bộ cố định Để quản lý biến cục bộ một cách dễ dàng, MIPS sử dụng thanh ghi fp làm địa chỉ nền cố định để quản lý biến cục bộ trong quá trình thực thi Hình bên minh họa việc dùng thanh ghi fp để quản lý biến cục bộ với các giả sử sau: • Thủ tục cha gọi thủ tục con; • Thủ tục cha sử dụng các thanh... con (Thực hiện trước khi trở về chương trình gọi): 13 14 15 16 17 Đưa các giá trị cần trả về vào $v0-$v1 $sp = $fp + không gian cần cho biến cục bộ Pop ra khỏi stack (theo thứ tự ngược) các thanh ghi $s0-$s7 đã lưu ở bước 5 Pop ra khỏi stack địa chỉ trở về $ra Pop ra khỏi stack địa chỉ trở về $ra 18 Trở về chương trình gọi sử dụng jr $ra Phục hồi điều khiển sau khi trở về từ chương trình con (thực. .. $f12 == float ($f12, $f13) == double $a0 == address of string $v0 == integer $f0 == float ($f0, $f1) == double Sau đây là ví dụ sử dụng hàm hệ thống để in chuỗi ký tự và kết thúc chương trình: # hello .asm # text globl main main: li$v0,4 la$a0,string syscall li$v0,10 syscall data string: asciiz # end of file # code 4 == print string # $a0 == address of the string # Invoke the exception handler # code... nop data prompt: asciiz "Enter an integer: " $ra # read int # service 5 # return # branch delay slot 5.10 Gọi hàm dùng stack Các chú ý khi một thủ tục gọi một thủ tục con dùng stack: Gọi thủ tục con (thực hiện bởi chương trình gọi): 1 Push vào stack các thanh ghi $t0-$t9 cần lưu giá trị Thủ tục con có thể thay đổi các thanh ghi này 2 Gán giá trị vào các tham số của thủ tục con $a0-$a3 3 Gọi thủ tục... tục con; • Thủ tục con sử dụng các thanh ghi $s0, $s3, $s5; • Thủ tục con gồm 4 biến cục bộ a, b, i, j Các chú ý khi một thủ tục gọi một thủ tục con dùng stack pointer và frame pointer: Gọi thủ tục con (thực hiện bởi chương trình gọi): 1 Push vào stack các thanh ghi $t0-$t9 cần lưu giá trị Thủ tục con có thể thay đổi các thanh ghi này 2 Gán giá trị vào các tham số của thủ tục con $a0-$a3 3 Gọi thủ tục . 1. Giới thiệu PCSPim PCSpim là chương trình chạy và mô phỏng chương trình hợp ngữ dành cho MIPS. Sau khi cài đặt PCSpim và chạy chương trình (Start -> All Programs -> PCSpim. exe), cửa. lý trên số nguyên 32-bit. Phép toán thực hiện bởi ALU gồm hai toán hạng. Một toán hạng là số nguyên chứa trong thanh ghi, toán hạng còn lại có thể chứa trên thanh ghi hay là một phần của lệnh thực. hợp ngữ (ở dạng một file có đuôi mở rộng là * .asm hay *.s), thực hiện thao tác File menu -> Open -> chọn file chứa chương trình cần load. Để tạo file * .asm, chúng ta có thể dùng các chương trình

Ngày đăng: 29/07/2014, 19:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan