您的位置:首页 > 其它

第五周

2015-10-11 20:43 176 查看
四、学习任务

第三章 程序的机器级表示

[b]五、学习过程[/b]

1.重要知识点:

一、历史观点

  1.X86寻址方式历经三代:1.DOS时代的平坦模式,不区分用户空间和内核空间,不安全。

             2.8086分段模式

             3.IA32的带保护模式的平坦模式

二、程序编码

 1.机器级代码(两种抽象)

  ISA(指令集体系结构):它定义了处理器状态、指令的格式,以及每条指令对状态的影响。

 2.获得汇编代码:

gcc -S xxx.c xxx.s


 或

objdump -d xxx.o


  二进制文件可以用od 命令查看,也可以用gdb的x命令查看(x/17xb sum)。

  有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看

od code.o | more
od code.o > code.txt


  对一组目标代码文件运行连接器,将main函数卸载main.c文件中:

gcc -o xxx xxx.o main.c


  也可返汇编:objdump -d xxx(可执行文件)

 3.关于格式:

  gcc、objdump默认的是ATT格式,其他一些都是Intel格式

  区别:书P111

三、数据格式

 1.访问信息:

 (1)一个IA32CPU包含一组8个存储32位值的寄存器,%eax、%ecx和%edx保存和回复惯例不同于ebx、edi和esi,ebp和esp只有根据栈管理标准惯例才能修改值

  例题:假定当前是32位x86机器,eax寄存器的值为0x8226,执行完addw $0x8266, %ax指令后eax的值是多少?

     解析:0x8226+0x826=0x1044c, ax是16位寄存器,出现溢出,最高位的1会丢掉,剩下0x44c,不要以为eax是32位的不会发生溢出。

 (2)操作数指示符:

   立即数:常数值,$+标准c表示伐

   寄存器:表示某个寄存器的内容,对双字操作可以是8个32位寄存器中的一个,对字操作可以是8个16位寄存器中一个。

   存储器:根据有效地址访问某个存储器位置

 (3)数据传送指令

   MOV类:分别在大小为1,2,4个字节的数据上进行操作。(movb,movw,movl)

   push操作把数据压入栈,pop操作删除。

pushl %ebp 和  popl %eax


   等价于:

subl $4,%esp         |       movl (%esp),%eax
movl %ebp,(%esp)     |       addl $4,%esp


   栈顶元素的地址是所有栈中元素地址中最低的

 (4)数据传送示例

   c中的指针其实就是地址,间接使用指针就是将该指针放在一个寄存器中,然后在存储器引用中使用这个寄存器

   局部变量通常是保存在寄存器中,而非存储器(寄存器访问更快)

五、算术和逻辑操作

 四组操作:加载有效地址、一元操作、二元操作和移位

 1.一元操作和二元操作

  一元只有一个操作数,即是源又是目的,可是寄存器可是存储器位置

  二元:第一个操作数可以是立即数、寄存器或存储器位置,第二个是寄存器或存储器位置。(不能同时是存储器位置)

  例:subl %eax,%edx使寄存器%edx的值减去%eax中的值

 2.移位操作

  移位量可以是一个立即数,或放在单字节寄存器元素%cl中

六、控制

 1.条件码:CF,ZF,SF,OF

 2.访问条件码:注意机器代码如何区分有符号和无符号值。

3.跳转指令:

  jmp之无条件跳转,可直接可间接

 4.循环

 5.switch语句:关键步骤是通过跳转表来访问代码位置

七、过程

 1.栈帧结构

  为单个过程分配的那部分栈称为栈帧,最顶端的站真以两个指针界定,寄存器%ebp为帧指针,%esp为栈指针

 2.寄存器使用惯例P152

十一、使用GDB调试器

  启动:

unix> gdb prog


  gdb命令见P175

实验练习:

输入代码:





编译:



删除“."开头的汇编代码:



六、遇到的问题及解决方法

七、其他
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: