2011-10-31 75 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