匯編
匯編語言包含兩種指令:
- 匯編指令
- 偽指令
偽指令
沒有對應的機器指令,最終不會被CPU執行。偽指令是編譯器執行的指令。
segement和ends
segement 表示一個段的開始,ends表示一個段的結束
段名 segment
段名 ends
比如:
codesg segement
codesg ends;
end
表示一個匯編程序的結束標記,編譯器在編譯的時候如果碰到了end,就會結束對源程序的編譯
assume
假設某一段寄存器和程序中的某一個用
segment...ends
定義的段相關聯。
標號
一個標號指代了一個地址,
步過循環p
遇到loop使用p來進行跳過
跳到指定的語句g ip
使用g ip跳到指定語句
start 告訴程序的入口
assume cs:code
code segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
start: mov bx, 0 ; 跳過前面的數據,不加start代碼會從數據處開始
mov ax, 0
mov cx, 8
s:add ax, cs:[bx]
add bx, 2
loop s
mov ax, 4c00h
int 21h
code ends
end start
匯編指令
匯編只有是有對應的機器碼的指令,可以被便以為機器指令,最終為CPU所執行。
loop
assume cs:code
code segment
mov ax,2
mov cx,11
s: add ax,ax
loop s
mov ax, 4c00H
int 21H
code ends
end
loop 執行之后,寄存器cx會自動減一,直到減到0,跳出循環執行loop的下一條語句
段前綴 ds, cs, ss, es
指令mov ax, [bx]
中,內存的那元的偏移地址由bx給出,而段地址默認在ds中。我們可以在訪問內存單元的指令中顯式地給出內存單元的段地址所在的段寄存器。
例如
mov ax, ds:[bx]
mov ax, cx:[bx]
mov ax, ss:[bx]
mov ax, es:[bx]
mov ax, ss:[0]
mov ax, cs:[0]
[bx+idata]
表示一個內存單元,偏移地址+idata = 新的偏移地址
常用格式, 下面的寫法都是將bx + 200
mov ax, [200 + bx]
mov ax, 200[bx]
mov ax, [bx].200
SI和DI
SI和DI是8086CPU中和BX功能相近的寄存器
下面3組指令實現了相同的功能
; 1
mov bx, 0
mov ax, [bx]
;2
mov si, 0
mov ax, [si]
;3
mov di, 0
mov ax, [di]
[bx + si]
和 [bx + di] 的用法一樣
[bx + si]
表示一個內存單元,它的偏移地址為(bx) + (si)(即bx中的數值加上si中的數值)
常用格式
;1
mov ax, [bx + si]
;2
mov ax, [bx][si]
[bx + si + idata]和[bx + di + idata]的用法一樣
[bx + si + idata]表示一個內存單元,它的偏移地址為(bx) + (si) + idata(即bx中的值加上si中的值再加上idata)
常用格式
;1
mov ax, [bx + 200 + si]
;2
mov ax, [200 + bx + si]
;3
mov ax, 200[bx][si]
;4
mov ax, [bx].200[si]
;5
mov ax, [bx][si].200
通過and和or轉換大小寫
轉換為大寫
and al, 11011111b
轉換為小寫
or al, 00100000b
reg表示寄存器sreg表示段寄存器
reg的集合包括:ax, bx, cx, dx, ah, al, bh, bl, ch, cl, dh, dl, sp, bp, si, di
sreg的集合包括:ds, ss, cs, es
'