#include<stdio.h> #include<stdint.h> void addToStaticVar(int value){ static uint64_t s1=4; s1+=value; printf("s1=%u\n",s1); } int main(int argc, const char* argv[]){ addToStaticVar(argc); addToStaticVar(argc+2); return 0; } |
;將s1存在data段並設初值為4 _DATA SEGMENT ?s1@?1??addToStaticVar@@9@9 DQ 0000000000000004H _DATA ENDS ;printf用到的格式字串,也是放在global區域 CONST SEGMENT ??_C@_06BGLNFPDF@s1?$DN?$CFu?6?$AA@ DB 's1=%u', 0aH, 00H CONST ENDS ;函式定義 addToStaticVar PROC ;依照x64 Microsoft calling convention,第一參數value位於rcx暫存器 mov rdx, QWORD PTR ?s1@?1??addToStaticVar@@9@9 ;把s1載入rdx暫存器 add rdx, rcx ;rdx=rdx+rcx lea rcx, OFFSET FLAT:??_C@_06BGLNFPDF@s1?$DN?$CFu?6?$AA@ ;把第一參數:字串的位址放進rcx mov QWORD PTR ?s1@?1??addToStaticVar@@9@9, rdx ;把rdx存回s1 ;第二參數要放rdx,但s1的值已經在rdx所以可以直接用 rex_jmp QWORD PTR __imp_printf ;呼叫printf addToStaticVar ENDP |
VC: cl /c function_static.c /Fafunction_static.asm /O2 /MD GCC,只輸出組合語言: gcc -m64 -S function_static.c -o function_static.s -Os GCC,同時列出C程式碼做對照: gcc>function_static.s -m64 -c -g function_static.c -Os -Wa,-a,-ad |
#include<stdio.h> #include<stdint.h> struct Class{ static uint64_t instanceCount; uint64_t value; uint64_t valueDouble; Class(int startValue){ this->value=startValue; this->valueDouble=startValue*2; this->instanceCount++; } ~Class(){ this->instanceCount--; } void printValue(){ printf("valueDouble=%u instanceCount=%u\n", this->valueDouble,this->instanceCount); } static void printInstanceCount(){ printf("instanceCount=%u\n",this->instanceCount); } }; uint64_t Class::instanceCount=0; int main(int argc, const char* argv[]){ Class obj1(argc); Class obj2(argc+5); Class obj3(argc+10); obj1.printValue(); obj2.printValue(); } |
class Class{ public: static uint64_t instanceCount; uint64_t value; …… }; |
void printValue(Class* this); |
printValue(&obj2); |
uint64_t Class_instanceCount=0; void Class_printInstanceCount(){ printf("instanceCount=%u\n",Class_instanceCount); } |
;Class::instanceCount存在bss段 _BSS SEGMENT ?instanceCount@Class@@2_KA DQ 01H DUP (?) _BSS ENDS ;printf用到的格式字串 CONST SEGMENT ??_C@_0CB@KMIDPBFM@valueDouble?$DN?$CFu?5instanceCount?$DN?$CFu?6@ DB 'valueDouble=%u instanceCount=%u', 0aH, 00H CONST ENDS ;printValue()定義 ?printValue@Class@@QEAAXXZ PROC ;第一參數放在rcx,所以此時rcx=this mov rdx, QWORD PTR [rcx+8] ;將this->valueDouble放進rdx mov r8, QWORD PTR ?instanceCount@Class@@2_KA ;將Class::instanceCount放進r8 lea rcx, OFFSET FLAT: ??_C@_0CB@KMIDPBFM@valueDouble?$DN?$CFu?5instanceCount?$DN?$CFu?6@ ;將格式字串的位址放在rcx ;此時要給printf的三個參數分別放在rcx,rdx,r8 rex_jmp QWORD PTR __imp_printf ;呼叫printf ?printValue@Class@@QEAAXXZ ENDP |
#include<stdio.h> extern int counter; extern void addCounter(int value); extern void multiplyCounter(int value); int main(){ addCounter(5); printf("counter=%d\n",counter); multiplyCounter(3); printf("counter=%d\n",counter); return 0; } |
int counter=0; void addCounter(int value){ counter+=value; } void multiplyCounter(int value){ counter*=value; } |
VC: cl /c static_global1.c /Fostatic_global1.obj /O2 /MD cl /c static_global2.c /Fostatic_global2.obj /O2 /MD cl static_global1.obj static_global2.obj /Festatic_global.exe GCC: gcc -m64 -c static_global1.c -o static_global1.o -Os gcc -m64 -c static_global2.c -o static_global2.o -Os gcc static_global1.o static_global2.o -o static_global -s |
void addCounter(int value); void multiplyCounter(int value); |
static int counter=0; static void addCounter(int value){ counter+=value; } void multiplyCounter(int value){ counter*=value; } |
VC: cl /c static_global3.c /Fostatic_global3.obj /O2 /MD cl static_global1.obj static_global3.obj /Festatic_global.exe GCC: gcc -m64 -c static_global3.c -o static_global3.o -Os gcc static_global1.o static_global3.o -o static_global -s |
static_global1.obj : error LNK2019: 無法解析的外部符號 addCounter 在函式 main 中被參考 static_global1.obj : error LNK2019: 無法解析的外部符號 counter 在函式 main 中被參考 |
Dump of file static_global2.obj File Type: COFF OBJECT COFF SYMBOL TABLE 000 00E09EB5 ABS notype Static | @comp.id 001 80000190 ABS notype Static | @feat.00 002 00000000 SECT1 notype Static | .drectve Section length 2F, #relocs 0, #linenums 0, checksum 0 004 00000000 SECT2 notype Static | .debug$S Section length 84, #relocs 0, #linenums 0, checksum 0 006 00000000 SECT3 notype Static | .bss Section length 4, #relocs 0, #linenums 0, checksum 0 008 00000000 SECT3 notype External | counter 009 00000000 SECT4 notype Static | .text$mn Section length 7, #relocs 1, #linenums 0, checksum 18848B60, selection 1 (pick no duplicates) 00B 00000000 SECT5 notype Static | .text$mn Section length 10, #relocs 2, #linenums 0, checksum 6958443, selection 1 (pick no duplicates) 00D 00000000 SECT4 notype () External | addCounter 00E 00000000 SECT5 notype () External | multiplyCounter String Table Size = 0x1F bytes Summary 4 .bss 84 .debug$S 2F .drectve 17 .text$mn |
008 00000000 UNDEF notype External | __imp_printf 009 00000000 UNDEF notype () External | addCounter 00A 00000000 UNDEF notype () External | multiplyCounter 013 00000000 UNDEF notype External | counter |
008 00000000 SECT3 notype Static | counter 00B 00000000 SECT4 notype () External | multiplyCounter |
static_global2.o: 檔案格式 elf64-x86-64 SYMBOL TABLE: 0000000000000000 l df *ABS* 0000000000000000 static_global2.c 0000000000000000 l d .text 0000000000000000 .text 0000000000000000 l d .data 0000000000000000 .data 0000000000000000 l d .bss 0000000000000000 .bss 0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack 0000000000000000 l d .eh_frame 0000000000000000 .eh_frame 0000000000000000 l d .comment 0000000000000000 .comment 0000000000000000 g F .text 0000000000000007 addCounter 0000000000000000 g O .bss 0000000000000004 counter 0000000000000007 g F .text 000000000000000e multiplyCounter |
0000000000000000 *UND* 0000000000000000 addCounter 0000000000000000 *UND* 0000000000000000 counter 0000000000000000 *UND* 0000000000000000 printf 0000000000000000 *UND* 0000000000000000 multiplyCounter |
0000000000000000 l O .bss 0000000000000004 counter 0000000000000000 g F .text 000000000000000e multiplyCounter |
活動與參展 (0)
└活動與參展資訊 (1)
└活動與製作後記 (11)
└販售會遊戲團調查 (14)
遊戲團隊「電子妖精實驗室」 (0)
└重要消息 (4)
└Cyber Sprite遊戲秘密 (2)
└製作進度 (26)
創作 (0)
└繪圖 (24)
└程式 (51)
└故事、劇本 (3)
lucky74181 給 大家:
潛水員上岸了 YT - Yumi - Till the end (audio)看更多我要大聲說5小時前