无符号数(unsigned) 和带符号数(int)的循环变量 在for循环条件判断使用中的区别1例
2012-12-10 16:53
204 查看
先看一段代码:
由于作为无符号整型的i1始终大于等于0,所以是个死循环,如果把i1改为int类型,就不再是死循环了。那么,编译以后,汇编指令怎么分别判断无符号类型或整型变量与0的大小呢?经过以下程序调试过程中的反汇编代码得知,当i1为unsigned类型是,i1>=0是通过cmp i1,0 (这里姑且用伪汇编来说明)后,使用jb Label来跳出循环。jb判断的是carry flag,即减法中有无借位(或进位),适用于判断无符号数的大小;当i1是带符号整型int变量时程序编译为cmp i1,0;jl Label ,jl当符号位不等于over
flag溢出标志时跳转(比如结果为负且没有溢出,或者两个负数相加结果为正有溢出的情况),用于带符号数的比较,本例中当结果为负时跳出循环,这是适用于带符号数比较大小的情形。总结:jg、jge、jl、jle、jnl用于带符号数的比较转移;ja,jae,hb,jbe,jna,jnb用于无符号数的比较转移。
/*以下是程序的反汇编清单*/
unsigned i1 ; for (i1=9;i1>=0;i1--) { printf("%u\n",i1); }
由于作为无符号整型的i1始终大于等于0,所以是个死循环,如果把i1改为int类型,就不再是死循环了。那么,编译以后,汇编指令怎么分别判断无符号类型或整型变量与0的大小呢?经过以下程序调试过程中的反汇编代码得知,当i1为unsigned类型是,i1>=0是通过cmp i1,0 (这里姑且用伪汇编来说明)后,使用jb Label来跳出循环。jb判断的是carry flag,即减法中有无借位(或进位),适用于判断无符号数的大小;当i1是带符号整型int变量时程序编译为cmp i1,0;jl Label ,jl当符号位不等于over
flag溢出标志时跳转(比如结果为负且没有溢出,或者两个负数相加结果为正有溢出的情况),用于带符号数的比较,本例中当结果为负时跳出循环,这是适用于带符号数比较大小的情形。总结:jg、jge、jl、jle、jnl用于带符号数的比较转移;ja,jae,hb,jbe,jna,jnb用于无符号数的比较转移。
/*以下是程序的反汇编清单*/
1: #include <stdio.h> 2: #include <windows.h> 3: int main() 4: { 00401010 push ebp 00401011 mov ebp,esp //保存栈帧指针 00401013 sub esp,44h 00401016 push ebx 00401017 push esi 00401018 push edi 00401019 lea edi,[ebp-44h] 0040101C mov ecx,11h 00401021 mov eax,0CCCCCCCCh 00401026 rep stos dword ptr [edi] 5: int i1 ; 6: for (i1=9;i1>=0;i1--) //[ebp-4]为变量i的位置,初始化为9 00401028 mov dword ptr [ebp-4],9 0040102F jmp main+2Ah (0040103a) //i1-- 00401031 mov eax,dword ptr [ebp-4] 00401034 sub eax,1 00401037 mov dword ptr [ebp-4],eax //判断i-0,/结果为负则跳转(结束循环) 0040103A cmp dword ptr [ebp-4],0 0040103E jl main+43h (00401053) 7: { 8: printf("%u\n",i1); 00401040 mov ecx,dword ptr [ebp-4] 00401043 push ecx 00401044 push offset string "%u\n" (00424024) 00401049 call printf (004011a0) 0040104E add esp,8 9: 10: } 00401051 jmp main+21h (00401031) 11: system("PAUSE"); 00401053 push offset string "PAUSE" (0042401c) 00401058 call system (00401090) 0040105D add esp,4 12: return 0; 00401060 xor eax,eax 13: } 00401062 pop edi 00401063 pop esi 00401064 pop ebx 00401065 add esp,44h 00401068 cmp ebp,esp 0040106A call __chkesp (00401220) 0040106F mov esp,ebp 00401071 pop ebp 00401072 ret
相关文章推荐
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、s witch、case 等关键字以及条件判断语句(A?B:C)和不用循环/goto/递归输出1~100的10种写法
- Java实现1+2+...+n,不用乘除符号,不用if等条件判断,不用for等循环
- c语音中for循环使用两个判断条件的写法
- linux笔记 第六天 bash编程入门之变量、条件判断、条件测试和for循环等
- 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字(for、while、if、else、switch、case)。
- vhdl 变量与信号区别 type符号使用
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句
- 关于for循环体里变量的声明的使用在c++、c#里的区别
- PHP 不用求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- for i in 算术,变量,循环判断=苦逼,坑爹; do echo $i;done(二)
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句
- Python教程学习简记1--Python数据类型和变量 字符串和编码 list和tuple 条件判断 循环 dict和set
- Python3学习笔记【基础3--list,tuple,if条件判断,for/while循环,dict字典,set集合】
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- 每天学习一算法系列(12) (求1+2+…+n,不能使用乘除法,for、while、if 、else、switch、case 等关键字以及条件判断语句)
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
- 求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句
- 算法--实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。(详细讲解)