1. 程式人生 > 實用技巧 >Assembly Language ( based on 8086)

Assembly Language ( based on 8086)

14 個 16位的 暫存器

AX BX CX DX || BP SP IP || DI SI || PWD || CS SS DS ES



通用暫存器

為了相容上一代

同時也有一些特殊

段暫存器

定址方法




CS & IP


change cs and ip


Questions about IP

DS


指 DS

SS : SP


SS是用來確定每個不同的棧的,BP是用來確定一個棧中不同的棧幀的



MOV

LOOP


for example

An Example


Here is the answer

程式碼段 資料段 棧段

assume cs:code, ds:data, ss:stack
data segment
    dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends

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

code segment
start: 
    mov ax, stack
    mov ss, ax
    mov sp, 20h ;設定棧頂ss: sp 指向stack: 20
    mov ax, data
    mov ds, ax

    mov bx, 0
    mov cx, 8

    s:  push [bx]
        add bx, 2
        loop s
    
    mov bx, 0
    mov cx, 8

    s0: pop [bx]
        add bx, 2
        loop s0
    
    mov ax, 4c00h
    int 21h

code ends
end start

and or


SI DI

bx bp si di

定址方式


沒有暫存器時

div

dup

轉移指令


offset

jmp

段內轉移

jmp short [symbol]



jmp near ptr [symbol]


jmp far ptr [symbol]


jmp word ptr [記憶體單元地址](段內轉移)

jmp dword ptr [記憶體單元地址] (段間轉移)

jcxz 有條件轉移 均為段內轉移

loop

call & ret

ret & retf


如,下面程式碼中ret執行後,CS:IP指向程式碼段第一條指令


call






call 與 ret 配合 組成 子程式





標誌暫存器 CF = Carry Flag PF = Parity Flag ZF = Zero Flag SF = Sign Flag OF = Overflow Flag AF = Auxiliary Carry Flag System Flags NT = Nested Task RF = Resume Flag

ZF (Zero Flag)

PF (Parity Flag)

SF (Sign Flag)


CF (Carry Flag)


OF (Overflow Flag)

對有符號數的運算才看 OF 標誌位,如何 OF 為 1, 說明發生溢位, 運算出錯。
這裡這樣解釋, 當你進行無符號數的運算時, 設定所有的數都是原碼錶示, 此時只看CF位, 有進行的話, 運算沒錯, 只是要加上進位
而當你進行有符號數的運算時, 所有的數都是補碼錶示, 如果 OF位 為1, 說明發生溢位, 那麼運算就出錯了
切記使用 CF 還是 OF 視 需求 而定

adc

sbb

cmp 比較指令: 有很多需要說,關於無符號數和有符號數的cmp


對於無符號數

對於有符號數