装配六角转储

时间:2012-03-05 18:16:24

标签: c assembly x86

我正在尝试学习x86程序集中的调试,并尝试调试我的简单C程序。但是,我对如何在内存中存储大值(如字符串)感到困惑。例如,假设我将字符串VEQ9SZ9T8I62ZCIWE6RKZDE6AZSI2存储在寄存器EBX的地址0012E965处,我查看该地址的十六进制转储,我怎么知道它的结束位置?假设我没有在该位置存储好的ASCII字符串,我怎么知道该特定地址的十六进制转储结束的位置?正如你所看到的,我是大会的初学者,所以我感谢大家的耐心和帮助。

2 个答案:

答案 0 :(得分:5)

这主要是解释问题。如何解释字符串(或内存中的任何数据)(不出意料地)由解释它的某些代码定义。从仅查看十六进制数据转储开始,您无法确定使用哪种方法创建字符串,但很可能使用了常用方法。空终止字符串很容易被尾部零点识别,一些字符串可能以字节或字符的长度为前缀。大小也可能不是在数据存储器中编码,而是作为程序中的直接值放入。

答案 1 :(得分:2)

取决于存储或生成字符串的人员。如果它是由汇编程序或C程序/库生成的,则很可能是C字符串。

对于存储字符串,有一些可能性:

  • 使用终止0字符,即C字符串。要确定字符串的长度,您必须调用strlen之类的函数。在这种情况下,字符串结束第一个0字符所在的位置。

  • 将字符串的长度存储在开头的单独变量中。长度变量可以是字节,16位,32位或64位宽度。

  • 存储字符串的长度和指向全局内存池中地址的指针。

此外,还有用于存储宽字符,UTF-8等的变体,以及所有内容之间的混合。作为汇编程序员,您可以在内部使用它。使用可由操作系统使用的格式(如文件名)或您想要使用的程序或库通用的格式是有意义的。所以C字符串可能在汇编程序中最常见。