寄存器一覽
- 通用寄存器
- 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 內存單元 | 同理 |
另外:pushf 和 popf 表示將標志寄存器的值壓棧和出棧
loop
mov ax, 2 mov cx, 11 s: add ax, ax loop s
loop s 表示:
- cx = cx - 1
- 如果 cx 為 0 則繼續執行下面的指令
- 如果 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