1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

34 396 2

Đ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

Thông tin cơ bản

Định dạng
Số trang 34
Dung lượng 2,47 MB

Nội dung

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

Trang 1

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 Saukhi 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 PCSpimCử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ợpngữ (ở 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ácchương trình soạn thảo thô như Notepad, Notepad++, EditPlus…

Trang 2

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 trongchươ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ácthanh ghi, các ô nhớ liên quan

Trang 3

Cách khác để chạy chương trình nguồn: Simularor -> SetValue…, cửa sổ hiện ra, điềnvà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ớ

phần: vùng chứa mã (text segment),

vùng chứa dữ liệu (data segment)

Trang 4

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ệugiữ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ớ

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

Trang 5

Định dạng lệnh

Ý nghĩa

rd < rs+rt ;

rd < rs+rt ;rd

rdrdrs+const ;rs+const ;bitwise AND of rs with rt

rd bitwise AND of rs withconst

nhảy đến addr nếu rs == rt Cầnphải thêm delay theo sau (nop)nhảy đến addr nếu số bù 2 trong

rs >= 0 Cần thêm delaynhảy đến addr nếu số bù 2 trong

rs < 0 Cần thêm delaynhảy đến addr nếu rs != rt Cầnthêm delay

lo rs div rt; hi rs mod rthai số rs và rt ở dạng bù 2

lo rs div rt; hi rs mod rthai số rs và rt ở dạng không dấudelay sau một chu kỳ máy:

PC địa chỉ của targetgọi hàm target, $ra = PC +4

PC địa chỉ của target, thêmnop

Nhảy không điều

kiện theo giá trị

thanh ghi

Trang 6

Load byte và mở

rộng dấu

bne rs, rt, addrdiv rs, rtdivu rs, rt

j targetjal target

jr rs

lb rd, offset(base)

Trang 7

offset, offset là số bù 2Load byte và mở

Lưu byte thấp của

thanh ghi vào bộ

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 rdmult rs, rtmultu rs, rtnor rd, rs, $0nor 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ù 2rd

rdhilo

rs*rt; rs và rt làvalue(hi, lo)

hai số bù 2value(hi, lo) rs*rt; rs và rt làhai số không dấu

rdrdrdNOT từng bit của rs

Trang 8

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 bytethấp của rs, offset dạng bù 2tạo thời gian trễ cần thiết

Trang 9

rd < 0slt rd, rs, rt

rd < 0hai toán hạng dạng bù 2

rd < 0hai toán hạng dạng không dấu

rd < 0hai toán hạng dạng không dấuDịch phải có dấu

word ở địa chỉ offset + base

$rs; offset dạng bù 2rd

XOR từng bit rs và rtDịch phải luận lý

Trừ hai thanh ghi

sw rs, offset(base)xor rd, rs, rtxori rd, rs, rt

rd XOR từng bit rs và hằngsau khi mở rộng 0

Trang 10

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ụ:

.dataitem:

main:

.text.globl

.word

1main # 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:

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áclệnh

Khai báo nhãn sym là toàn cục và có thể được tham khảo từ file khácTấ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

Trang 11

Lưu chuỗi str vào bộ nhớ, không có ký tự kết thúc chuỗi (giá trị = 0) saucùng

Lưu chuỗi str vào bộ nhớ, thêm ký tự kết thúc chuỗi (giá trị = 0) sau cùngLư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 sauchỉ thị data

Khai báo dữ liệu lưu ở sym có kích thước n byte và sym là nhãn toàn cục

Dữ liệu vùng nhớ này được truy xuất thông qua thanh ghi $gp

Trang 12

nor sll srlThiết lập các tham số trong menu Simulator -> Settings:

Bare Machine ON, Allow Pseudo Instructions OFF, Load Trap File OFF, DelayedBranches ON, Delayed Loads ON, Mapped IO OFF, Quiet OFF

div divu mult

multu mfhi mfloThiết lập các tham số trong menu Simulator -> Settings:

Bare Machine ON, Allow Pseudo Instructions OFF, Load Trap File OFF, DelayedBranches ON, Delayed Loads ON, Mapped IO OFF, Quiet OFF

Trang 13

Assumes that all results fit into 32 bits.

Follows the hardware rule of keeping a new mult

two instructions away from a previous mflo.

Trang 14

sb sh swThiết lập các tham số trong menu Simulator -> Settings:

Bare Machine ON, Allow Pseudo Instructions OFF, Load Trap File OFF, DelayedBranches ON, Delayed Loads ON, Mapped IO OFF, Quiet OFF

Trang 15

$8 is base register least significant byte move next byte to low order bits 8-15

move next byte to low order bits 16-23

move next byte to low order most significant byte main:

.data

.space 1024

# base register points here

# tape buffer (1K bytes)

slti sltu sltiuThiết lập các tham số trong menu Simulator -> Settings:

Bare Machine ON, Allow Pseudo Instructions OFF, Load Trap File OFF, DelayedBranches ON, Delayed Loads ON, Mapped IO OFF, Quiet OFF

Trang 16

##

##

##

Find the Significant bits in a pattern

The significant bits are the leftmost one bit and

all its to its right

Approach: Count the number of right shifts needed

before the pattern becomes all zeros

Trang 17

$0,$0,0 exit

or jump instruction shift right one bit increment shift count

mflo mult multu nor or ori sb sh sll

slt, slti sltu, sltiu sra srl sub subu sw xor xoriThiết lập các tham số trong menu Simulator -> Settings:

Bare Machine ON, Allow Pseudo Instructions OFF, Load Trap File OFF, DelayedBranches ON, Delayed Loads ON, Mapped IO OFF, Quiet OFF

Trang 18

## characters Do this by adding 0x20 to each character in the string.

## Register Use:

##

## $8 - current character

## $10 - character pointer

Trang 19

.text globl main:

lui lbu sll loop:

beq sll addiu sb addiu lbu j sll halt:

j sll data asciiz

$0,$0,0 halt

$0,$0,0

"ABCDEFGHIJKLMNOP"

# initialize base register of the string

# get the first char of the string

# while ( char != '/0' )

#

#uncapitalize char

#replace char in string

#advance the char pointer

#get the next char of the string

# end while

# cycle sponge string:

load register $d with the positive or negative integer "value" Value may be a 16 or a 32-bit integer.

Load register $d with the value at address "exp".

"exp" is often a symbolic address.

load register $d with the address described by the expression "exp" "exp" is often a symbolic address.

no operation do nothing for one machine cycle.

Store register $d into the word at address exp.

exp can be any of several expression types that evaluate to an address

Trang 20

divide $s by $t Put the quotient in $d Operands are unsigned.

divide $s by $t Put the remainder in $d Operands are unsigned.

divu d,s,t

remu d,s,t

Thiết lập các tham số trong menu Simulator -> Settings:

SPIM 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ụ

Trang 21

# Get meal cost

# tip rate in percent

# tax rate in percent prompt: asciiz "Enter food cost: "

head1 : asciiz "Tax plus tip: "

head2 : asciiz "\nTotal cost: "

Trang 22

Các chương trình xử lý xuất nhập

SPIM cung cấp các hàm hệ thống dùng để xử lý các thao tác xuất nhập sau:

Công việcMã trong $v0Tham sốGiá trị trả về

$a0 == buffer address

$a1 == buffer lengthallocate memory

exit

910

$a0 == number of bytes

$v0 == address

$a0 == integer

$f12 == float($f12, $f13) == double

$a0 == address of string

$v0 == integer

$f0 == float($f0, $f1) == doubleSau đâ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:

string: asciiz

# end of file

# code 4 == print string

# $a0 == address of the string

# Invoke the exception handler.

# code 10 == exit

# Halt the program.

"Hello SPIM!\n"

Thiết lập các tham số trong menu Simulator -> Settings:

Bare Machine OFF, Allow Pseudo Instructions ON, Load Trap File ON, Delayed

Branches ON, Delayed Loads ON, Mapped IO OFF, Quiet OFF

Ví dụ sau in ra mẫu thư nhắc nhở trả sách một cách tự động sau khi người dùng nhập tên

người mượn sách trả trễ:

Trang 23

# overdue.asm

.text globl main:

main

# get patron name li$v0,4

la$a0,prompt syscall li$v0,8 la$a0,name li$a1,24 syscall

# print li la syscall li la syscall

$a0 ==

$a1 ==

Invoke

== read string address of buffer buffer length the operating system.

syscall data

prompt: asciiz "enter name, followed by comma-enter: "

letter: ascii "\n\nDear "

name:.space 24

body:

.ascii ascii ascii ascii

"\nYour library books are way\n"

"overdue Please return them\n"

"before we give your name\n"

"to the enforcement squad.\n"

# end of file

5.8

Dùng stack tính toán biểu thức

Thanh ghi stack pointer ($sp) dùng để quản lý stack Thanh ghi này 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 $spgiả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ứ nhất, lưu giá trị phần tử đỉnh stack vào biến

• Thứ hai, thay đổi giá trị thanh ghi $sp trỏ đến phần tử đỉnh mới

Trang 24

# PUSH the item in $t0:

addiu $sp,$sp,-4#

sw$t0,($sp)#

point to the place for the new item, store the contents of $t0 as the new top.

# POP the item into $t0:

lw$t0,($sp)#Copy top the item to $t0.

addiu $sp,$sp,4#Point to the item beneath the old top.

Thiết lập các tham số trong menu Simulator -> Settings:

Bare Machine OFF, Allow Pseudo Instructions ON, Load Trap File ON, DelayedBranches ON, Delayed Loads ON, Mapped IO ON, Quiet OFF

# Evaluate the expression ab - 12a + 18b - 7

#

# Settings: Load delays OFF; Branch delays OFF,

#Trap fileON; Pseudoinstructions ON

Trang 25

li lw addu addu lw addu addu lw addu addu done:

move$a0,$t1 syscall li$v0,10 syscall data word word

0 10 a:

bb:

5.9

Cách gọi hàm đơn giản

Lệnh jal dùng để gọi hàm, lệnh jr dùng để trở về từ hàm được gọi Lệnh nop cần đượcthêm vào sau các lệnh jal và jr

$ra <― PC+4 (the address 8 bytes away from the jal)

PC <― subload the PC with the subroutine entry point

a branch delay slot follows this instruction

PC <― $ra

A branch delay slot follows this instruction.

Các chú ý về cách gọi hàm đơn giản:

o

o

o

o

Thủ tục con được gọi bởi lệnh jal

Thủ tục con không gọi thủ tục con khác

Thủ tục con trở về chương trình gọi bằng lệnh jr $ra

Các thanh ghi được sử dụng:

$t0 - $t9 — Thủ tục con tự do sử dụng

$s0 - $s7 — Thủ tục con không được thay đổi giá trị sau khi trở về

Trang 26

$a0 - $a3 — Chứa các tham số cho thủ tục con Thủ tục con có thể thay đổi các thanh ghi này.

$v0 - $v1 — Chứa các giá trị trả về từ thủ tục con

o Thủ tục main trả điều khiển bằng cách sử dụng hàm exit của hệ thống

Thiết lập các tham số trong menu Simulator -> Settings:

Bare Machine OFF, Allow Pseudo Instructions ON, Load Trap File ON, Delayed

Branches ON, Delayed Loads ON, Mapped IO ON, Quiet OFF

Sau đây là chương trình đọc 3 số nguyên và in ra tổng của chúng:

# read in three integers and print their sum

$s1,$v0 pread

# compute the sum

# print the sum

# exit li$v0,1

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

w