天天看點

彙編基礎知識整理

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

繼續閱讀