zoukankan      html  css  js  c++  java
  • 入门级汇编语法句读

    1

    mov dword ptr [ebp-4], 0 是什么意思?
    在堆栈上找到ebp-4偏移的内存双字,并把这个内存清0。这通常来自高级语言编译,用于将一个局部变量清0。
    例:DWORD PTR [EBP-18]
    在栈上找到ebp-18偏移的内存双字
    例:MOV ECX,[EBP-14] 这句 可以替换成什么东西?
    mov ecx,ebp
    sub ecx,14
    mov ecx,[ecx]

    2

    在汇编里mov edx, dword ptr [eax] 中dword ptr什么意思?
    表示eax所指向的内存内容是一个双字的空间,也就是4个字节。

    3

    Mov dword ptr fs:[0],eax这句编指令是把eax赋给什么?是给Fs吗?Ptr ?dword ?还是[0]?它们分别代表什么?有什么作用?能等价替换什么指令?为什么
    比如说此时eax=5
    可等价成mov dword ptr fs:[0],5..

    4

    汇编中 DIV DWORD PTR DS:[ECX+78] 是什么意思
    DIV是除法指令。。字相除的话,被除数在AX中,除数是DWORD PTR DS:[ECX+78]。。
    PTR用来指明内存单元的长度。。在这里就是DWORD,两个字节。。
    除数就是以DS:[ECX+78]为起始地址的两个字节中的数据。。
    执行DIV指令之后,商放在AL中,余数在AH中。。

    5

    00401000 push ebp                   ; 保护现场原先的EBP指针
    00401001 mov ebp,esp
    00401003 mov eax,dword ptr [nInput] ; 取参数
    00401006 lea eax,[eax*2+3]        ; LEA比ADD加法更快
    0040100A cdq                        ; DWORD->QWORD(扩展字长)
    0040100B mov ecx,7                  ; 除数
    00401010 idiv eax,ecx               ; 除
    00401012 mov eax,edx                ; 商->eax(eax中保存返回值)
    00401014 pop ebp                    ; 恢复现场的ebp指针
    00401015 ret                        ; 返回

    6
    00401020 push ebp                   ; 保护现场原先的EBP指针
    00401021 mov ebp,esp
    00401023 sub esp,10h                ; 为取argc, argv修正堆栈指针。


    7

    00401026 mov dword ptr [i],0        ; 0->i
    0040102D jmp main+18h (00401038)    ; 判断循环条件
    0040102F mov eax,dword ptr [i]      ; i->eax
    00401032 add eax,1                  ; eax ++
    00401035 mov dword ptr [i],eax      ; eax->i
    00401038 cmp dword ptr [i],3        ; 循环条件: i与3比较
    0040103C jge main+33h (00401053)    ; 如果不符合条件,则应结束循环
    0040103E mov ecx,dword ptr [i]      ; i->ecx
    00401041 push ecx                   ; ecx (i) -> 堆栈
    00401042 call myTransform (00401000); 调用myTransform
    00401047 add esp,4                  ; esp+=4: 在堆中的新单元
                                        ; 准备存放返回结果
    0040104A mov edx,dword ptr [i]      ; i->edx
    0040104D mov dword ptr a[edx*4],eax ; 将eax(myTransform返回值)
                                        ; 放回a[i]
    00401051 jmp main+0Fh (0040102f)    ; 计算i++,并继续循环 return 0;
    00401053 xor eax,eax                ; 返回值应该是0
    00401055 mov esp,ebp                ; 恢复堆栈指针
    00401057 pop ebp                    ; 恢复BP
    00401058 ret                        ; 返回调用者(C++运行环境)

    8

    跳转命令

    -------------------------------------------------------------

    根据条件作出是否跳转的决定,通常前面会有一个判断语句,例如:

         CMP AX,BX

        JZ XXXX     //jump zero

     上面两条命令意为用 AX BX,它的值如果为 0 则跳转到 XXXX 的标号行。

    常用的跳转命令有:(j=jump,z=zero,e=equal,n=not,l=lower,g=greater)

         JZ/JE   相等或为零为则跳转

        JNZ/JNE  不相等或不为零则跳转

        JL/JLE  小于/小于或等于则跳转

        JG/JGE  大于/大于或等于则跳转

        JMP    无条件跳转

    -------------------------------------------------------------

    比较语句

    -------------------------------------------------------------

        CMP AX,BX  //AX 寄存器减去 BX 寄存器的内容

        AND AX,BX  //AX 与 BX 做加法“与运算”

        OR AX,BX   //AX 与 BX 做减法“或运算”

        TEST AX,BX    与    AND AX,BX     命令有相同效果

        XOR AX,AX 使 AX 的内容清零,每个寄存器与自己作异或运算等于清零动作

    -------------------------------------------------------------

    子程序

    -------------------------------------------------------------

    一个子程的模样长得像这个样子

         CALL 15F:334422

     子程式是个很重要的概念,它是主程式的一个分支,用来做特定动作。

     打个比方:你要上班,先你是走路到车站,然后上车,然后下车,然后走到自己的办公室。

     这里如果要把上班编为一段程式的话,那么就可以把“走路”、“搭车”、“走到办公室”做为分支程式来处理。

     说得再通俗一点就是:你要破解的程式不可能就是一条主程式到底,肯定会呼叫下面的子程式,由子程式来处理你发送的注册信息,然后比较,然后标记是否注册正确,这些都是靠它来完成的。

     所以说,破解的关键在于,你找准程式在哪儿(俗称关键CALL)将会作注册判断,并进入那个注册子程式,仔细观察,你就成功了。(子程式的返回码是 RET)

    -------------------------------------------------------------

    算术运算

    -------------------------------------------------------------

        ADD AX,BX  加法运算   AX=AX+BX

        SUB AX,BX  减法运算   AX=AX-BX

        INC AX   寄存器加一  AX=AX+1   //increase

        DEC AX   寄存器减一  AX=AX-1  //decrease

        MUL     乘法运算     //multiply

        DIV / idiv    除法运算  //divide

    普通加减乘除法英文表达:

    subtracte 14 from 29
    divide 97 by 17
    multiply 8 by 41
    add 11 to 55

    -------------------------------------------------------------

    数据操作

    -------------------------------------------------------------

        MOV AX,BX 数据传送指令,将 BX 的值移送到 AX 中

        XCHG AX,BX 将 AX 与 BX 的值互换

    8086/8088指令集
    为了便于查询,这里分类列出8086/8088汇编指令:

    数据传送指令:用的多MOV,PUSH,LEA
    MOV
    功能: 把源操作数送给目的操作数
    语法: MOV 目的操作数,源操作数
    格式: MOV r1,r2 或 MOV r,m 或 MOV m,r 或 MOV r,data

    XCHG
    功能: 交换两个操作数的数据
    语法: XCHG
    格式: XCHG r1,r2 或 XCHG m,r 或 XCHG r,m

    PUSH,POP
    功能: 把操作数压入或取出堆栈
    语法: PUSH 操作数 POP 操作数
    格式: PUSH r 或 PUSH M 或 PUSH data POP r 或 POP m

    PUSHF, POPF, PUSHA, POPA        //后面的字母D可以省去: PUSHFD POPFD PUSHAD POPAD
    功能: 堆栈指令群
    格式: PUSHF POPF PUSHA POPA

    LEA,LDS,LES
    功能: 取地址至寄存器
    语法: LEA r,m LDS r,m LES r,m

    XLAT(XLATB)
    功能: 查表指令
    语法: XLAT XLAT m
    算术运算指令

    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

    NEG
    功能: 将OP的符号反相(取二进制补码)
    语法: NEG OP
    格式: NEG r/m
    影响标志: C,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  //change byte word // change word dword
    功能: 有符号数扩展指令
    格式: 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
    字符串操作指令

    MOVSB,MOVSW,MOVSD
    功能: 字符串传送指令
    格式: MOVSB MOVSW MOVSD
    标志位: 无

    CMPSB,CMPSW,CMPSD
    功能: 字符串比较指令
    格式: CMPSB CMPSW CMPSD
    标志位: C,P,Z,S,O

    SCASB,SCASW  //scansb
    功能: 字符串搜索指令
    格式: SCASB SCASW
    标志位: C,P,Z,S,O

    LODSB,LODSW,STOSB,STOSW
    功能: 字符串载入或存贮指令
    格式: LODSB LODSW STOSB STOSW
    标志位: 无

    REP,REPE,REPNE
    功能: 重复前缀指令集
    格式: REP 指令S REPE 指令S REPNE 指令S
    标志位: 依指令S而定

    位运算指令集
    AND,OR,XOR,NOT,TEST
    功能: 执行BIT与BIT之间的逻辑运算
    格式: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m
    影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位

    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
    功能: 循环移位指令
    格式: ROR r/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL
    影响标志: C,P,Z,S,O
    程序流程控制指令

    CLC,STC,CMC
    功能: 设定进位标志
    格式: CLC STC CMC
    标志位: C

    CLD,STD
    功能: 设定方向标志
    格式: CLD STD
    标志位: D

    CLI,STI
    功能: 设定中断标志
    格式: CLI STI
    标志位: I

    CMP
    功能: 比较OP1与OP2的值
    格式: CMP r/m,r/m/data
    标志位: C,P,A,Z,O

    JMP
    功能: 跳往指定地址执行
    格式: JMP 地址

    JXX
    功能: 当特定条件成立则跳往指定地址执行
    格式: JXX 地址
    XX为下列值:
       A: ABOVE,当C=0,Z=0时成立
       B: BELOW,当C=1时成立
       C: CARRY,当CF=1时成立
       CXZ: CX寄存器的值为0(ZERO)时成立
       E: EQUAL,当Z=1时成立
       G: GREATER(大于),当Z=0且S=0时成立
       L: LESS(小于),当S不为零时成立
       N: NOT(相反条件),需和其它符号配合使用
       O: OVERFLOW,O=1时成立
       P: PARITY,P=1时成立
       PE: PARITY EVEN,P=1时成立
       PO: PARITY ODD,P=0时成立
       S: SIGN,S=1时成立
       Z: ZERO,Z=1时成立

    LOOP
    功能: 循环指令集
    语法: LOOP 地址

    LOOPE(Z)
    格式:LOOPNE(Z) 地址
    标志位: 无

    CALL,RET
    功能: 子程序调用,返回指令
    语法: CALL 地址 RET RET n
    标志位: 无

    INT,IRET
    功能: 中断调用及返回指令
    语法: INT n IRET
    标志位: 在执行INT时,CPU会自动将标志寄存器的值入栈,在执行IRET时则会将堆栈中的标志值弹回寄存器

    处理器状态控制指令
    NOP
    功能: 空操作指令。不执行任何操作,但要花费CPU一个机器周期
    格式: NOP

    HLT
    功能: 暂停指令。CPU不执行任何操作,一直处于暂停状态,但IP指向HLT的下一条指令。
    格式: HLT
    脱离HLT状态的方式:1、CPU复位;2、CPU响应中断

    ESC,WAIT,LOCK
    功能: 用于多处理器系统。其中ESC是交权指令;WAIT是等待指令;LOCK是总线封锁指令

  • 相关阅读:
    年末反思
    Flink运行时架构
    Phoenix 启动报错:Error: ERROR 726 (43M10): Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.
    Clickhouse学习
    Flink简单认识
    IDEA无法pull代码到本地,Can't Update No tracked branch configured for branch master or the branch doesn't exist.
    第1章 计算机系统漫游
    简单的 Shell 脚本入门教程
    开源≠免费 常见开源协议介绍
    MySQL 视图
  • 原文地址:https://www.cnblogs.com/yuanscn/p/12802745.html
Copyright © 2011-2022 走看看