首页
社区
课程
招聘
[旧帖] [原创]初学C语言笔记之[一]…… 0.00雪花
2013-4-24 21:06 3688

[旧帖] [原创]初学C语言笔记之[一]…… 0.00雪花

2013-4-24 21:06
3688
首先,就在此谢谢大家了……本人没什么本事,只是把刚学到的东西整理成笔记。
方便日后,以及其他跟我一样程度的人。

====[ 0x110 简单介绍下register
简单的来说,register就是当系统运行机器码时,负责管理那些系统的暂时性变数,或者是负责“导入”源文件。

在此列下:
     EAX = Accumulator register      
     ECX = Counter register               
     EDX = Data register
     EBX = Base register

还有些比较特殊的有ESP, EBP, ESI 和 EDI。虽然有的时候,它们被叫成了pointer,但是技术上还是被归类为register。主要的功能还是差不了多少,都是负责指向系统要读取还是写入的文件。

     ESP = Stack register
     EBP = Base pointer
     ESI = Source index
     EDI = Destination index

     EIP = Intruction pointer   === 比较特殊,负责指向目前执行的机器码指令
     EFLAGS register      === 标记一个指令的状况((包含状态旗标比如进位、溢出、结果为零,等等

每个暂存器(register)都有各自不同的功能,例如ECX可以被用来作loop指令的计数器那样

----[ 0x120  通过简单的helloworld程序深入了解register

作为一个程序员,我们大可以只着重于代码整洁,思路啊,结构就行了。但是作为一个黑客,逆向破解爱好者,我们必须从底层下手,深入了解程序的运作方式,这就是其魅力之所在。

现在,这里是一个C语言写的helloworld程序,功能就是打印10行hello, world!

// filename: helloworld.c   这是注释,不被机器读取
# include <stdio.h>       // 链接 stdio.h 函数库, 接下来我们会用到里面的其中一个函数
int main()     // main程序,C语言的主体部位
{
    int i; 
    for(i=0; i < 10; i++)    // 循环10次
    {
        printf("Hello, World!\n");     //  打印 Hello, World!
    }
    return 0;   //  初始化 main 程序
}


一个C带源码,是单单起不了作用的,这只是方便程序员阅读的格式而已。我们要将它转换成机器码。linux下大可以用gcc或是cc。

$ gcc heloworld.c
$ ls
a.out

(gcc默认output文件名为 a.out)
然后运行:

$./a.out
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!

----[  0x130   认识机器码

话不多说,直接 objdump,系统默认的是AT&T语法。由于intel语法比较简洁,所以我们今天用的是intel语法。(( 由于显示资料量大,我们取 main() 的首二十行。

(( 较常用的汇编语法之中,就数 intel 和 AT&T 语法。
都是大同小异的,其中最大的不同点就是 % 和 $ 的出现。只有AT&T有这些符号,原因不详

$ objdump -D -M intel a.out | grep -A20 main.:
0804840c <main>:
804840c:        55                           push   ebp
804840d:        89 e5                        mov    ebp,esp
804840f:        83 e4 f0                     and    esp,0xfffffff0
8048412:        83 ec 20                     sub    esp,0x20
8048415:        c7 44 24 1c 00 00 00         mov    DWORD PTR [esp+0x1c],0x0
804841c:        00
804841d:        eb 11                        jmp    8048430 <main+0x24>
804841f:        c7 04 24 d8 84 04 08         mov    DWORD PTR [esp],0x80484d8
8048426:        e8 c5 fe ff ff               call   80482f0 <puts@plt>
804842b:        83 44 24 1c 01               add    DWORD PTR [esp+0x1c],0x1
8048430:        83 7c 24 1c 09               cmp    DWORD PTR [esp+0x1c],0x9
8048435:        7e e8                        jle    804841f <main+0x13>
8048437:        b8 00 00 00 00               mov    eax,0x0
804843c:        c9                           leave  
804843d:        c3                           ret   
804843e:        90                           nop
804843f:        90                           nop

由上面的显示数据,依序排列的是 :

804840c, 804840d 啊这些都是位址,是标记这指令的位置的位址。
   
55, 89 e5 啊这些都是机器码。

然后后半段都是汇编啦!汇编是其中一种底层编程语言,每个指令都对应着各自的机器码

====  TO BE CONTINUED ====
先此致谢,望大家海涵本人的笨黜发水文了

[培训]《安卓高级研修班(网课)》月薪三万计划

收藏
点赞2
打赏
分享
最新回复 (15)
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lucklylang 2013-4-24 22:33
2
0
顶一下,做笔记是不错的习惯!
雪    币: 32
活跃值: (161)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小科ken 2013-4-24 22:41
3
0
顶一下 做一个做笔记的孩子
雪    币: 17
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zypeh 2013-4-25 05:42
4
0
=_,= 謝謝大家。((好像有點不對勁的樣子。
雪    币: 4
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pyzworld 2013-4-30 12:22
5
0
这是在做演讲吗? //, 接下来我们会用到里面的其中一个函数
雪    币: 26435
活跃值: (18467)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2013-4-30 22:18
6
0
照这个思路,可以再深入一些,如研究一下if -else ,循环,局部变量、全局变量 等。
雪    币: 17
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zypeh 2013-5-1 11:48
7
0
好的!我正在研究着条件和函数,等清楚了我再做个更成熟的笔记。
谢谢大家给我的支持 :)
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sereno 2013-5-18 23:12
8
0
俺也来学习学习,共同进步。
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yilinho 2013-6-4 22:18
9
0
看了标题”初学C语言”随手点进来看后
大惊!!
这不是x86 assembly language的东西吗?
该不会你们在初学C语言时都会连着assembly language一起学吧..?
雪    币: 516
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
勇敢者 2013-6-4 23:03
10
0
顶楼上。表示不解。
雪    币: 17
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zypeh 2013-6-4 23:07
11
0
同楼上……
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rejeo 2013-6-4 23:14
12
0
来顶下。。不错学习学习
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
亚辰 2013-6-4 23:56
13
0
正好在学这些东西。顶一下楼主。。
雪    币: 189
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gameuu 2018-8-25 16:11
14
0
简单就是基本功!
雪    币: 53
活跃值: (578)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
accessdenied 2018-8-25 21:47
15
0
楼主真的是初学吗 可怕
雪    币: 990
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
荧天 2018-9-4 16:16
16
0
顶一下
游客
登录 | 注册 方可回帖
返回