汇编的角度分析C语言编程基础

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
原文地址:https://www.cnblogs.com/heyhx/p/14202730.html