מבנה המחשב תרגיל 2

bennymips assembly, מבנה המחשבLeave a Comment

שאלה 1 :

 נתון בלוק של נתונים בזיכרון, כל נתון גודלו בית(.byte )
 כתובת תחילת הבלוק נתונה ברגיסטר $a0
 הנתון הראשון בבלוק (הבית הראשון) מציין כמה איברים (בגודל בית) יש בבלוק לא כולל –
 האיבר הראשון (הנתונים מיוצגים עם סימן signed )
 מצא את הנתון הגדול ביותר והכנס אותו לרגיסטר $v0

 

שאלה 2 :

נתון בלוק של נתונים (מספריים) בזיכרון הנתונים. כל נתון גודלו מילה ( word .)
כתובת תחילת הבלוק נתונה ברגיסטר $a0
הנתון הראשון בבלוק (המילה הראשונה) מציין כמה איברים (בגודל מילה) יש בבלוק
(הנתונים מיוצגים עם סימן signed )
כתוב תוכנית הממיינת את רשימת הנתונים בעזרת מיון בועות.

 

 

 

פיתרון שאלה 1

#the range of numbers in the 2nd complation it between 2^n-1<=x<2^n-1 (i.e: between -128 to 128- not include)
.data
array : .byte 1 2 -7 7 33 4 5 100 -126   # the data
.text
la $a0 , array          # the firsr array adress in $a1
li $a1 , 9              # the array size=9
lb $v0 , 0($a0)         # v0 = array[0]   v0=max         
loop:
lb $t1 , 0($a0)         # insert the data piont by $a0 , to $t1  
slt $v1 , $v0, $t1      # if ($v0 < $t1 ){$v1=1}; else{$v1=0} 											
beq $v1,$zero, lable    # if $v1 = 0 that mean :  max >= $t1 ($v0  contian now the highest value)then go to the next elemet                       
add $v0, $zero , $t1    #if $v1 = 1 ($v0 < $t1 )that mean : $v0 need to updated (                                      
lable:
addi $a0,$a0,1          #promote the pointer to the next element
addi $a1,$a1,-1         # size-- 
beq $a1,$zero,finish    # end of array.
j loop
finish:
add $a0,$zero,$v0       # to print the result.
li $v0,1                # system service to print
syscall 
end:

פיתרון שאלה 2

.data    
str1: .asciiz "ENTER VALUE" 
str2: .asciiz "ENTER OP CODE"  
str3: .asciiz "ERROR"  
.text
li $t6,0xffffffff       # number for errors exeption
li $s1, '+'     	# operator +
li $s2, '-'		# operator -
li $s3, '*'		# operator *
li $s4, '@'		# operator @ (for end the clculation)
li $t0,0   
li $v0,4            # code for print
la $a0 ,str1        # load string adress to $a0
syscall             # pirnt "ENTER VALUE"
li $v0,5           
syscall             # cin >> int
add $t0,$0,$v0
loop:
li $v0,4            # code for print
la $a0 ,str2       
syscall             # pirnt "ENTER OP CODE" 
li $v0,12  
syscall             # cin >> char
add $t3,$0 $v0      # to keep the operator 
beq $t3,$s4,finish  # if the operator is @ finish 
li $v0,4            # code for print
la $a0 ,str1        # load string adress to $a0
syscall             # pirnt "ENTER VALUE"
li $v0,5            # cin int
syscall 
beq $t3,$s2,sub_    # if the operator is '-'
beq $t3,$s1,add_    # if the operator is '+'
beq $t3,$s3,multi_  # if the operator is '*'
add_: 
add $t0,$t0,$v0
j loop
sub_:
sub $t0 ,$t0, $v0
j loop
multi_:
mult $t0,$v0
mflo $t0

mfhi $t5                 #  $t5 = hi
bltz $t0,chak            # if result < 0 go to chac
bne $t5,$0  Error        # if result > 0
chak:      
bne $t5,$t6 ,Error       # if $t5 (hi) != 11111111111..11  go to error
j loop
finish:
add $a0 ,$0,$t0          
li $v0,1
syscall 
j sof                   # if no errors skip the error messege
Error:
li $v0,4                # code for print
la $a0 ,str3       
syscall                 # pirnt "ERROR" 
li $v0,12   
syscall  
sof:
end:

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *