You are on page 1of 5

help me KTMT...???

bác nào giúp tớ bài này với....thank nhiu.....


đề: cho đoạn chương trình C sau:
i=o;j=0;
while(i<100)
{if(str1[i]=str2[i]) j++;
i++;
}
nếu i và j là 2 thanh ghi $t0 va $t1 dãy str1,str2 có địa chỉ nền năm trong thanh ghi $a0,$a1.
1.hãy viết đoạn chương trình cho CPU MIPS
2.tính số lần tham khảo của bộ nhớ của đoạn chương trình trên...
__________________
The worth of a thing is best known by the want of it !

  #2 (permalink)  
Hôm qua, 12:14 AM
Tham gia ngày: Mar 2010
dongtanphat Bài gửi: 3
 
Junior Member Thanks: 0
Thanked 2 Times in 1 Post

move $t0, $zero #i=0


move $t1, $zero #j=0
LOOP: slti $s1,$t0, 100 # $s1=0 nếu i>=100
beq $s1,$zero, Exit
sll $t2, $t0, 2 # $t2=i*4
add $t3, $t2, $a0 # address str1[i]
lw $t4, 0($t3)
add $t5, $t2, $a1 # address str2[i]
lw $t6, 0($t5)
beq $t4, $t6, L1
addi $t0, $t0, 1
j LOOP
L1: addi $t1, $t1, 1
Exit ....
Số lần tham khảo theo đoạn code trên là: 0+100x2=200.
Theo mình là vậy. Mọi người ý kiến với.

The Following 2 Users Say Thank You to dongtanphat For This Useful Post:
alongassun (Hôm qua), ngoc38 (Hôm qua)

  #3 (permalink)  
Hôm qua, 08:30 AM
Tham gia ngày: Jul 2010
alongassun Bài gửi: 8
 
Junior Member Thanks: 2
Thanked 1 Time in 1 Post

Bạn có thể nói tại sao số lần lại là 200 không?

  #4 (permalink)  
Hôm qua, 09:50 AM
Tham gia ngày: Jul 2010
alongassun Bài gửi: 8
 
Junior Member Thanks: 2
Thanked 1 Time in 1 Post

đây là BT và lời giải:


C code:while (save[i] == k) i += 1;
i lưu trong $s3, k lưu trong $s5, save[i] có địa chỉ nền nằm trong $s6
Dịch sang MIPS:

Loop:
sll $t0,$s3,2_____#dịch trái s3 2 ký số tức là nhân s3 cho 4
add $t0,$t0,$s6____#hai thao tác này dùng để tạo ra mảng $t0=save[i]
lw $t1,0($t0)_____#đọc $t0=save[i] lên thanh ghi $t1
bne $t1,$s5,Exit____#nhảy sang Nhãn Exit nếu $t1 khác $s5 save[i]!=k)
addi $s3,$s3,1_____#addi dùng để cộng thêm hằng số 1:i+=1
j Loop _________#nhảy trở lại vòng Loop
Exit:... ____________#xảy ra khi thõa:bne $t1,$s5,Exit

"___":chỉ là khoảng trắng cho dễ nhìn

thay đổi nội dung bởi: alongassun, Hôm qua lúc 11:17 AM

The Following User Says Thank You to alongassun For This Useful Post:
ngoc38 (Hôm qua)

  #5 (permalink)  
Hôm qua, 11:14 AM
Tham gia ngày: Jul 2010
alongassun Bài gửi: 8
 
Junior Member Thanks: 2
Thanked 1 Time in 1 Post

BT2:
C code:
int leaf_example (int g, h, i, j)
{ int f;
f = (g + h) - (i + j);
return f;
}
các biến g,h,i,j lần lượt lưu trong $a0,a$1,$a2,$a3.
giá trị f lưu trong $s0 ,(yêu cầu $s0 phải được lưu trên stack)
kết quả trả về lưu trong $v0

MIPS code:
addi $sp,$sp,-4____#bước này theo mình giống như khởi tạo 1 stack với con #trỏ là $sp trỏ đến
địa chỉ đầu tiên của vùng nhớ stack
sw $s0,0($sp)____#lưu $s0 vào stack theo yêu cầu đề bài

add $t0,$a0,$a1____#tương ứng $t0=g+h


add $t1,$a2,$a3____#tương ứng $t1=i+j
sub $s0,$t0,$t1_____#tương ứng $s0=(g+h)-(i+j)

add $v0,$s0,$zero___#gán $v0=$s0, $v0 là giá trị trả về theo yêu cầu đề bài
#lệnh trên có thể thay thế bởi lệnh: move $v0,$s0

lw $s0,0($sp)_____#đọc giá trị của $s0 lên stack


addi $sp,$sp,4______#con trỏ $sp của stack di chuyển thêm 4 ô nhớ(bộ nhớ #giảm đi 4 byte)
jr $ra ___________#return

thay đổi nội dung bởi: alongassun, Hôm qua lúc 11:20 AM

  #6 (permalink)  
Hôm qua, 08:00 PM
ngoc38   Tham gia ngày: Jun 2009
Bài gửi: 54
Member Thanks: 36
Thanked 8 Times in 8 Posts

Trích:

Nguyên văn bởi alongassun


BT2:
C code:
int leaf_example (int g, h, i, j)
{ int f;
f = (g + h) - (i + j);
return f;
}
các biến g,h,i,j lần lượt lưu trong $a0,a$1,$a2,$a3.
giá trị f lưu trong $s0 ,(yêu cầu $s0 phải được lưu trên stack)
kết quả trả về lưu trong $v0

MIPS code:
addi $sp,$sp,-4____#bước này theo mình giống như khởi tạo 1 stack với con #trỏ là $sp trỏ
đến địa chỉ đầu tiên của vùng nhớ stack
sw $s0,0($sp)____#lưu $s0 vào stack theo yêu cầu đề bài

add $t0,$a0,$a1____#tương ứng $t0=g+h


add $t1,$a2,$a3____#tương ứng $t1=i+j
sub $s0,$t0,$t1_____#tương ứng $s0=(g+h)-(i+j)

add $v0,$s0,$zero___#gán $v0=$s0, $v0 là giá trị trả về theo yêu cầu đề bài
#lệnh trên có thể thay thế bởi lệnh: move $v0,$s0

lw $s0,0($sp)_____#đọc giá trị của $s0 lên stack


addi $sp,$sp,4______#con trỏ $sp của stack di chuyển thêm 4 ô nhớ(bộ nhớ #giảm đi 4 byte)
jr $ra ___________#return
có thể giải thích cái chỗ lưu vô stack ko bạn?nghỉ học cái này 2 lần rồi
addi $sp,$sp,-4____#bước này theo mình giống như khởi tạo 1 stack với con #trỏ là $sp trỏ đến
địa chỉ đầu tiên của vùng nhớ stack
sw $s0,0($sp)____#lưu $s0 vào stack theo yêu cầu đề bài

  #7 (permalink)  
Hôm qua, 09:01 PM
alongassun   Tham gia ngày: Jul 2010
Junior Member Bài gửi: 8
Thanks: 2
Thanked 1 Time in 1 Post

mình có thể giải thích đươc một tý cho bạn:


#Nguyên nhân xuất hiện số 4:
MIPS lưu dữ liệu trong bộ nhớ theo nguyên tắc Alignment Restriction nghĩa là các đối tượng
lưu trong bộ nhớ phải bắt đầu tại địa chỉ là bội số của đối tượng đó.Do đó đối với các lệnh lw
và sw thì độ dời phải là bội số của 4.(lw:load word)
#$sp chính là con trỏ mà MIPS đã mặc định.muốn dùng stack thì phải thông qua con trỏ
này.Con trỏ này chỉ phải chỉ đến top trong stack nó gần giống như stack trong CTDL&GT.sau
mỗi lần save hay load phải dịch chuyển con trỏ này một độ dời là 4.(Cụ thể trước khi save thì
$sp=$sp-4;sau khi load thì $sp=$sp+4):

addi $sp,$sp,-4
sw $s0,0($sp)
/---------------
lw $s0,0($sp)
addi $sp,$sp,4

thay đổi nội dung bởi: alongassun, Hôm qua lúc 09:04 PM

You might also like