标签:
20135313吴子怡.北京电子科技学院
a.从硬件来看:CPU与内存通过主线连接,CPU上的IP(可能是16、32、64位)总指向内存的某一块区域;IP指向的CS(代码段)也在内存中;CPU总是执行IP指向的指令。
b.从软件来看:API(应用程序编程接口,与编程人员)与ABI(程序与CPU的借口界面) 是两个比较重要的软件接口
2、CPU可以抽象成一个for循环,总是从内存中执行下一条指令。
内存:保存指令数据 CPU:解释执行指令、数据
内存与CPU通过总线连接。
3.其他
API:应用程序编程接口 ABI:二进制(指令编码)接口
4.例子
例如:32位计算机X86,EIP指向内存的某条指令 1、自动加到下一条指令,数值加一 2、可被其他指令修改,如CALL,RET,JMP等。
16位寄存器:AX,BX,CX,DX,BP,SI,DI,SP等
32位寄存器:EAX累加寄存器,EBX基址寄存器,ECX技术寄存器等 前面加上E的均为32位寄存器。
1、movl
a.寄存器寻址%eax,%edx
即操作寄存器,与内存无关,相当于eax=edx
b.立即寻址$0x123,%edx
123这个16进制数值放进寄存器edx中($表示立即数)
c.直接寻址0x123,%edx
123这个地址指向寄存器edx(没有$表示地址)
c.间接寻址(%ebx),%edx
(%ebx)表示ebx这个寄存器存的值为内存地址
d.变值寻址4(%ebx),%edx
在间接寻址的基础上加上4
2、movb:8 bit;movw:16 bit
1、pushl %eax
把eax压栈到堆栈栈底 即首先把esp减4 esp表示堆栈栈顶 ebp表示堆栈基址
2、popl %eax
把eax从堆栈栈顶取32位,放在寄存器eax中 即首先把栈顶esp的数值放在eax中,再把栈顶加4
3、call 0x12345
调用该地址 即将当前的eip(当前CPU执行命令的指针)压栈,赋给eip一个新值(CPU下一条执行的指令)
4、ret
即将call时保存的eip还原到eip寄存器,return call之前的那条指令 eip(*)这个*指程序员不能直接修改eip
堆栈变化如下:
我修改完毕的实验代码如下:
编译:
将所得的汇编代码显示出来:
去掉用于关联的代码得到纯汇编代码:
标签:
原文地址:http://www.cnblogs.com/paperfish/p/5218231.html