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

上面的C代码在assembly(gcc-S code.C)中表示为:
movl    $6513249, -12(%rbp)
movw    $25185, -15(%rbp)
movw    $97, -17(%rbp)

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

最佳答案

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

>>> hex(6513249)
'0x636261'

cba
由于处理器是小尾数,这只是一种优化的方法,用32位移动来初始化一个小字符串,而不是冗长的逐字节复制。
这里的nul终止不是针对所有字符串处理的(movw $25185, -15(%rbp)设置ab但不针对nul终止),而是在您没有显示的代码中的其他地方处理的(注意,nul终止字节有一定的空间:第一个字符串在偏移量-12处,第二个字符串在偏移量-15处,这使得它有3个字节长,最后一个相同)

关于c - gcc汇编字符串表示形式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46942038/

10-11 16:41