刚才看了一个帖子之后,看了看char b[] = "hello!";这行代码对应的汇编。
vs2005就是正常的从常量区复制:
$SG608 DB 'hello!', 00H
......
_b$ = -16 ; size = 7
......
; Line 4
mov eax, DWORD PTR $SG608
mov DWORD PTR _b$[ebp], eax
mov cx, WORD PTR $SG608+4
mov WORD PTR _b$[ebp+4], cx
mov dl, BYTE PTR $SG608+6
mov BYTE PTR _b$[ebp+6], dl
字符串加长之后(四十多个字节),用了一个循环:
; Line 4
mov ecx, 11 ; 0000000bH
mov esi, OFFSET $SG608
lea edi, DWORD PTR _b$[ebp]
rep movsd
movsw
而gcc4.3.2用了另外的办法:
movl $1819043176, -32(%rbp)
movw $8559, -28(%rbp)
movb $0, -26(%rbp)
它没有在常量区保存这个串,而是用一种另外的方式直接写在代码里了。
1819043176就是0x6C6C6568,也就是lleh
8559是0x216F,也就是!o
最后那个0自然就是'/0'了
后来我把字符串加长到了一百个字符左右,gcc还是用这种方法,很壮观的连续二十多行mov