您的位置:首页 > 理论基础

计算机是如何工作的?

2015-03-09 09:17 141 查看
作者:申小宁 原创作品转载请注明出处
《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000

实验截图:
c代码:



编译命令:


汇编代码:


基础知识
寄存器寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令,数据和地址。eip:存储当前指令寄存器,每执行完一条指令,eip将指向下一条指令。ebp:是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:esp:专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。eax:是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
寻址方式寄存器寻址 movl %eax,%ebx 把eax的值,赋给ebx立即寻址 movl $0x1234,%eax 把0x1234这个立即数,赋值给eax。直接寻址 movl 0x12345,%eax 把0x12345这个内存地址存放的数据赋值给eax。间接寻址 movl (%eax),%ebx eax上存放的一个内存地址,这个内存地址存放的值,赋值给ebx。变址寻址 movl 8(%eax),%ebx eax上存放的值,加上偏移量8 后,所指向的位置存放的内存地址,这个内存地址存放的值,赋值给ebx
从main函数入手:第一句:pushl %ebp
Pushl %ebp(表示把eax寄存器的内容压倒栈顶):等价于:subl $4,%esp (堆栈的栈顶) movl %ebp,(%esp) 第二句:movl %esp, %ebp使得ebp指向esp指向的位置。第三句:subl $4, %esp栈顶向下偏移4个字节。第四句:movl $99, (%esp)将一个立即99存入栈顶。第五句:call f 即调用函数f()call 指令可分解成 pushl eipmovl f eip
f函数pushl %ebp (存储EBP位置,压栈,esp加一)movl %esp %ebp (esp 指向EBP)...movl %eax (%esp)
把esp存储内存地址 指向 eax寄存器call g执行函数g
g函数
ret 函数返回作用 返回执行gax内的指令。
总结:汇编语言是计算机语言的基础,想要深入理解linux内核或者学习一些其他语言,汇编都是基础,小伙伴们加油了!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: