C 语言中 static 在汇编中的实现
介绍
先看 C 语言代码
int func(int i)
{
static int a = i;
static int b = i+1;
// other code
}
下面是汇编代码:
xor eax, eax
mov al, byte_4255D8 ; 这个存储 static 是否被赋值
and eax, 1 ; 只保留最低位
test eax, eax
jnz short loc_40105E
; 如果没有初始化过这个 static
mov cl, byte_4255D8
or cl, 1 ; 将最低位赋值为 1
mov byte_4255D8, cl
mov edx, [ebp+arg_0]
mov dword_4255DC, edx ; 初始化static为函数第一个参数
loc_40105E:
xor eax, eax
mov al, byte_4255D8 ; 这个存储 static 是否被赋值
and eax, 2 ; 只保留倒数第二位
test eax, eax
jnz short loc_401087
; 如果没有初始化过这个 static
mov cl, byte_4255D8
or cl, 2 ; 将倒数第二位赋值为 1
mov byte_4255D8, cl
mov edx, [ebp+arg_0]
add edx, 1
mov dword_4255E0, edx ; 初始化static为函数第一个参数+1
基本都在注释里面了,
评论区