2010-03-04 1585 views
3
 .data 
VALS: .half 0xbead, 0xface 
RES: .space 4 
    .text 
    la  $t0,VALS 
    lh $t1,($t0) 
    lhu $t2,2($t0) 
    sll $t2,$t2,16 
    or $t2,$t1,$t2 
    jal AVG 
    .word -2 
    .word -6 
    la $t4,RES 
     sw $v0,($t4) 
     li  $v0,10 
    syscall 
AVG: lw $v0,($ra) 
    lw $t3,4($ra) 
    add $v0,$v0,$t3 
    sra $v0,$v0,1 
    addi $ra,$ra,8 
    jr  $ra 

在這個MIPS代碼中,.word部分有什麼作用?我的模擬器無法處理文本部分中的數據指令。指令是做什麼的?什麼是做着.word點-2和.word -6,而不是.word -8?。MIPS彙編中的.word指令

回答

4

的指令將碼流中的字值-2和-6。如果你看一下這個塊的實際二進制表示,你會發現,在指令編碼,一些FFFFFFFEFFFFFFFA,或FEFFFFFFFAFFFFFF根據字節序的中間。

彙編器將發出2個字值得的值的數據分別-2和-6,完全不像-8一個字。

如果你看看什麼是在AVG:標籤,你會發現它使用

lw $v0, ($ra) 
lw $t3, 4($ra) 

加載2分寄存器V0和T3的話從返回地址(即你來自哪裏跳下,即來自嵌入代碼段的數據)。所以...... v0得到-2,t3得到-6。還要注意的代碼段如何增加8至$ RA返回前,躍過嵌入的數據。

總之,它是編碼的恆定值保存在寄存器中加載的碼流的一部分的方法。

現在,代碼然後做的是添加2在一起,右移,返回之前(我假設實現平均)。在這個特定的情況下做這麼多的工作沒什麼意義,當你可以直接在編譯時直接計算平均值(或者如果你直接寫入asm)。我認爲AVG應該從很多地方被調用,但即使如此,由於它期望它的代碼段的值(通常是隻讀的),我沒有看到在常量值上計算數學的意義。