加壳学习笔记(二)-汇编基础

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.弹出当前栈顶元素,这时候已经是到了旧栈帧了,也就是弹出之前的保存指令位置的返回地址,到这里栈帧恢复工作完毕啦,然后让处理器取指令的跳转到原来的返回地址恢复调用前的代码区



加壳学习笔记(二)-汇编基础,布布扣,bubuko.com

时间: 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(闪存):主要是保存完整的