7.简单的汇编语法:
堆栈平衡
PUSH,POP
功能: 把操作数压入或取出堆栈
语法: PUSH 操作数 POP 操作数
格式:
PUSH r PUSH M PUSH data POP r POP m
PUSHF,POPF,PUSHA,POPA
功能:
堆栈指令群
格式: PUSHF POPF PUSHA POPA
ADD,ADC
功能: 加法指令
语法: ADD OP1,OP2
ADC OP1,OP2
格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data
影响标志: C,P,A,Z,S,O
SUB,SBB
功能:减法指令
语法: SUB OP1,OP2 SBB OP1,OP2
格式: SUB r1,r2 SUB r,m
SUB m,r SUB r,data SUB m,data
影响标志: C,P,A,Z,S,O
INC,DEC
功能:
把OP的值加一或减一
语法: INC OP DEC OP
格式: INC r/m DEC r/m
影响标志: P,A,Z,S,O
MUL,IMUL
功能: 乘法指令
语法: MUL OP IMUL OP
格式: MUL r/m IMUL r/m
影响标志:
C,P,A,Z,S,O(仅IMUL会影响S标志)
DIV,IDIV
功能:除法指令
语法: DIV OP IDIV OP
格式:
DIV r/m IDIV r/m
CBW,CWD
功能: 有符号数扩展指令
语法: CBW CWD
AAA,AAS,AAM,AAD
功能: 非压BCD码运算调整指令
语法: AAA AAS AAM AAD
影响标志: A,C(AAA,AAS)
S,Z,P(AAM,AAD)
DAA,DAS
功能: 压缩BCD码调整指令
语法: DAA DAS
影响标志:
C,P,A,Z,S
SHR,SHL,SAR,SAL
功能: 移位指令
语法: SHR r/m,data/CL SHL
r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL
影响标志: C,P,Z,S,O
ROR,ROL,RCR,RCL
功能: 循环移位指令
全部跳转语句:
Jxx - Jump Instructions
Table
Mnemonic
Meaning
Jump Condition
JA
Jump if Above
CF=0 and ZF=0
JAE Jump if Above or Equal
CF=0
JB
Jump if Below
CF=1
JBE
Jump if Below or Equal
CF=1 or ZF=1
JC Jump
if Carry
CF=1
JCXZ Jump if CX
Zero
CX=0
JE Jump if Equal
ZF=1
JG Jump if
Greater (signed) ZF=0 and
SF=OF
JGE Jump if Greater or
Equal (signed) SF=OF
JL
Jump if Less (signed)
SF != OF
JLE
Jump if Less or Equal (signed) ZF=1 or SF !=
OF
JMP Unconditional Jump
unconditional
JNA Jump
if Not Above
CF=1 or ZF=1
JNAE Jump if
Not Above or Equal CF=1
JNB Jump if Not Below
CF=0
JNBE Jump if Not Below or Equal
CF=0 and ZF=0
JNC
Jump if Not Carry
CF=0
JNE
Jump if Not Equal
ZF=0
JNG Jump
if Not Greater (signed) ZF=1 or SF != OF
JNGE Jump if Not Greater or Equal
(signed) SF != OF
JNL Jump if
Not Less (signed) SF=OF
JNLE Jump if Not Less or Equal (signed)
ZF=0 and SF=OF
JNO
Jump if Not Overflow (signed) OF=0
JNP Jump if No Parity
PF=0
JNS Jump if Not Signed (signed)
SF=0
JNZ
Jump if Not Zero
ZF=0
JO
Jump if Overflow (signed) OF=1
JP Jump if Parity
PF=1
JPE Jump if Parity Even
PF=1
JPO Jump if Parity Odd
PF=0
JS Jump if Signed (signed)
SF=1
JZ
Jump if Zero
ZF=1
Clocks Size
Operands 808x 286
386 486 Bytes
Jx: jump 16 7+m
7+m 3 2
no jump 4 3
3 1
Jx
near-label - - 7+m 3
4
no jump - -
3 1
- It‘s a good programming
practice to organize code so the
expected
case is executed without a jump since the actual
jump takes longer to execute than falling through the test.
- see JCXZ and JMP for their
respective timings
JCXZ/JECXZ - Jump if Register (E)CX is Zero
Usage: JCXZ label
JECXZ label (386+)
Modifies flags: None
Causes execution to branch to "label" if register CX is zero. Uses
unsigned comparision.
Clocks
Size
Operands 808x
286 386 486 Bytes
label: jump 18 8+m
9+m 8 2
no jump 6
4 5 5
JMP - Unconditional Jump
2.简单的call函数过程
1.參数入栈,返回地址入栈。在一个栈帧里,call
function的完整过程应该是这种,call调用的过程要经历两个过程,一个是首先把调用函数之前的指令的下一条指令地址压入栈中(push
ebp),作为返回地址,也就是保存旧栈地址,接着会跳转到被调函数的地址入口。呵呵,如今就是借此来恶补汇编哈。
2.代码区跳转。在运行被调函数的时候,为函数又一次开辟栈帧,(mov
ebp,esp)这句的意思是将旧栈顶换为新栈的底,这里的新栈通常是由函数专属的哈, 以下就是用sub esp, xx
抬高栈顶,这个过程也就是被调函数局部变量从右向左依次入栈的过程,运行函数体的代码段,
3.栈帧调整。第一步是:保存当前栈的状态值,就是push
ebp,我的理解就是这里实际上是入的系统栈,之所以要先使ebp入栈是要为了切割栈帧,告诉系统要截断旧栈帧,建立新栈帧。第二步:将栈顶装入新的栈底,mov
ebp,esp ,准备栈帧转换了,使用这句话的目的是建立新的空栈;第三步:sub esp,xx
就是抬高栈顶,sub是减嘛,就是向低地址扩展噻,栈顶的地址减小,用__stdcall约定的话,假设有三个參数1,2,3
则这里的入栈顺序为
push 3 ;push 2 ;push
1;这样依次參数入栈,完毕函数体入栈(就是将原来的栈顶作为新栈的栈底存在寄存器里,一般就是在系统栈上往上加,开辟完之后,首先call指令会跳转到该函数的入口地址,运行函数体,即将函数的变量依次压入栈中,再依次弹栈,最后返回调用该函数之前的栈地址,也就是上一次的栈顶,这里再进行栈顶的弹栈,正好就是上次调用的函数的调用点)。
4.跳转。当函数运行完毕后首先是保存返回值,通常将函数的返回值保存的EAX寄存器中,然后将当前的栈帧的数据一个个的弹出,直到栈底,实际的详细过程是在esp上加上当前栈帧的大小,减少栈顶,回收当前栈帧的空间,然后当前栈底的保存的前一个栈帧的ebp弹入ebp寄存器,恢复上一个栈帧,将函数返回地址弹给EIP寄存器,下一步依照函数返回地址(不太明确)继续运行母函数中函数调用点的下一个指令的操作:详细代码是:
add esp,xxx //减少栈顶
pop ebp //弹出栈底
retn
//这条代码有两个作用,1.弹出当前栈顶元素,这时候已经是到了旧栈帧了,也就是弹出之前的保存指令位置的返回地址,到这里栈帧恢复工作完毕啦,然后让处理器取指令的跳转到原来的返回地址恢复调用前的代码区
加壳学习笔记(二)-汇编基础
时间: 2024-10-18 00:16:16
加壳学习笔记(二)-汇编基础的相关文章
加壳学习笔记(一)-基础知识
1.预备知识 1.关于栈,在windows里面的堆栈其实很简单,当学了才知道哈,呵呵,第一要记住的是windows里面的栈是向低地址生长的(extended,延伸,呵呵,顺便丰富下英语的单词量,确实是少的可怜),你可以这样认为,栈就像是一个倒立的箱子,箱子的口子是向下的,底是向上的,这里就表明了系统栈的分布也是延伸方向是由高地址向低地址extended,在最初的空栈阶段,栈顶(extended stack pointer,简称是esp)在栈底的低一个位置,呵呵,其实很好理解,就是说最初的箱子是空
[A8 学习笔记] A8 汇编基础
A8 处理器工作模式 这点和以往的 arm7 arm11 是一致的.有8个工作模式: 用户模式是通常的ARM程序的执行状态,并用于执行大多数应用程序 快速中断(FIQ)模式是用于处理快速中断 中断(IRQ)模式是用于通用的中断处理 管理模式是一个操作系统保护模式 中断模式是当数据出错或者预取指令出错时进入的模式 系统模式是操作系统的一个特权用户模式 未定义的模式进入一个未定义指令异常发生时 监控方式为安全扩展安全模式安全监控代码. 除了用户模式模式统称为特权模式.特权模式用于服务中断或异常,或访
加壳学习笔记(三)-简单的脱壳思路&;调试思路
首先一些windows的常用API: GetWindowTextA:以ASCII的形式的输入框 GetWindowTextW:以Unicaode宽字符的输入框 GetDlgItemTextA:以ASCII的形式的输入框 GetDlgItemTextW:以Unicaode宽字符的输入框 这些函数在使用的时候会有些参数提前入栈,如这函数要求的参数是字符串数目.还有大小写啦之类的东西,这些东西是要在调用该函数之前入栈,也就是依次push,就是说一般前面几个push接着一个call,那前面的push可能
Java基础学习笔记二 Java基础语法
注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /* 这是 * 一段注释, * 它跨越了多个行 */ public void f() {} } 文档注释 /** The first Thinking in Java example program. * Lists system information on current machine. * @author Bruce Eckel * @author http:/
黑马程序员——JAVA学习笔记二(语法基础)
1, Java程序都是以类的形式存在的,所以需要告诉虚拟机需要加载类的位置,那么可以设置classpath变量.classpath变量如果有;,则表示还会在当前目录查找,没有;则不会在当前目录查找. 当然如果没有classpath也会在当前目录查找. 2, rd删除目录,加/S可以删整个目录,Windows从里向外删除. 3, 一个文件只有一个public类,文件名必须和类名相同,如果不是友好类,则不需要同名. 4, JAVA一共有50个关键字 关键字是电脑语言里事先定
Java学习笔记二(基础语法)
1 Java 是强类型语言,提供的8中基本数据类型有以下几类: Byte :字节类型,一个字节,有符号的8位的整数.字节类型参与运算的时候,会转化为int类型. byte b;b=3;b=(byte)(b*3); 在这里第二个赋值必须经过强制类型转化,否则会编译出错. short:2个字节,Byte可行可以直接赋值给short,但是反过来需要强制类型转化. int:4字节类型的有符号的整数. long:8个字节类型的有符号的整形 char:2个字节的无符号的类型.采用的是Unicode的编码格
framework7学习笔记二:基础知识
一:DOM7 framework7有自己的 DOM7 - 一个集成了大部分常用DOM操作的高性能库.它的用法和jQuery几乎是一样的,包括大部分常用的方法和jquery风格的链式调用. 在开发时,为了避免命名冲突以及方便开发,我们把dom7定义为一个变量: var $$ = Dom7; 之后,就可以在页面中使用 $$ 了. DOM7可以调用的方法,请查阅官方文档:http://docs.framework7.cn/Index/dom.html 二:
angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构
ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource
CCNA 学习笔记(二)--CISCO设备初接触
CCNA 学习笔记(二)--初识CISCO设备 上一章我们认识到网络方面的基础知识了,现在我们正式接触CISCO设备. 1.首先我们先了解一台CISCO设备里的主要组件: ROM(只读存储器):主要保存着开机自检软件.保存路由器启动引导程序. RAM(随机存储器):断电会把数据丢失.可以存储配置文件.>>>相当于PC的内存 NVRAM(非易失存储器):断电不会丢失.用来保存用户配置文件.IP.startup-config.主机名.路由协议等等. FLASH(闪存):主要是保存完整的