匯編語言全梳理(精簡版)


寄存器一覽

  • 通用寄存器
    • ax,bx,cx,dx,(ah,al,bh,bl,ch,cl,dh,dl)
    • sp,bp,si,di
  • 指令寄存器
    • ip
  • 標志寄存器
    • FR
  • 段寄存器
    • cs,ds,ss,es

 

mov

指令 示例
mov 寄存器, 數據 mov ax, 8
mov 寄存器, 寄存器 mov ax, bx
mov 寄存器, 內存

mov ax, [0]

mov ax, [bx]

mov 內存, 寄存器

mov [0], ax

mov [bx], ax

內存地址由 段地址:偏移地址 決定,8086 選擇 ds 段寄存器作為默認的段地址

由於段寄存器也是寄存器,除了硬件規定不能直接將數據 mov 到段寄存器之外,其他的和正常寄存器一樣

指令 示例
mov 段寄存器, 寄存器 mov ds, ax
mov 寄存器, 段寄存器
mov ax, ds
mov 段寄存器, 內存 mov ds, [0]
mov 內存, 段寄存器 mov [0], ds

變種

  • mov ax, 'a':處理字符
  • mov ax, [bx + 1]:可用作數組操作
  • mov ax, [bx + si]
  • mov ax, [bx + si + 1]
  • mov word ptr [0],1:指定長度為一個字
  • mov byte ptr ds:[0], 1:指定長度為一個字節

 

add / sub

 格式同 mov 一樣 

 

mul

計算:其中一個乘數放在 al 或 ax 中,另一個看指令

  • mul reg
  • mul 內存單元

結果:8位相乘結果放在 ax 中,16位相乘結果放在(高位dx 地位ax)中

 

div

  • div 寄存器
  • div 內存單元

除數為 8 位

  ax dx
  ah al  
計算時 被除數全部 16 位  
結果 余數  

 

除數為 16 位

  ax dx
計算時 被除數低 16 位 被除數高 16 位
結果 余數 

 

尋址方式總結

 

push / pop

CPU 取 SS:SP 作為棧頂地址,我們可以自己初始化棧頂地址為 10010H

mov ax, 1000H
mov ss, ax
mov sp, 0010H
指令 步驟
push ax

SP = SP - 2

ax 內容送入棧頂的內存地址

pop ax

棧頂的內存地址的內容送入 ax

SP = SP + 2

push/pop 段寄存器

同理

push/pop 內存單元

同理

另外:pushfpopf 表示將標志寄存器的值壓棧和出棧 

 

loop

mov ax, 2
mov cx, 11
s: add ax, ax
loop s

loop s 表示:

  1. cx = cx - 1
  2. 如果 cx 為 0 則繼續執行下面的指令
  3. 如果 cx 不為 0 則跳轉到標號 s 處

 

定義不同的段,標准示例

assume cs:code, ds:data, ss:stack

data segment
    dw 0001h, 0002h, ... 000fh
data ends

stack segment
    dw 0,0,0,0 ... 0
stack ends

code segment
    ;定義數據段
    mov ax, data mov ds, ax
    ;定義棧段
    mov ax, stack mov ss, ax
    mov sp, 20h
    ...
code ends

end

 

and / or

  • and al, 10110010B:邏輯與
  • or al, 10110010B:邏輯或

     

db dw dd dup

  • db:定義字節型數據
  • dw:定義字型數據
  • dd:定義雙字型數據
  • dup
    • db 3 dup (0) 相當於 db 0,0,0
    • db 3 dup (1,2) 相當於 db 1,2,1,2,1,2

 

跳轉指令

jump 類型

  • jump short 標號:根據相對位移跳轉 IP = IP + 8 位位移
  • jump near ptr 標號:IP = IP + 16 位位移
  • jump far ptr 標號:CS = 標號所在段的段地址;IP = 標號在段中的偏移地址
  • jump 16位reg:轉移地址在寄存器中 IP = (reg)
  • jump word ptr 內存:IP = (內存)
  • jump dword ptr 內存:CS = (內存+2);IP = (內存)
  • jcxz 標號:(cx) == 0 時,(IP) = (IP) + 8 位位移

call 和 ret / iret 類型

  • ret:形象解釋相當於 pop IP
    • (IP) = ((ss) * 16 + (sp))
    • (sp) = (sp) + 2
  • retf:形象解釋相當於 pop IP;pop CS
    • (IP) = ((ss) * 16 + (sp))
    • (sp) = (sp) + 2
    • (CS) = ((ss) * 16 + (sp))
    • (sp) = (sp) + 2
  • iret:形象解釋相當於 pop IP;pop CS;popf
  • call 標號:形象解釋相當於 push IP;jmp near ptr 標號
    • (sp) = (sp) - 2
    • ((ss) * 16 + (sp)) = (IP)
    • (IP) = (IP) + 16 位位移
  • call far ptr 標號:形象解釋相當於 push CS;push IP;jmp near ptr 標號
  • call 16位reg:形象解釋相當於 push IP;jmp 16位reg
  • call word ptr 內存單元:形象解釋相當於 push IP;jmp word ptr

子程序標准模板

子程序中使用的寄存器入棧

子程序內容

子程序中使用的寄存器出棧

返回(ret、retf)

 

rep movsb

  • 傳送的源地址:ds:si
  • 傳送的目的地址:es:di
  • 傳輸長度:cs
  • 傳輸方向:cld 為正向

 

端口讀取

  • in al, 20h
  • out 20h, al

如 CMOS 有兩個端口,70h 是地址端口,71h 是數據端口,所以要讀取 CMOS 某存儲單元處(2)的數據,就要

mov al, 2
out 70h, al
in al, 71h

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM