天天看点

汇编基础知识整理

提取URL中的DNS : cat *|awk -F[\/] '{print $3}'|sort -u >>gwdns

基本格式

assume cs:codesg

date segment

;数据段

date ends

code segment

;代码段

code ends

mov ax,4c00h

int 21H

end

进制表示符号

         b:二进制

     o:八进制

     d:十进制

     h:十六进制

大小写转换    (A=41H   a=61H)

      转换为大写:and al,11011111b

      转换为小写:or  al,00100000b

寄存器 : AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW

   AX,BX,CX,DX  通用寄存器  //AX为16位寄存器 可以用AH表示其高八位 AL表示其低八位。赋值用mov AX,values

   CS,DS,ES     段寄存器    //赋值时需要用通用寄存器进行中转,不可以直接赋值

   IP           指令寄存器  //CS:IP表示当前指令的物理地址 初始时 CS=FFFFH IP=0000H 即第一条指令为FFFF0 赋值用jmp CS:IP

   SP           栈寄存器    //SS:SP指向栈顶单元。

   SI,DI        16位寄存器  //不能拆分为八位 有且只有bx si di bp四个寄存器可用于寻址。(bx,bp) (si,di)不可同时出现

标志寄存器(flag)

   ZF (6)    零标志寄存器    //相关指令执行后,结果为0 则zf=1

   PF (2)    奇偶标志寄存器  //相关指令执行后,结果中所有bit中1的总数为偶数,则PF=1

   SF (7)    负数标志寄存器  //相关指令执行后,结果为负数,则SF=1

   CF  (0)     进位标志寄存器  //无符号运算时,如果进位或者借位,则CF=1

   OF (11)   溢出标志位      //有符号运算时,如果溢出,则OF=1  

   DF (10)   方向寄存器      //df=0,si,di递增  df=1,则递减 与串传送指令结合使用

条件转移指令(cmp之后)

   jcxz        //cx=0则跳转

   je          //等于则跳转   ZF=1

   jne         //不等于则跳转 ZF=0

   jb          //小于则跳转   CF=1

   jnb         //不低于则跳转 CF=0

   ja          //大于则跳转   CF=0且OF=0

   jna         //不大于则跳转 CF=1或OF=1

DEBUG

  -R [寄存器]             //查看寄存器 修改寄存器的值

  -D 段地址:偏移地址     //显示内存中的内容

  -E 段地址:偏移地址 数据 数据 // 插入数据到指定位置

  -u 段地址:偏移地址     //查看机器码对应的汇编指令

  -t                      //执行CS:IP对应的机器指令(STEP IN)

  -P                      //执行CS:IP对应的机器指令(STEP OVER)

  -a 以汇编指令的形式写入机器指令

  -q                       //quit

汇编指令

   mov  ax,var

   movsb        //串传送  es:di=ds:si    sidi根据DF标志递增或递减

   movsw        //字单元传送  每次传送一个字的长度,si di加2或减2

   rep movsb    //s:movsb ;loop s

   add  ax,bx  //ax=ax+bx

   adc  ax,bx  //ax=ax+bx+CF  进位加法

   sub  ax,bx  //ax=ax-bx

   sbb  ax,bx  //ax=ax-bx-CF  借位减法

   inc  ax      //ax++

   jmp 类型 标号//jmp short/near ptr对应的机器码中,不包含目的地址 而是包含位移,用补码表示

   jcxz 标号    //if(cx==0),jmp 标号

   loop 标号    //cx=cx-1 if(cx!=0) goto 标号 一般cx储存循环次数 进行嵌套循环时用栈暂存计数

   and          //按位与

   or           //按位或

   push  ax     //压栈,将ax中的数据储存到SS:SP指向的内存单元,SP++

   pop   ax     //出栈,将ss:sp指向的内存单元的数据赋值给ax,sp--      栈操作以byte为单位操作

   pushf        //将标志寄存器的值压栈

   popf         //从栈中弹出数据,送入标志寄存器

   call         //将CS,IP压栈后跳转的标号处

   ret          //pop IP

   retf         //pop ip  pop cs

   div reg      //除法指令,参数为除数,除数为8位时,被除数储存在AX中,商储存在AL中,余数储存在AH中

                  除数为16位时 被除数为32位,DX中存放高16位,AX中存放低十六位。。商储存在Ax余数储存在DX中

   mul reg      //16位乘法,乘数默认放在AX中。结果高位存放在DX,地位存放在AX中。八位乘数放在AL中,结果放在AX中

   int n        //中断指令 ,n为中断代码

伪指令

   不对应机器指令 不被执行,由编译器识别

   db           //定义byte型变量

   dw           //定义word型变量

   dd           //定义double word变量

   dup          //与db,dw,dd结合使用 申请重复的空间。 db 5 dup (123)   开辟十五个字的空间 初始化为123123123123123

   offset 标号  //获取标号的便宜地址

   segment      //标志段的开始

   ends         //标志段的结束  

   end          //汇编程序编译的结束   start {。。} end start 联合知名程序的开始与结束

   assume  段寄存器:段名  //关联两者,写在程序开头                       http://hi.baidu.com/dandanfeng166/item/f6cdf5b97322edfc4ec7fd61?qq-pf-to=pcqq.c2c

程序返回

    程序结束后,将CPU的控制权交给调用它的程序

       mov ax,4c00h

    int 21H  //在debug时,一般用P来执行

    如果是通过command运行,运行结束后返回command。如果通过debug运行 运行之后返回debug。

安全的内存区域 :0:200h~02ffh

寻址方式

     【idata】        //常量

     【bx】           //变量       (结合inc访问由ds开始的连续的一段内存)

     【bx+idata】     //变量+常量  (数组)

     【bx+si】        //变量+变量  

     【bx+si+idata】  //变量+变量+常量

知名内存单元长度

      word ptr        //操作字节   mov word ptr ds:【0】,1

      byte ptr        //操作位

继续阅读