組合語言學習筆記

在南京看海發表於2016-09-09

一、補碼

00000000b~01111111b表示0~127,按位取反後加1表述負數:

00000000b:0       11111111b+1=00000000b:0
00000001b:1       11111110b+1=11111111b:-1
00000010b:2       11111101b+1=11111110b:-2
01111111b:127     10000000b+1=10000001b:-127
結論:
1)最高位為1,表示負數
2)正數補碼取反加1後為負數的補碼;負數的補碼取反加1後位其絕對值。比如:
   1的補碼位00000001b,取反加1後位:11111111b,表示-1
   -1的補碼位11111111b,取反加1後位:00000001b,其絕對值位1
   利用此特性可以得知負數補碼代表什麼數值

 

 

二、暫存器

1、CS為指令段暫存器;IP為指令指標暫存器;CS:IP(CS*16+IP)為指令地址
   不可使用mov指令直接修改暫存器值,可使用jmp指令:jmp 2Ae3:3  同時修改CS和IP;jmp ax 單獨修改IP


2、DS為記憶體資料暫存器;ds設值後,[bx]取指定索引資料;或者DS:[bx]
   不可mov一個立即數給它,使用mov bx,1000h; mov ds,bx來賦值
   ES指向附加段,和DS功能相同,都可訪問記憶體,特殊情況:進行串操作時,目的地址的段暫存器規定為ES。


3、SS為棧段暫存器;SP為棧指標暫存器;SS:SP(SS*16+SP)指向棧頂元素
   PUSH:SP=SP-2後入棧
   POP ax:SS:SP資料取到ax,SP+=2;
   PUSH、POP可以對段暫存器做操作


4、BX、SI、DI、BP,只有這四個暫存器可以存放記憶體索引:
   mov ax,[si]               
   mov ax,[bx+si]           
   mov ax,[si+idata]        
   組合情況只有四種:bx+si;bx+di;bp+si;bp+di
   使用到BP暫存器,預設段在SS中;其他預設DS中。


5、CX存放迴圈次數:
   mov cx,12
s: add dx,ax
   loop s
   儲存條件轉移指令的條件:
   jcxz s


6、DX、AX預設存放除數:
   除數16位則預設放AX,32位則預設DX存放高16位,AX存放低16位;
   被除數位8位,預設AL存放商,AH存放餘數,16位則AX存放商,DX存放餘數。
   div bx     將dx*10000H+ax除bx,商放在ax,餘數放在dx
   div bl     將ax除bl,商放在al,餘數放在ah


7、DX、AX用於乘法:
   8位相乘,一個預設放在AH中,另一個放在8位暫存器或者記憶體,結果預設放在AX中。
   16位相乘,一個預設在AX中,另一個放在16位暫存器或者記憶體,結果高位預設放在DX中,地位在AX中。


8、in和out指令只能使用ax或al來存放從埠中讀入或傳送的資料。
   in al,60h    從60h埠讀入一個位元組
   out 20h,al   往20h埠寫入一個位元組


9、flag標誌暫存器,8086CPU中,各位含義:
   15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
                   OF  DF  IF  TF  SF  ZF      AF      PF      CF
   第0位:CF,進位標誌位,無符號運算時,記錄結果的最高有效位向更高位進位或從最高位的借位值;
   第11位:OF,溢位標誌位,有符號運算時,結果發生溢位則OF=1;否則OF=0;
   第2位:PF,奇偶標誌位,記錄指令執行後,結果的二進位制位中1的個數是否為偶數,是偶數則PF=1,為奇數則PF=0;
   第6位:ZF,零標誌位,記錄指令執行後,結果是否為0,為0則ZF=1;不為0則ZF=0;
   第7位:SF,符號標誌位,記錄指令執行後,結果是否為負,為負則SF=1;不為負則SF=0;
   第10位:DF,方向標誌位,串處理指令中,控制每次操作後,si,di的增減,DF=0,每次操作後si,di遞增;DF=1,則遞減;
   第9位:IF,CPU響應中斷標記,CPU檢測到可遮蔽中斷資訊時,如果IF=1,則響應中斷,如果IF=0,則不響應。
   
   標誌暫存器在debug中式單獨標示的:
   標誌   值為1的標記    值為0的標記
   OF     OV             NV
   SF     NG             PL
   ZF     ZR             NZ
   PF     PE             PO
   CF     CY             NC
   DF     DN             UP

 

 

三、指令

1、mov: mov ax,bx  將bx賦值給ax


2、add: add ax,bx  將bx累加到ax


3、sub: sub ax,bx  將ax減去bx,儲存到ax


4、div: div bx     將dx*10000H+ax除bx,商放在ax,餘數放在dx


5、inc: inc bx     將bx自增1


6、and: and al,11011111b   將al邏輯與11011111b,結果儲存在al


7、or:  or  al,11011111b   將al邏輯或11011111b,結果儲存在al


8、ptr: add word ptr [bx],2 對bx開始的記憶體做字操作
        inc byte ptr [bx]   對bx開始的記憶體做位元組操作
        有暫存器參與的表示式,由暫存器決定操作長度:add ax,[bx] /  add al,[bx]


9、偽指令db、dw、dd分別代表定義立即數型別為位元組、字、雙字:
   db  1   data:0 = 01h        佔一個位元組
   dw  1   data:0 = 0001h      佔一個字
   dd  1   data:0 = 00000001h  佔兩個字


10、偽指令dup表示立即數重複次數,配合db、dw、dd使用:
   db  3  dup(0) 定義三個位元組都是0,即db 0,0,0
   db  3  dup(0,1,2) 定義9個位元組,即db 0,1,2,0,1,2,0,1,2


11、操作符offset:
    start:mov ax,offset start   相當於mov ax,0  offset操作符取得標號start的偏移地址0
        s:mov ax,offset s       相當於mov ax,3


12、jmp指令:可以只修改IP,也可以同時修改CS和IP
    jmp short s    短轉移,只修改IP:-128~127         機器碼包含位移
    jmp near ptr s 段內近轉移,只修改IP:-32768~32767 機器碼包含位移
    jmp far ptr s  段間近轉移,修改CS和IP             機器碼明確包含了CS地址和IP地址
    jmp al:將al賦值給IP
    jmp word ptr ds:[0]:將記憶體地址0處的一個字賦給IP


13、jcxz指令:條件轉移指令,都是短轉移,只修改IP:-128~127
    jcxz s:如果CX暫存器為0,則轉移到s處。


14、loop指令為迴圈指令,所有迴圈指令都是短轉移。機器碼包括位移而不是目的地址
    loop s:如果CX--後不為0,則轉移到s處


15、ret指令用棧中的資料修改IP,實現近轉移,相當於POP IP;
    retf指令用棧中資料修改CS和IP內容,實現遠轉移,相當於POP IP;POP CS;


16、call指令執行以下兩步操作,不能實現短轉移,其他合jmp指令相同:
    1)將當前的IP或者CS和IP壓棧
    2)轉移
    用法包括:
    1)call 標號:將當前IP壓棧後,轉移到標號處執行,相當於
       PUSH IP
       jmp near ptr 標號
    2)call ax:類似1
    3)call word ptr [bx]:類似1
    4)call dword ptr [bx]:段間轉移,相當於
       push CS
       push IP
       jmp dword ptr [bx]


17、mul乘法指令:
    8位相乘,一個預設放在AH中,另一個放在8位暫存器或者記憶體,結果預設放在AX中。
    16位相乘,一個預設在AX中,另一個放在16位暫存器或者記憶體,結果高位預設放在DX中,地位在AX中。
    mul reg
    mul byte ptr ds:[0]
    mul word ptr [bx+si+8]
    舉例:
    mov al,1000
    mov bl,10
    mul bl
    結果:ax = 1000


18、adc指令:帶進位加法指令
    adc ax,bx 相當於ax=ax+bx+CF


19、sbb指令:借位減法指令
    sbb ax,bx 相當於ax = ax-bx-CF


20、cmp指令:比較指令,做減法運算,不儲存結果,隻影響標誌暫存器
    mov ax,8
    mov bx,3
    cmp ax,bx
    執行後:ax=8,ZF=0,PF=1,SF=0,CF=0,OF=0
    cmp ax,bx比較無符號數各種可能:
    ZF=1  說明ax=bx
    ZF=0  說明ax!=bx
    CF=1  說明ax<bx
    CF=0  說明ax>=bx
    CF=0 && ZF=0  說明ax>bx
    CF=1 || ZF=1  說明ax<=bx
    cmp ah,bh比較有符號數各種可能:
    ZF=1  說明ah=bh
    ZF=0  說明ah!=bh
    SF=1 && PF=0  說明ah<bh
    SF=1 && OF=1  說明ah>bh
    SF=0 && OF=1  說明ah<bh
    SF=0 && OF=0  說明ah>=bh


21、其他條件轉移指令:
    je   等於則轉移      ZF=1
    jne  不等於則轉移    ZF=0
    jb   低於則轉移      CF=1
    jnb  不低於則轉移    CF=0
    ja   高於則轉移      CF=0 且 ZF=0
    jna  不高於則轉移    CF=1 或 ZF=1


22、movsb:將di:si指向的記憶體位元組送入es:di,然後根據DF位標記,將si和di遞增或遞減
    movsw:傳送的是字,然後si和di遞增或遞減2
    rep movsb/w:rep指令根據cx的值,重複指向後面的串傳送指令,相當於:
                 s: movsb/w
                     loop s
    cld:將標誌暫存器DF位置0
    std:將標誌暫存器DF位置1


23、pushf:將標誌暫存器的值壓棧
    popf:從棧中彈出資料,送入標誌暫存器


24、shl和shr邏輯移位指令
    shl邏輯左移指令(shr類似):
    1)將一個暫存器或記憶體單元中的資料向左移位
    2)將最後移出的一位寫入CF中
    3)最低位用0補充
    mov al,01001000b
    shl al,1
    執行後al=10010000b,CF=0
    如果移動位數大於1,必須將位數放在cl中。
    mov al,01001000b
    mov cl,3
    shl al,cl
    執行後al=10001000b,CF=1
    
25、in、out指令。
   CPU最多可以定位64K個不同埠,即0~65535。
   對埠的讀寫不能使用mov指令,只能使用:in和out。
   in和out指令只能使用ax或al來存放從埠中讀入或傳送的資料。
   對0~255以內埠讀寫:
   in al,20h   從20h埠讀入一個位元組
   out 20h,al  從20h埠寫入一個位元組
   對256~65535的埠讀寫,埠號放在dx中:
   mov dx,3f8h
   in al,dx
   out dx,al       


26、sti、cli指令
   sti  用於設定IF=1
       cli  用於設定IF=0

 

 

四、中斷

1、8086CPU的中斷向量表固定在:0000:0000到0000:03E8的1000個單元中一個表項佔用兩個字,高地址字存放段地址,低地址字存放偏移地址


2、8086CPU的中斷過程:
   1)從中斷資訊中取得中斷型別碼                                                                     :取得中斷型別碼N
   2)標誌暫存器的值入棧                                                                             :pushf
   3)設定標誌暫存器的第8位TF和第9位IF的值為0                                                        :TF=0,IF=0(禁止其他可遮蔽中斷)
   4)CS的內容入棧                                                                                   :push CS
   5)IP的內容入棧                                                                                   :push IP
   6)從記憶體地址為 中斷型別碼*4 和 中斷型別碼*4+2 的兩個字單元中讀取中斷處理程式入口地址設定IP和CS   :IP=N*4 , CS=N*4+2


3、中斷處理程式常規步驟:
   1)儲存用到的暫存器
   2)處理中斷
   3)恢復用到的暫存器
   4)用iret指令返回,iret指令用匯編語法描述為:
          pop IP
          pop CS
          popf


4、CPU執行int n指令,相當於引發一個N號中斷的中斷過程,參考2


5、BOIS和DOS中斷例程的安裝過程:
   1)開機後,CPU一加電,初始化CS=0FFFFH,IP=0,自動從FFFF:0單元開始執行程式。此處有一條跳轉指令,CPU執行該指令後,轉去執行
      BOIS中的硬體系統檢測和初始化程式。
   2)初始化程式將建立BIOS所支援的中斷向量,即將BIOS提供的中斷例程的入口地址登記在中斷向量表中,注意,對於BIOS所提供的中斷例
      程,只需將入口地址登記在中斷向量表中即可,因為它們是固化到ROM中的程式,一直在記憶體中存在。
   3)硬體檢測和初始化完成後,呼叫int 19h進行作業系統的引導,從此將計算機交由作業系統控制。
   4)DOS啟動後,除完成其他工作外,還將它所提供的中斷例程裝入記憶體,並建立相應的中斷向量。


6、外中斷,包括兩類:
   1)可遮蔽中斷:IF=1,響應中斷,IF=0,不響應中斷
      幾乎所有的外設引發的中斷,都是可遮蔽中斷。
      sti  用於設定IF=1
      cli  用於設定IF=0
   2)不可遮蔽中斷
      CPU必須響應,中斷型別碼固定為2,因此中斷過程第一步,不需要取中斷型別碼了。

相關文章