x86匯編小結(jié)一

x86處理器架構(gòu)

架構(gòu)圖.jpg

寄存器

  • AX:通用寄存器,低8位為AL寄存器,高8位為AH寄存器。一般是累加寄存器。
  • BX:通用寄存器,低8位為BL寄存器,高8位為BH寄存器。一般還是基址寄存器。
  • CX:通用寄存器,低8位為CL寄存器,高8位為CH寄存器。一般作循環(huán)計數(shù)器。
  • DX:通用寄存器,低8位為DL寄存器,高8位為DH寄存器。一般還用于與外設(shè)進行數(shù)據(jù)交換。
  • CS:代碼段寄存器。
  • IP: 代碼段指針寄存器。只有處理器才能改變它的內(nèi)容。
  • ES:附加段寄存器。
  • DS:數(shù)據(jù)段寄存器。
  • SS:棧段寄存器。
  • SP:棧段指針寄存器。
  • SI:源索引寄存器。
  • DI:目標索引寄存器。
  • EFLAGS:存放CPU的2類標志的寄存器。
    • 狀態(tài)標志:反映處理器當前的狀態(tài)。
    • 控制標志:用來控制處理器的工作方式。
      狀態(tài)標識每次運算后自動產(chǎn)生,控制標志的值則有指令設(shè)置。
標志 意義
OF 溢出標志;OF=1表示2個有符號數(shù)運算超出可表示范圍。
DF 方向標志(迭代方向,類比i++或者i--);執(zhí)行指令后,源或目的指 針加法還是減法。OF=1表示減法
IF 中斷允許標志;IF=1表示CPU響應(yīng)終端信號。 屬于控制標志
SF 符號標志;SF=1標識運算結(jié)果最高位為1。
ZF 零標志;ZF=1表示結(jié)果為0
AF 輔助進位標志
PF 奇偶標志;進行奇偶校驗。PF=1表示低8位中有偶數(shù)個1。
CF 進位/錯位標志;
TF 單步狀態(tài)標識,用于程序調(diào)試,TF=1,每次執(zhí)行一條指令會暫停。 屬于控制標志

常用指令

  • mov 指令:
    mov 目的, 源。
    這里注意:

    • mov es,0xb800。這種寫法是錯誤的,intel不允許將一個立即數(shù)傳給* 段寄存器*。必須寫2條指令:mov ax ,0xb800。mov es,ax。
    • mov [0x01], [0x02]。這種寫法也是錯誤的,處理器不允許在2個內(nèi)存單元之間直接進行數(shù)據(jù)傳輸?shù)牟僮鳌?/li>
  • movsb 指令
    movsb和movsw用于把內(nèi)存中的一個地方數(shù)據(jù)批量地傳送到另一個地方。原始數(shù)據(jù)串地址由【DS】:【SI】指定,目標數(shù)據(jù)串地址由【ES】:【DI】指定,個數(shù)由CX指定。傳送方向EFLAGS寄存器中的DF標志指定。DF=0,表示正向傳送,SI和DI加1或加2(低地址到高地址)。DF=1表示反向傳送,類比。

  • inc和dec 指令:
    inc表示自增,dec表示自減。
    inc al。
    inc byte [ax]。

  • AND 指令:
    與運算,有0得0,全1為1。
    AND指令會影響EFLAGS:OF和CF位被清零,SF ZF PF位狀態(tài)依計算結(jié)果而定,AF狀態(tài)未定義。

  • OR 指令:
    或運算,有1得1,全0為0。
    OR指令會影響EFLAGS寄存器:OF和CF位被清零,SF ZF PF位狀態(tài)依計算結(jié)果而定,AF狀態(tài)未定義。

  • XOR 指令:
    異或:相異為1,相同為0。
    例如:xor dx, dx。 則將dx和dx異或結(jié)果存放在dx中。這條指令可以將dx清零。同樣效果的指令:mov dx,0。但是前者機器碼是31 D2,后者的機器碼是BA 00,00。xor指令不但更短,并且2個操作數(shù)都是通用寄存器,執(zhí)行速度更快。

  • shr邏輯右移指令:
    邏輯右移指令執(zhí)行時,會將操作數(shù)連續(xù)地向右移動指定位數(shù),每移動一次, “擠”出來的比特位被移到標志寄存器的CF位,左邊空出來的補0。

  • shl邏輯左移指令:
    和邏輯右移指令類似,會將操作數(shù)連續(xù)地向左移動指定位數(shù),每移動一次,“擠”出來的比特位被移到標志寄存器的CF位,右邊空出來的補0。

  • rol 循環(huán)右移指令:

  • rol 循環(huán)左移指令:

  • DB 等指令:

    • DB的意思是聲明字節(jié)(8)數(shù)據(jù),跟在它后面的操作數(shù)都占一個字節(jié)的長度。例如:DB 0
    • DW指令:用于聲明字(16)數(shù)據(jù)。
    • DD指令:用于聲明雙字(32)數(shù)據(jù)。
    • DQ指令:用于聲明四字(64)數(shù)據(jù)。
      這一系列的指令都屬于偽指令,偽指令沒有對應(yīng)的及其指令,僅僅在編譯階段由編譯器執(zhí)行。程序執(zhí)行時,偽指令已經(jīng)不存在。
  • DIV 指令:
    8086處理器提供2種類型的除法:

    • 16位二進制除以8位二進制
      - 被除數(shù):AX寄存器提供。
      - 除數(shù):通用寄存器或者內(nèi)存單元提供。
      - 商:存在AL寄存器中。
      - 余數(shù):存在寄存器AH中。
    • 32位的二進制數(shù)除以16位的二進制數(shù)
      - 被除數(shù):高16位在DX中,低16位在AX中。
      - 除數(shù):通用寄存器或者內(nèi)存單元提供。
      - 商:存在AX寄存器中。
      - 余數(shù):存在DX寄存器中。
  • in 指令:
    in指令是從端口讀,只有:
    in al(端口號), dx;
    in ax(端口號),dx;
    in al(端口號),0xf0;
    也就是說in指令的目的操作數(shù)必須是寄存器AL或者AX(8位的端口就是AL,16位的端口就是AX)。同時,in指令的源操作數(shù)應(yīng)該是寄存器DX或者立即數(shù)(端口號)。

  • out 指令:
    out指令向通過端口向外圍設(shè)備發(fā)送數(shù)據(jù)。和in指令相反源操作操作數(shù)是AL或AX,目的操作數(shù)是立即數(shù)(端口號)或者DX。
    out 0x37(端口號),al
    out dx(端口號), ax

尋址方式

  • 寄存器尋址
  • 立即數(shù)尋址
  • 內(nèi)存尋址
    其實就是指令中提供偏移地址,加上段寄存器最后形成地址。
    • 直接尋址(操作數(shù)是一個偏移地址)
    • 基址尋址
      用基址寄存器BX或者BP來提供偏移地址。采用BX基址寄存器時,默認 段寄存器是DS,采用BP基址寄存器時,默認的寄存器是SS。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容