// 程序段1 int gaussianSum(){ int i, j=0; for(i=0; i<100; i++) j+=i; return j; } |
// 程序段1(改进1) int gaussianSum(){ int i, j=0; for(i=1; i<100; i++) j+=i; return j; } |
// 程序段1(改进2) inline int gaussianSum(){ return 5050; } |
// 程序段2 int GetFactorial(int k){ int i, j=1; if((k<0) || (k>=10)) return -1; if((k<=1)) return 1 for(i=1; i<k; i++) j*=i; return j; } |
// 程序段2 (非规范改进) int GetFactorial(int k){ int i, j=1; static const int FractorialTable[]={1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800}; if((k<0) || (k>=10))return -1; return FractorialTable[k]; } |
for(i=0; i<10; i++){ j = i; k = j + i; } |
for(i=0; i<10; i++); j=i; k=j+i; |
j=i=10; k=20; |
const unsigned long nGiga = 1024L * 1024L * 1024L; |
const unsigned long nGiga = 1073741824L; |
// [假设此时b, c, d, e, f, g, h都有一个确定的非零整数值,并且, // a[]为一个包括5个整数元素的数组,其下标为0到4] a[0] = b*c; a[1] = b+c; a[2] = d*e; a[3] = b*d + c*d; a[4] = b*d*e + c*d*e; |
// [假设此时b, c, d, e, f, g, h都有一个确定的非零整数值,并且, // a[]为一个包括5个整数元素的数组,其下标为0到4] a[0] = b*c; a[1] = b+c; a[2] = d*e; a[3] = a[1] * d; a[4] = a[3] * e; |
// [假设此时b, c, d, e, f, g, h都有一个确定的非零整数值,并且, // a[]为一个包括5个整数元素的数组,其下标为0到4] a[0] = b*c; a[1] = b+c; a[3] = a[1] * d; a[4] = a[3] * e; a[2] = d*e; |
for(i=0; i<1000; i++){ for(j=0; j<1000; j++){ for(k=0; k<1000; k++){ for(l=0; l<1000; l++) do_something(i, j, k, l); } } } |
int a=0; for(int i=1; i<10; i++) for(int j=1; j<100; j++){ a += (i*j); } |
00: 0 -> a 01: 1 -> i 02: 1 -> j 03: i*j -> t 04: a+t -> a 05: j+1 -> j 06: evaluate j < 100 07: TRUE goto 03 08: i+1 -> i 09: evaluate i < 10 10: TRUE goto 02 11: [继续执行程序的其余部分] |
xor eax, eax ; a=0(eax: a) mov edx, 1 ; i=1(edx: i) push esi ; 保存esi(最后要恢复,esi作为代替j的那个循环变量) nexti: mov ecx, edx ; [t=i] mov esi, 999 ; esi=999: 此处修改了原程序的语义,但仍为1000次循环。 nextj: add eax, ecx ; [a+=t] add ecx, edx ; [t+=i] dec esi ; j-- jne SHORT nextj ; jne 等价于 jnz. [如果还需要,则再次循环] inc edx ; i++ cmp edx, 10 ; i与10比较 jl SHORT nexti ; i < 10, 再次循环 pop esi ; 恢复esi |
指令1 | 取指令 | 取数据 | 计 算 | 存数据 | |||
指令2 | 取指令 | 取数据 | 计 算 | 存数据 | |||
指令3 | 取指令 | 取数据 | 计 算 | 存数据 | |||
指令4 | 取指令 | 取数据 | 计 算 | 存数据 |
|
int a[]={1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0}; int i; int avg, max, min; avg=max=min=a[0]; for(i=1; i<(sizeof(a)/sizeof(int)); i++){ avg+=a; if(max < a) max = a; else if(min > a) min = a; } avg /= i; |
; int a[]={1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0}; mov edi, 2 ; 此时edi没有意义 mov esi, 3 ; esi也是!临时变量而已。 mov DWORD PTR _a$[esp+92], edi mov edx, 5 ; 黑名单加上edx mov eax, 7 ; eax也别跑:) mov DWORD PTR _a$[esp+132], edi mov ecx, 9 ; 就差你了,ecx ; int i; ; int avg, max, min; ; avg=max=min=a[0]; mov edi, 1 ; edi摇身一变,现在它是min了。 mov DWORD PTR _a$[esp+96], esi mov DWORD PTR _a$[esp+104], edx mov DWORD PTR _a$[esp+112], eax mov DWORD PTR _a$[esp+136], esi mov DWORD PTR _a$[esp+144], edx mov DWORD PTR _a$[esp+152], eax mov DWORD PTR _a$[esp+88], 1 ; 编译器失误 此处edi应更好 mov DWORD PTR _a$[esp+100], 4 mov DWORD PTR _a$[esp+108], 6 mov DWORD PTR _a$[esp+116], 8 mov DWORD PTR _a$[esp+120], ecx mov DWORD PTR _a$[esp+124], 0 mov DWORD PTR _a$[esp+128], 1 mov DWORD PTR _a$[esp+140], 4 mov DWORD PTR _a$[esp+148], 6 mov DWORD PTR _a$[esp+156], 8 mov DWORD PTR _a$[esp+160], ecx mov DWORD PTR _a$[esp+164], 0 mov edx, edi ; edx是max。 mov eax, edi ; 期待已久的avg, 它被指定为eax |
; for(i=1; ... mov esi, edi for_loop: ; avg+=a; mov ecx, DWORD PTR _a$[esp+esi*4+88] add eax, ecx ; if(max < a) cmp edx, ecx jge SHORT elseif_min ; max = a; mov edx, ecx ; else if(min > a) jmp SHORT elseif_min elseif_min: cmp edi, ecx jle SHORT elseif_end ; min = a; mov edi, ecx elseif_end: ; [for i=1]; i<20; i++){ inc esi cmp esi, 20 jl SHORT for_loop ; } ; avg /= i; cdq idiv esi | ; esi: i ; ecx: 暂存变量, =a ; eax: avg ; edx: max ; 有趣的代码...并不是所有的时候都有用 ; 但是也别随便删除 ; edi: min ; i++ ; i与20比较 ; avg /= i |
|
欢迎光临 编程开发论坛 (http://bbs.lihuasoft.net/) | Powered by Discuz! 6.0.0 |