地址空间
寄存器
常用的有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工作过程
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个部分的和,基址,变址和常数偏移.