2012-04-16 34 views
0

我在大會這個代碼。大會MIPS%call16(printf的)

.data 
tabela:  .word 4, 2, 10, 1, 6 
print:  .asciiz "The value is: %d\n" 
    .text 
    .globl programa 
programa: 

    ######################## 
    Do some stuff here. 
    Value on $10 is -99 
    ######################## 


la  $4,print 
move $5,$10 
lw  $25,%call16(printf)($28) 
jalr $25 

這段代碼將打印:

The value is: -99 

我的理解是:

la $4,print加載字符串的地址上的函數調用($ A0)

的第一個參數打印

move $5,$10移至寄存器10的值(在這種情況下-99)註冊的函數調用的第二個參數

這裏是我的疑惑。 我上加載寄存器25

什麼是%call16(printf)($28)的東西嗎?這是什麼打印字符串和數字,但我不明白爲什麼...

回答

2

%call16指示彙編程序插入類型R_MIPS_CALL16的顯式重定位,這是一個16位寬的重定位對GOT條目指定的功能(在你的情況下,printf)。重定位基本上是說「用符號printf存儲的內存位置替換偏移量爲0x的值...」。然後jalr跳轉到存儲在$25中的地址。

PS。在某些情況下(如VxWorks的),ELF可執行文件,不得使用PIC,然後R_MIPS_CALL16搬遷指向在.got.plt節中的項,但這並不改變你的彙編程序的使用。

+0

感謝您的解釋 – Favolas 2012-04-17 08:09:36