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)
设置a
和b
但不针对nul终止),而是在您没有显示的代码中的其他地方处理的(注意,nul终止字节有一定的空间:第一个字符串在偏移量-12处,第二个字符串在偏移量-15处,这使得它有3个字节长,最后一个相同)关于c - gcc汇编字符串表示形式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46942038/