汇编扫盲

地址空间


在32位操作系统环境下,每个进程拥有一片连续的内存空间,程序本身和其需要的数据共存于此,这片空间的每个字节都可以用一个32位无符号数定位,每个字节都有唯一的空间位置,我们称之为地址.这里的内存一般并非真正的物理意义上的存储设备,我们把它叫地址空间.32位系统地址空间的大小为2的32次幂(4G),由于系统本身也有代码和数据,所以实际可用的地址空间只有2G-3G.
 

寄存器


CPU中的储存单元,用于处理程序的逻辑.
常用的有10个
EAX,EBX,ECX,EDX(通用寄存器,少数情况有特别的用途),可以只操作高16位或低16位AX,也可使用低16位中的低8位AL或高8位AH
ESI,EDI,EBP(存储内存地址,多数情况可以当通用寄存器使用,每个在特殊情况有特殊作用),可以只操作高16位或低16位,不能操
 
作低8位
ESP,EIP(特殊寄存器,不能通用)
PSW
前9个是32位,PSW是16位
前7个寄存器可以看做供代码快速操作数据的临时变量即可
 
EIP:
修改EIP的值,就是程序逻辑中的跳转,对于汇编指令就是JMP&n6159;指向堆栈上的数据,可以用别的寄存器来取代,但ESP,许多操作堆栈数据汇编指令会隐式地改变它的值.
通常,一个进程的堆栈处于整个地址空间的最低处(通常指单线程程序,或者指多线程程序的主线程),用掉一定的堆栈空间,ESP就会递减,一旦ESP减到0发生环绕后,就引发了堆栈溢出.PUSH,CALL这样的指令会把数据放入ESP指向的地址,并减小ESP的值,POP,RET做相反操作
 
PSW:
按位保存CPU的内部状态
9个标志位:(略)
很多情况下,将影响标志位的指令和根据标志位做跳转的指令结合起来用(这里就是if语句的由来)
CMP EAX,EBX 
JNZ label  
 
第一句:减法操作,结果影响标志寄存器,而并不将结果放回EAX,这条指令影响ZF(零标志)
第二句:JNZ-jump not zero,非零则跳转,就是此时ZF为1时就修改EIP到地址label处(注意:条件判断语句的跳转地址不同于JMP,
 
它们的指令数据中是用一个有符号整数保存的相对地址),所以当条件成立时,将EIP累加一个值,而不是将EIP赋予一个新值.所以条件跳转往往不能跳过一个过大的语句块(大于128字节).一般把它和JMP结合起来用.
 

CPU工作过程


1 通电后,从EIP寄存器中取出一个数据,其含义是一个地址空间中的一个地址
2 CUP加载这个EIP指向的若干字节的数据组成的指令
3 随后将EIP递增到下一个字节的地址处
 

指令


由操作,参数,参数定位方式组成,存在形式是数字组合的形式
 
操作:比如赋值操作Mov,跳转操作等Jmp
参数:可以指定寄存器或者内存.?[怎么指向内存]
参数定位方式:就是寻址方式

寻址方式

 
1 立即寻址: 
操作数包含在指令中 MOV EAX,1
 
2 寄存器寻址
操作数在寄存器中 MOV EAX,EBX
 
3 直接寻址
操作数的地址被直接写在指令内 MOV EAX,[0X1000]
 
4 间接寻址
操作数的地址需要经过某种运算才能得到,可能是从一个寄存器读取,也可能是把几个寄存器中的数据相加等
 
MOV EAX,[EBX]
MOV EAX,[EBX+4]  EBX里的数据做为一个地址,将这个地址加4后得到新地址,从新地址读取数据给EAX
 
MOV EAX,[EBX+ECX*4+4] *4不代表CPU寻址操作时可做乘法,而只是将ECX扩大了4倍
间接寻址中[]中最多只能是3个部分的和,基址,变址和常数偏移.
posted @ 2014-01-22 17:32  00000000O  阅读(180)  评论(0编辑  收藏  举报