2011-10-31 38 views
0

我這裏有以下問題MIPS Linux的彙編代碼,瞭解有關負載字節

我需要了解以下MIPS拆解代碼:

.text:00489060    la  $v0, 0x4D0000 

.text:00489064    la  $v0, 0x4D0000 

.text:00489068    addiu $v1, $v0, (aBig5 - 0x4D0000) # "BIG-5" 

.text:0048906C    lw  $v0, (aBig5 - 0x4D0000)($v0) # "BIG-5" 

.text:00489070    lbu  $a0, (aBig5+5 - 0x4D6A68)($v1) 

.text:00489074    lbu  $v1, (aBig5+4 - 0x4D6A68)($v1) 

.text:00489078    swl  $v0, 0($s1) 

.text:0048907C    swr  $v0, 3($s1) 

.text:00489080    sb  $a0, 5($s1) 

.text:00489084    b  loc_48A190 

.text:00489088    sb  $v1, 4($s1) 

.text:0048908C # --------------------------------------------------------------------------- 

.text:0048908C 

.text:0048908C loc_48908C:    # CODE XREF: cgiGetVar+B8j 

.text:0048908C    lw  $v1, (dword_4D6A5C - 0x4D0000)($v0) #"ISO-" 

.text:00489090    addiu $v0, (dword_4D6A5C - 0x4D0000) 

.text:00489094    lw  $a0, (dword_4D6A60 - 0x4D6A5C)($v0) #"8859" 

.text:00489098    swl  $v1, 0($s1) 

.text:0048909C    lbu  $a1, (byte_4D6A66 - 0x4D6A5C)($v0) # zero byte 

.text:004890A0    lbu  $a2, (byte_4D6A64 - 0x4D6A5C)($v0) # "-" 

.text:004890A4    lbu  $v0, (byte_4D6A65 - 0x4D6A5C)($v0) # "1" 

.text:004890A8    swr  $v1, 3($s1) 

.text:004890AC    swl  $a0, 4($s1) 

.text:004890B0    swr  $a0, 7($s1) 

.text:004890B4    sb  $a1, 0xA($s1) 

.text:004890B8    sb  $a2, 8($s1) 

.text:004890BC    b  loc_48A190 

.text:004890C0    sb  $v0, 9($s1) 

.text:004890C4 # 

我需要解決的是,要改變網絡語言任務在我的路由器固件管理器中,從BIG-5到ISO-8859-5的ID(沒有源:))所以ISO-8859-5比BIG-5長5個字母。我搬到了右手.RODATA部分文本塊(BIG-5))這裏是十六進制片段:

4d6a50: 68746d6c 63686172 73657400 49534f2d  htmlcharset.ISO- 
    4d6a60: 38383539 2d310000 4249472d 35000000  8859-1..BIG-5... 
    4d6a70: 53757043 484c616e 67000000 636f6e6e  SupCHLang...conn 

&改變指針.text段。但是,當我運行程序時,它只加載了6個字節(我在路由器的HTML代碼頁中看到了「ISO-88」而不是(ISO-8859-5),所以我想我必須找到發展字節數是否修改並改變它可以有人對此代碼發表評論感謝很多:)

+1

剛剛安裝openwrt;) – plaes

+0

@plaes非常感謝,但這些路由器不喜歡OpenWRT :)它喜歡vxWorks和華碩blob(WMVN25E2plus) – Rusink

回答

0

未指定字節數。它只是加載一個字和兩個字節,這就是它:

; load one word (4 bytes) into v0 
lw  $v0, (aBig5 - 0x4D0000)($v0) 
; load one byte into a0 
lbu  $a0, (aBig5+5 - 0x4D6A68)($v1) 
; load one byte into v1 
lbu  $v1, (aBig5+4 - 0x4D6A68)($v1) 
; store left part of the word from v0 
swl  $v0, 0($s1) 
; store right part of the word from v0 
swr  $v0, 3($s1) 
; store byte from a0 
sb  $a0, 5($s1) 
; store byte from v1 
sb  $v1, 4($s1) 

所以基本上固定爲5字符的字符串和較長的人會沒有打補丁的代碼工作。您可以可能能夠通過加載單詞並替換兩個sbswlswr來修補它爲7個字符(8個字節)。另一個選項,如果您確定s1已對齊,則加載三個字(12個字節)並使用sw而不是swl/swr對存儲後兩個字。

+0

謝謝,我試圖改變sb-> swl/swr,但是沒有成功:(你可以評論這些代碼的第二部分(從0048908C到下)它包含10字節字使用的例子。爲什麼當程序加載字節時,nesessary使用swl/swr和sb(lbu $ v1 aBig5 + 5 -0x4D6a68)($ v1))加載單詞(lw)後? – Rusink