用 goto + if 模拟 循环
来源:互联网 发布:女装免费加盟开淘宝店 编辑:程序博客网 时间:2024/06/05 23:57
* 循环的效率分析, 用 goto + if 模拟 循环(for, do-while, while)如果模拟费劲(if + goto 的次数统计多),说明效率低.
备注: for循环的++或--是在循环体的上面, 是低地址. 不能在循环体内更改循环条件.
思路
先用C语言将循环写出来,将汇编代码复制出来备用,将CMP换成if, 将JMP换成goto, 将 JMP的地址换成标号.
这样就可以直接直接将汇编代码按照汇编代码的含义用C代码重写. 就完成了用if + goto 模拟循环的任务
源码
/// @file 2015_1026\exam_1_3\main.c/// @brief/*** 循环的效率分析, 用 goto + if 模拟 循环(for, do-while, while)如果模拟费劲(if + goto 的次数统计多),说明效率低.备注: for循环的++或--是在循环体的上面, 是低地址. 不能在循环体内更改循环条件.*/#include <stdlib.h>#include <stdio.h>void testLoop(); ///< test real loop(for, do-while, while)void MyLoop_for(); ///< use gogo + if make our loop(for)void MyLoop_do_while(); ///< use gogo + if make our loop(do-while)void MyLoop_while(); ///< use gogo + if make our loop(while)int main(int argc, char** argv){// testLoop();MyLoop_for();MyLoop_do_while();MyLoop_while();getchar();return 0;}void testLoop(){int iIndex = 0;const int iCntMax = 3;printf("===for===\n");for (iIndex = 0; iIndex < iCntMax; iIndex++){printf("iIndex = %d\n", iIndex);}printf("===do-while===\n");iIndex = 0;do {printf("iIndex = %d\n", iIndex);} while (iIndex++ < iCntMax);printf("===while===\n");iIndex = 0;while (iIndex++ < iCntMax){printf("iIndex = %d\n", iIndex);}}void MyLoop_for(){/**29: for (iIndex = 0; iIndex < iCntMax; iIndex++)00401103 mov dword ptr [ebp-4],00040110A jmp testLoop+45h (00401115)0040110C mov eax,dword ptr [ebp-4]0040110F add eax,100401112 mov dword ptr [ebp-4],eax00401115 mov ecx,dword ptr [ebp-4]00401118 cmp ecx,dword ptr [ebp-8]0040111B jge testLoop+60h (00401130)30: {31: printf("iIndex = %d\n", iIndex);0040111D mov edx,dword ptr [ebp-4]00401120 push edx00401121 push offset string "iIndex = %d\n" (00423040)00401126 call printf (00401590)0040112B add esp,832: }0040112E jmp testLoop+3Ch (0040110c)*//// 模拟 for 循环/// 参考for循环的汇编代码int iIndex = 0;const int iCntMax = 3;printf("===sim for===\n");iIndex = 0;goto label_for_compare;label_for_next:iIndex++;label_for_compare:if (iIndex > (iCntMax - 1))goto label_for_end;printf("iIndex = %d\n", iIndex);goto label_for_next;label_for_end:;}void MyLoop_do_while(){/**37: iIndex = 0;00401103 mov dword ptr [ebp-4],038: do39: {40: printf("iIndex = %d\n", iIndex);0040110A mov eax,dword ptr [ebp-4]0040110D push eax0040110E push offset string "iIndex = %d\n" (0042302c)00401113 call printf (004015c0)00401118 add esp,841: } while (iIndex++ < iCntMax);0040111B mov ecx,dword ptr [ebp-4]0040111E mov edx,dword ptr [ebp-8]00401121 mov eax,dword ptr [ebp-4]00401124 add eax,100401127 mov dword ptr [ebp-4],eax0040112A cmp ecx,edx0040112C jl testLoop+3Ah (0040110a)*/int iIndex = 0;const int iCntMax = 3;printf("===sim do-while===\n");label_do_while:printf("iIndex = %d\n", iIndex);if (iIndex++ < iCntMax)goto label_do_while;}void MyLoop_while(){/**46: iIndex = 0;00401113 mov dword ptr [ebp-4],047: while (iIndex++ < iCntMax)0040111A mov eax,dword ptr [ebp-4]0040111D mov ecx,dword ptr [ebp-8]00401120 mov edx,dword ptr [ebp-4]00401123 add edx,100401126 mov dword ptr [ebp-4],edx00401129 cmp eax,ecx0040112B jge testLoop+60h (00401140)48: {49: printf("iIndex = %d\n", iIndex);0040112D mov eax,dword ptr [ebp-4]00401130 push eax00401131 push offset string "iIndex = %d\n" (0042301c)00401136 call printf (00401630)0040113B add esp,850: }0040113E jmp testLoop+3Ah (0040111a)51: }*/int iIndex = 0;const int iCntMax = 3;iIndex = 0;printf("===sim while===\n");label_while_begin:if (iIndex++ > (iCntMax - 1))goto label_while_end;printf("iIndex = %d\n", iIndex);goto label_while_begin;label_while_end:;}
运行效果
分析
在vsIDE中,在运行到循环入口处,切换到反汇编窗口. 将循环的反汇编代码拷贝出来。将CMP改成if, 将JMP改成goto, 即可用goto + if 完全模拟3种循环(for, do-while, while)
在相同条件下(循环条件相同,循环体代码相同), 经过比较可知 : 效率最高 => do-while => while => for => 效率最低.
效率的定义: 汇编代码行数最少.
0 0
- 用 goto + if 模拟 循环
- goto模拟循环
- 使用if和goto语句构造循环
- 使用if和goto语句构造循环
- 循环语句if语句goto的综合应用
- C语言 用if goto求n!
- C语言goto语句以及用goto语句构成循环
- C语言goto语句以及用goto语句构成循环
- 用goto实现infinite loops(死循环)
- [C++] 屏幕打印出1-1000这1000个数字,不许用循环for while,不许用分支if,不许用跳转goto
- C语言用 if + goto 实现while功能
- goto循环存储过程
- oracle goto循环
- 【C语言】"if" "switch" "goto"
- goto语句及goto构成循环
- Asp.net的条件和循环语句示例(If,Swich,While,For,Goto,foreach,Lock可直接运行)
- <s:if>标签判断<s:iterator>模拟循环的当前迭代值
- 模拟循环和递归(if-else)的方法
- 安装nginx实录
- android系统自带的主题
- nginx平滑升级
- go语音之select
- android自定义theme
- 用 goto + if 模拟 循环
- eclipse集成Android NDK说明
- MySQL的configure参数详解
- uva10310(SuperSale)
- Linux文件解压缩
- HDU 1298 T9 // 字典树,枚举,dfs
- 使用NSURLCache让本地数据来代替远程UIWebView请求
- Linux文件操作
- iPhone开发【二十三】常用IOS开源组件【第1篇】