吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10872|回复: 189
收起左侧

[分享] C语言基础第一课:初识C语言

    [复制链接]
niucaidi 发表于 2021-7-9 20:09
本帖最后由 niucaidi 于 2021-7-9 20:17 编辑

C语言第一课学习目标:

1. 运行第一个C语言的程序
2. 熟悉VC开发环境
3. C函数的格式
4. C函数的调用
5. 函数的反汇编分析——空函数
6. 函数的反汇编分析——简单功能
7. 函数的反汇编分析——嵌套调用

运行第一个C语言的程序,熟悉VC开发环境

    #include <stdio.h>  //头文件

    int main()  //程序入口点
    {
        printf("Hello Word!");
        return 0;
    }

C函数的格式

  1. 无参数、无返回值的函数格式

    void 函数名()
    {
    
            //代码
    }
  2. 有参数,无返回值的函数格式

    void 函数名(参数类型 参数名,参数类型 参数名)
    {
    
             //代码
    }
  3. 裸函数

    void __declspec(naked) Function()
    {
              //此处可以无任何代码
    }
  4. 如何在C语言里写汇编

    void __declspec(naked) Function()
    {
    //通过汇编写一个函数实现任意两个数相加
    __ASM
    {   
    
       //提升堆栈
       push ebp
       mov ebp,esp
       add esp,0x40
    
       //保护现场
       push ebx
       push esi
       push edi
    
       //填充溢出缓冲区
       mov ecx,0x10
       mov eax,0xCCCCCCCC
       lea edi,dword ptr ss:[ebp-0x40]
       ret stos dword ptr es:[edi]
    
       //实现功能
       mov eax,dword ptr ss:[ebp+8]
       add eax,dword ptr ss:[ebp+c]
    
       //恢复现场
       pop edi
       pop esi
       pop ebx
    
       //恢复原始堆栈
       mov esp,ebp
       pop ebp
    
       //返回调用Call的下一行
       ret
    
       //平衡堆栈(假设传了两个参数)
       add esp,0x8
    }
    }

    调用约定

    调用约定 参数压栈顺序 平衡堆栈
    __cdecl 从右至左入栈 调用者清理堆栈
    __stdcall 从右至左入栈 自身清理堆栈
    __fastcall ECX/EDX传递前两个参数,剩下的参数从右至左入栈 自身清理堆栈

    观察下列三个函数在汇编中参数是如何入栈的

    • 例1.
      int __cdecl plus1(int x,int y)
      {
      return x+y;
      }
    • 例2.
      int __stdcall plus1(int x,int y)
      {
      return x+y;
      }
    • 例3.
      int __fastcall plus1(int x,int y,int l,int k)
      {
      return x+y+l+k;
      }

免费评分

参与人数 46吾爱币 +38 热心值 +45 收起 理由
z243546927 + 1 + 1 热心回复!学的时候没有看到这个
y2507 + 1 + 1 谢谢@Thanks!
JDBJXB + 1 + 1 谢谢@Thanks!
chyswapj + 1 + 1 第一次注册,希望以后和大家友好相处,第一次注册就找到了这么好帖子,不错.
yanhuo521 + 1 + 1 有点难,小白看不懂
hhdhxb + 1 用心讨论,共获提升!
sk0wapj + 1 热心回复!
ttxs1981 + 1 + 1 用心讨论,共获提升!
slact + 1 + 1 谢谢@Thanks!
shawn1005 + 1 + 1 谢谢@Thanks!
controlr + 1 我很赞同!
邬yu + 1 热心回复!
savvy + 1 + 1 谢谢@Thanks!
xtssh87127 + 1 + 1 谢谢@Thanks!
theflash1 + 1 + 1 我很赞同!
贼怕辣 + 1 + 1 热心回复!
q11596048 + 1 我很赞同!
capf2000 + 1 + 1 我很赞同!
夕落枫雪 + 1 + 1 谢谢@Thanks!
火树银花 + 1 + 1 谢谢@Thanks!
炒酸奶 + 1 + 1 我很赞同!
it_harry + 1 + 1 谢谢@Thanks!
CheungZzzz + 1 + 1 谢谢@Thanks!
haier77 + 1 + 1 谢谢@Thanks!
阳三叠 + 1 + 1 我很赞同!
youngapt + 1 用心讨论,共获提升!
常念溟 + 1 + 1 热心回复!
wsbjw + 1 + 1 谢谢@Thanks!
东山浪子 + 1 + 1 谢谢@Thanks!
zmxyshy + 1 + 1 谢谢@Thanks!
JetJerry + 1 + 1 用心讨论,共获提升!
dgy + 1 谢谢@Thanks!
wuboxun + 1 + 1 谢谢@Thanks!
bailemenmlbj + 1 + 1 谢谢@Thanks!
孤独枫 + 1 + 1 用心讨论,共获提升!
Cool_Breeze + 1 第一课整的太猛了!
是随风啊 + 1 谢谢@Thanks!
nmy124 + 1 + 1 谢谢@Thanks!
man2924981 + 1 + 1 我很赞同!
Vardven + 1 + 1 我很赞同!
sam喵喵 + 1 + 1 谢谢@Thanks!温故知新
hui888666000 + 1 + 1 用心讨论,共获提升!
胖子来了 + 1 + 1 用心讨论,共获提升!
雷欧库珀 + 1 + 1 我很赞同!
听说免费注册 + 1 + 1 谢谢@Thanks!
用户名是我爱你 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| niucaidi 发表于 2021-7-10 14:21
本帖最后由 niucaidi 于 2021-7-10 14:22 编辑
用__declspec(naked)裸函数实现下面的功能                                

练习目的:                                

(1) 熟悉堆栈结构                                

(2) 参数、局部变量的位置                                

(3) 返回值存储的位置                                

int plus(int x,int y,int z)                                
{                                
        int a = 2;                        
        int b = 3;                        
        int c = 4;                        
        return x+y+z+a+b+c;                        
}                                

范例:

#include <stdio.h>

int __declspec(naked) plus(int x,int y,int z)
{
        __asm
        {
                push ebp
                mov ebp, esp
                add esp, 0x40
                push ebx
                push esi
                push edi
                lea edi,dword ptr ss : [ebp-0x40]
                mov eax,0xCCCCCCCC
                mov ecx,0x10
                rep stos dword ptr es : [edi]
                mov dword ptr ss : [ebp - 0x4] , 2
                mov dword ptr ss : [ebp - 0x8] , 3
                mov dword ptr ss : [ebp - 0xC] , 4
                mov eax,dword ptr ss:[ebp+0x8]
                add eax,dword ptr ss:[ebp+0xC]
                add eax,dword ptr ss : [ebp + 0x10]
                add eax,dword ptr ss : [ebp - 0x4]
                add eax,dword ptr ss : [ebp - 0x8]
                add eax,dword ptr ss : [ebp - 0xC]
                pop edi
                pop esi
                pop ebx
                mov esp,ebp
                pop ebp
                ret
        }
}

int main()
{
        int x = 5;
        int y = 6;
        int z = 7;
        printf("%d",plus(x,y,z));
        return 0;
}

免费评分

参与人数 1吾爱币 +1 收起 理由
泛酸的桂花酒 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

 楼主| niucaidi 发表于 2021-7-9 20:45
tl;dr 发表于 2021-7-9 20:39
现在年轻人还愿意学c吗?

某个领导人说过,英语并不需要纳入义务教育,需要使用英语的人自然会去想办法学习的,我认为C语言也一样

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
laughtosky0 + 1 + 1 我很赞同!

查看全部评分

小能维尼 发表于 2021-7-9 23:31
一般C语言都作为入门的第一门语言课吧,就是学的精不精的问题了。
还有人把编程语言和人类文明语言相比,有很大的可比性吗?你连for,if是什么意思都不知道,还编锤子程序呢?
英语那是必学,而且要是精通,不然当韭菜都长不肥。不然最多就是比较老实无害。
wujl82 发表于 2021-7-10 11:14
感觉你这不是基础课比较深入
无名氏wyw 发表于 2021-7-10 06:54
众所周知,C语言第一课讲汇编
人心所向 发表于 2021-7-9 20:20
不错,赞一个!
hgs1999313 发表于 2021-7-9 20:37
啊 保存了  虽然一点都不懂
头像被屏蔽
tl;dr 发表于 2021-7-9 20:39
提示: 作者被禁止或删除 内容自动屏蔽
浮华时年 发表于 2021-7-9 20:41
看不懂,感觉好难啊!
augue 发表于 2021-7-9 20:43
谢谢分享
闪闪闪 发表于 2021-7-9 20:47
谢谢分享
Ly_轮回 发表于 2021-7-9 20:51
看不懂汇编
wobensha 发表于 2021-7-9 20:52
正在学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 11:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表