Chinaunix首页 | 论坛 | 博客
  • 博客访问: 76479
  • 博文数量: 17
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 67
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-23 11:45
文章分类

全部博文(17)

文章存档

2015年(17)

我的朋友

分类: LINUX

2015-07-05 14:38:41

Linux内核第一周作业。实验是在64bit的Linux虚拟机环境下进行的。
何钢 原创作品转载请注明出处 《Linux内核分析》MOOC课程   
        1.常用寄存器与汇编指令(此处只说明32bit的情况):
                    1)CPU中常用寄存器:
                         eax:累加器,作为一些计算结果临时存储的地方
                         ebp:  栈基指针,指向栈的最底部
                         esp:栈顶指针,执行栈的最顶部
                         eip:   指向计算机要运行的下一条指令,不能直接更改
                    2)常用指令:
                         movl :移动
                         移动涉及到了寻址方式:有立即寻址、直接寻址、间接寻址、变址寻址四种,以下举例说明:
                             movl $0x123,%eax(立即寻址,$表示立即数,%表示寄存器)
                             movl 0x123,%eax(直接寻址,这是0x123表示的是一个地址)
                            movl (%ebx),%eax(间接寻址,这时(%ebx)中的值表示内存中的一个地址)
                             movl 4(%ebx),%edx(变址寻址,在间接寻址的基础上再加4个单位)
                         压栈、出栈:
                             pushl %eax = subl $4,%esp
                                                 movl %eax,(%esp)
                             popl %eax = movl (%esp),%eax
                                               addl $4,%esp
                         函数调用:
                         call 0x12345 = pushl &eip ->把顺序执行的下一条指令压栈
                                              movl $0x12345,%eip->将将要转向执行的下一条指令放入eip寄存器当中
                         enter:
                                pushl %ebp->把之前的栈底压入栈 
                                movl %esp,%ebp->生成一个新栈
                                个人理解:每一个程序,系统都会分配一个栈空间,而在这整个栈空间中每个函数调用之间又分为一个个相对独立的小栈,就像一条街,这条街上有很多户人,他们相互独立,彼此又有联系,这条指令就是把栈分成一个一个的小栈。
                         leave:
                                 movl %ebp,%esp->撤销栈
                                 popl %ebp->返回之前的栈
                                 和enter的作用正好相反
                         

                以下是源文件:(main.c和main.s),main.s是由指令gss -S -o main.s main.c -m32得到
                
               
                程序运行的时候,寄存器中的状态如文件_1.xsl中,说明:
                当esp->或者ebp->指向1996的时候,代表的是1996-2000这四个字节的内存
                
_1.xls
                 程序运行就是寄存器与栈直接的相互作用,计算机通过eip知道该运行哪一条指令,而指令当中的数据又由栈和寄存器提供。
                                

阅读(2734) | 评论(0) | 转发(0) |
0

上一篇:原始套接字编程--IP段扫描

下一篇:没有了

给主人留下些什么吧!~~