如何在IA32汇编中表示字符串?

Dzu*_*yen 1 c assembly

字符串表示为char数组.例如,如果我在地址0x80000000处有一个字符串"abcdef",则以下是否正确?

0x80000008
0x80000004: 00 00 46 45
0x80000000: 44 43 42 41
Run Code Online (Sandbox Code Playgroud)

(在堆栈中,它会长大,所以我的地址会减少)

joh*_*und 5

  1. 较低的地址始终是第一个 - 即使在堆栈中也是如此.所以你的榜样应该是:

    80000000: 41 42 43 44 
    80000004: 45 46 00 00
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您的示例实际上是字符串:"ABCDEF".字符串"abcdef"应为:

    80000000: 61 62 63 64
    80000004: 65 66 00 00 
    
    Run Code Online (Sandbox Code Playgroud)

此外,在内存转储中,默认基数为16(十六进制),因此"0x"是多余的.请注意,字符代码也是十六进制的.例如,字符串"JKLMNOP"将是:

   80000000: 4A 4B 4C 4D
   80000000: 4E 4F 50 00
Run Code Online (Sandbox Code Playgroud)
  1. 通常不会在堆栈中放置任何字符串.仅在数据存储器中.有时在堆栈中放置指向字符串的指针,即字符串的起始地址.

  2. 您(和我的)示例涉及所谓的ASCII编码.但是有许多可能的字符编码方案.例如,EBCDIC也使用8位代码,但不同于ASCII.

但是8位代码不是强制性的.例如,UTF-32使用32位代码.此外,没有必要具有固定的代码大小.UTF-8使用1到6个字节的可变代码大小,具体取决于编码的字符.