zoukankan      html  css  js  c++  java
  • 汇编的角度分析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
  • 相关阅读:
    前端基础之html
    前端基础之css
    python模块之pyMySql
    MySQL基础命令
    python 异常处理、进程
    python第三方模块之paramiko模块
    python之socket网络编程
    centos65安装docker遇到的问题
    在Mac和win7上分别安装了docker后,发现原来的vagrant都启动不了了
    应用升级提示页面
  • 原文地址:https://www.cnblogs.com/heyhx/p/14202730.html
Copyright © 2011-2022 走看看