8086偽指令
- db (define byte) 字節(jié)
- dw (define word) 字
示例代碼:
assume cs:code
code segment
db 1,2,3,4,5,6,7,8,9
db 'hello'
db "Flonger"
start:
mov al,cs[3]
mov ah,0
mov ah,4cH
int 21H ;中斷 中斷碼叫做21
code ends
end start
除了cs段不需要指定,剩下的棧段ss,數(shù)據(jù)段ds必須指定
示例代碼:
assume cs:code,ds:data,ss:stack
;棧段(存放數(shù)據(jù),比如高級語言中的局部變量)
stack segment
db 20 dup(0)
stack ends
;數(shù)據(jù)段(存放數(shù)據(jù),比如高級語言中的全局變量)
data segment
db 20 dup(0)
str db "Hello World!$"
data ends
;代碼段
code segment
start:
;設(shè)置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov ax,1122h
;退出程序
mov ah,4ch
int 21h
code ends
end start
打印的指令:
;打印,遇到$停止打印
mov ah,9h
int 21h
Call 和 ret 指令
-
Call指令
將下一條指令的偏移地址入棧
跳轉(zhuǎn)到定位的地址執(zhí)行指令
-
ret指令
將棧頂?shù)闹祊op給IP
示例代碼:
assume cs:code,ds:data,ss:stack
;棧段(存放數(shù)據(jù),比如高級語言中的局部變量)
stack segment
db 20 dup(0)
stack ends
;數(shù)據(jù)段(存放數(shù)據(jù),比如高級語言中的全局變量)
data segment
db 20 dup(0)
str db "Hello World!$"
data ends
;代碼段
code segment
start:
;設(shè)置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;業(yè)務(wù)邏輯代碼
call print
mov ax,1122h
;退出程序
mov ah,4ch
int 21h
print:
mov ax,3344h
push ax
mov dx,offset str;offset 獲得標(biāo)號對應(yīng)的偏移
mov ah,9h
int 21h
pop ax
ret
code ends
end start
-
函數(shù)調(diào)用,參數(shù)使用寄存器
示例代碼
assume cs:code,ds:data,ss:stack
;棧段(存放數(shù)據(jù),比如高級語言中的局部變量)
stack segment
db 20 dup(0)
stack ends
;數(shù)據(jù)段(存放數(shù)據(jù),比如高級語言中的全局變量)
data segment
db 20 dup(0)
data ends
;代碼段
code segment
start:
;設(shè)置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;業(yè)務(wù)邏輯代碼
mov bx,3h
mov dx,4h
call sum
;退出程序
mov ah,4ch
int 21h
;參數(shù):傳遞兩個字型參數(shù),參數(shù)分別用bx,dx存放
;返回值:返回值存放在ax中
sum:
mov ax,bx
add ax,dx
ret
code ends
end start
棧平衡
- 在逆向過程中發(fā)現(xiàn)ip突然上升,然后又恢復(fù),指的是調(diào)用了一次函數(shù)
- 函數(shù)內(nèi)部使用棧里面的數(shù)據(jù)不能pop來取,只能用段地址+偏移地址(SS:SP)來取
-
這里引入bp寄存器
-
在棧里面尋址不能用SS:[SP + 1]
-
所以引入bp寄存器
-
mov bp,sp
mov ax,ss:[bp + 1]
函數(shù)棧平衡:保證函數(shù)調(diào)用前后的棧頂是一致的
- 外平棧
push 1h
push 2h
call sum
add sp,4
- 內(nèi)平棧
sum:
mov bp,sp
mov ax,ss:[bp+2]
mov ax,ss:[bp+4]
ret 4
示例代碼:
assume cs:code,ds:data,ss:stack
;棧段(存放數(shù)據(jù),比如高級語言中的局部變量)
stack segment
db 20 dup(0)
stack ends
;數(shù)據(jù)段(存放數(shù)據(jù),比如高級語言中的全局變量)
data segment
db 20 dup(0)
data ends
;代碼段
code segment
start:
;設(shè)置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;業(yè)務(wù)邏輯代碼
push 1h
push 3h
push 4h
call sum
;add sp,6
push 1h
push 3h
push 4h
call sum
;add sp,6
push 1h
push 3h
push 4h
call sum
;add sp,6
;退出程序
mov ah,4ch
int 21h
;參數(shù):傳遞兩個字型參數(shù),參數(shù)分別用bx,dx存放
;返回值:返回值存放在ax中
sum:
mov bp,sp
mov ax,ss:[bp + 2]
add ax,ss:[bp + 4]
add ax,ss:[bp + 6]
ret 6
code ends
end start
;函數(shù)棧平衡:保證函數(shù)調(diào)用前后的棧頂是一致的
;1.外平棧:由函數(shù)外部保持棧平衡
;2.內(nèi)平棧:由函數(shù)內(nèi)部保持棧平衡