如何理解Assembly中的字符串数组转换

问题描述 投票:0回答:1

有一个寄存器,其中包含一个字符串。我不明白完成以下说明时发生的隐式转换。

##The following commands are all done in gdb
Set $r12="CS21"
print *$r12 -> 825381699
Set $r12="C"
print *$r12 -> 67 #ascii value of C,ok there is a clue here 
Set $r12 = "CS" 
print *$r12 -> 21315 #now I am not so sure

我尝试了一些解释,例如“CS”= 0x6783、“CS”= 0x4353 将它们转换为整数,但我无法获取上面的值。转换是如何发生的?

c assembly
1个回答
0
投票

在这种情况下,字符串被转换为字节,并且这些字节根据小端顺序组合成整数。

对于第一个,我们得到了一个字符串

CS21
。它将像这样存储在寄存器中:

Bytes order     3   2   1   0
Char            1   2   S   C
ASCII in hex    31  32  53  43

这样我们就得到了一个十六进制整数

0x31325343
,十进制就是825381699。

对于第三个,我们得到了一个字符串“CS”。同样,它会像这样存储在寄存器中:

Bytes order     3   2   1   0
Char                    S   C
ASCII in hex            53  43

这样我们就得到了一个十六进制整数

0x5343
,十进制就是21315。

对于问题的解释:

  • 0x6783
    显然是不合适的。
    67
    83
    C
    S
    的十进制ASCII,它们不应该放在一起作为十六进制。
  • 0x4353
    非常接近正确的解释。但本例中使用的是小端顺序,这意味着第一个字符应放置在最低位置。
© www.soinside.com 2019 - 2024. All rights reserved.