1、变量的声明?什么是赋值?
//全局变量的声明,内存的全局变量区域
int a,b,c; void Fun() {
a = 10; b = 20; c = a; }
总结:
声明变量就是告诉计算机,我要用一块内存,你给我留着,宽度和存储格式有数据类型决定.
计算机什么时候把这块内存给你,取决于变量的作用范围,如果是全局变量,在程序编译完就已经分配了空间,如果是局部变量,只有
所在的程序被调用的时候,才会分配空间.
全局变量如果不赋初始值,默认是0,但局部变量在使用前一定要赋初值.
局部变量是在缓存区中声明的,如果给初始值,那么就是缓冲区添加的数据。
2、类型转换
MOVSX 先符号扩展,再传送.
MOV AL,0FF 0FF二进制: 1111 1111,符号位为最高位 1
MOVSX CX,AL 补符号位:1111 1111 1111 1111
MOV AL,80
MOVSX CX,AL
MOVZX 先零扩展,再传送. (无符号的数,拓展)
MOV AL,0FF
MOVZX CX,AL
MOV AL,80
MOVSX CX,AL
3、什么是表达式?表达式的结果.
特点一:
表达式无论多么复杂,都只有一个结果
特点二:
只有表达式,可以编译通过,但并不生成代码,需要与赋值或者其他流程控制语句一起组合的时候才有意义.
特点三:当表达式中存在不同宽度的变量时,结果将转换为宽度最大的那个.
char a;
int b;
a = 10;
b = 20;
printf("%d",a+b);
特点四:当表达式中同时存在有符号和无符号数的时候,表达式的结构将转换为无符号数.
unsigned char a;
char b;
a = 0xFE;
b = 1;
printf("%d",a+b);
4函数的一些说明:
有返回值的函数
7: int add(int a,int b){ 00401020 push ebp 00401021 mov ebp,esp 00401023 sub esp,48h 00401026 push ebx 00401027 push esi 00401028 push edi 00401029 lea edi,[ebp-48h] 0040102C mov ecx,12h 00401031 mov eax,0CCCCCCCCh 00401036 rep stos dword ptr [edi] 8: 9: int i=10; 00401038 mov dword ptr [ebp-4],0Ah 10: int j=20; 0040103F mov dword ptr [ebp-8],14h 11: return i+j; 00401046 mov eax,dword ptr [ebp-4] 00401049 add eax,dword ptr [ebp-8]参数放到了eax中了,函数执行完了,堆栈都平衡了之后还在eax中 12: 13: }
方法,结束以后,会把函数的返回值放到寄存器中
5.查看下边代码:
源码:
#include "stdafx.h" void add(int a,int b){ int z=a==b; } int main(int argc, char* argv[]) { add(1,3); return 0; }
核心反汇编代码:
00401020 push ebp 00401021 mov ebp,esp 00401023 sub esp,44h 00401026 push ebx 00401027 push esi 00401028 push edi 00401029 lea edi,[ebp-44h] 0040102C mov ecx,11h 00401031 mov eax,0CCCCCCCCh 00401036 rep stos dword ptr [edi]00401038 mov eax,dword ptr [ebp+8] 0040103B xor ecx,ecx 0040103D cmp eax,dword ptr [ebp+0Ch] 00401040 sete cl 如果相等,CL值设置为1(set equels) 00401043 mov dword ptr [ebp-4],ecxecx=0
6.逻辑运算的反汇编:
源码:
void fun(int x,int y,int z){ if(x>1&&x>y&&z>1&&x>z){ printf("OK"); } }
上边方法的反汇编:
00401066 push ebx 00401067 push esi 00401068 push edi 00401069 lea edi,[ebp-40h] 0040106C mov ecx,10h 00401071 mov eax,0CCCCCCCCh 00401076 rep stos dword ptr [edi] 00401078 cmp dword ptr [ebp+8],1 ebp+8 第一个参数和1比较 0040107C jle fun+41h (004010a1) 小于则跳转到004010a1 0040107E mov eax,dword ptr [ebp+8] ebp+8 与 ebp+0xC第一个参数和第二个参数对比 等等等等 00401081 cmp eax,dword ptr [ebp+0Ch] 00401084 jle fun+41h (004010a1) 00401086 cmp dword ptr [ebp+10h],1 0040108A jle fun+41h (004010a1) 0040108C mov ecx,dword ptr [ebp+8] 0040108F cmp ecx,dword ptr [ebp+10h] 00401092 jle fun+41h (004010a1) 00401094 push offset string "%d" (0042201c) 00401099 call printf (004010c0) 0040109E add esp,4 19: 20: } 21: 22: } 004010A1 pop edi 004010A2 pop esi