gcc汇编字符串表示

时间:2017-10-25 21:03:55

标签: c string gcc assembly decimal

char a[] = "abc";   // movl    $6513249, -12(%rbp)
char ab[] = "ab";  // movw    $25185, -11(%rbp) 
char abc[] = "a"; // movw    $97, -10(%rbp)

上面的C代码在程序集(gcc -S code.c)中表示为:

movl    $6513249, -12(%rbp)
movw    $25185, -15(%rbp)
movw    $97, -17(%rbp)

97是十进制的'a',但为什么“ab”是25185而“abc”是6513249?

1 个答案:

答案 0 :(得分:3)

让我们取第一行的32位整数的十六进制值:

>>> hex(6513249)
'0x636261'

cba

由于处理器是little-endian,它只是一种优化的方式来初始化一个只有32位移动的小字符串,而不是繁琐的逐字节复制。

这里的所有字符串都没有处理nul-termination(movw $25185, -15(%rbp)设置ab但是没有nul-terminate),并且它在代码中的其他地方已经完成了没有显示(请注意,nul-termination字节有空间:第一个字符串位于偏移-12,第二个字符串位于偏移-15,这使得它长3个字节,最后一个字符串相同)