首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MIPS Linux汇编器代码对加载字节的理解

MIPS Linux汇编器代码对加载字节的理解
EN

Stack Overflow用户
提问于 2011-11-01 02:56:22
回答 1查看 490关注 0票数 0

我在这里有以下问题

我需要理解下面的MIPS反汇编代码:

代码语言:javascript
复制
.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  #

我需要解决的任务是,在我的路由器固件管理器中将Web语言ID从BIG-5改为ISO-8859-5 (没有源代码:),这样ISO-8859-5就比BIG-5多了5个字母。我已经移动了( .rodata部分中的BIG-5)文本块的右侧),这是十六进制片段:

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

更改了.text节中的指针(&C)。然而,当我运行程序时,它只加载了6个字节(我在路由器的HTML代码页中看到的是"ISO-88“而不是(ISO-8859-5)。所以我想我必须找出发展中字节的数量是固定的,然后改变它。有没有人能评论一下这段代码。非常感谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-14 19:50:30

未指定字节数。它只加载一个字和两个字节,仅此而已:

代码语言:javascript
复制
; 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个字符的字符串,它基本上是固定的,如果不对代码打补丁,那么更长的字符串将无法工作。通过加载单词并将两个sb替换为swlswr,您也许能够将其修补为7个字符的一个(8字节)。如果您确定s1是对齐的,另一个选择是加载三个字(12个字节),并仅使用sw存储后两个字,而不是swl/swr对。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7958296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档