汇编基础知识整理

提取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        //操作位
   

猜你喜欢

转载自blog.csdn.net/u011762549/article/details/19900921