mov ah, 9h int 21h 打印中斷
21h中斷中的9h中斷碼代表打印, CPU拿到需要打印的數(shù)據(jù), 將其放到顯示內(nèi)存(顯存)上,完成打印操作
assume cs:code, ds:data, ss:stack
stack segment
db 20 dup(1) ; 定義20個字節(jié)作為棧段
stack ends
data segment
db 20 dup(2)
str db 'hello world!$'
data ends
code segment
start:
mov dx, offset str ;將str這個偏移地址賦給dx
mov ah, 9h
int 21h ;當(dāng)CPU讀取到21H中斷中的這個中斷中的9H中斷碼時, CPU會取出dx中所保存的值當(dāng)做字符數(shù)據(jù)的偏移地址, 這個時候相當(dāng)于找到了DS:[20],當(dāng)讀取到 $ 時就會結(jié)束
mov ah , 4ch
int 21h
code end
end start
Call 和 ret 指令
-
Call指令和ret指令要配合使用
Call 指令, 相當(dāng)于函數(shù)的調(diào)用
- Call 標(biāo)號來調(diào)用
- 將下一條指令的偏移地址入棧
- 跳轉(zhuǎn)到定位地址執(zhí)行指令
ret 指令: 將棧頂?shù)闹祊op給IP
- 任何函數(shù)在ret之前都會將函數(shù)內(nèi)部聲明的變量pop掉, 用來維持棧平衡, 保證sp指向的是下一條指令的地址
assume cs:code, ds:data, ss:stack
stack segment
db 20 dup(1) ; 定義20個字節(jié)作為棧段
stack ends
data segment
db 20 dup(2)
str db 'Hello world!$'
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov ax, 1122H
call print ;相當(dāng)于函數(shù)調(diào)用
mov ax, 4ch
int 21h
print: ;為什么要寫在中斷之后呢?因為code會從上往下依次執(zhí)行
mov ax, 3344h
push ax ; 進(jìn)行了push操作后 必須進(jìn)行pop保持棧平衡, 防止ret時pop的數(shù)據(jù)不是下一條指令的地址
mov dx, offset str ; 通過offset將str的偏移地址存入dx
mov ah, 9h ;
int 21h
pop ax
ret
code end
end start