Assembly Language ( based on 8086)
阿新 • • 發佈:2020-08-13
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
對於無符號數
對於有符號數