8086伪指令
- db (define byte) 字节
- 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,数据段ds必须指定
示例代码:
assume cs:code,ds:data,ss:stack
;栈段(存放数据,比如高级语言中的局部变量)
stack segment
db 20 dup(0)
stack ends
;数据段(存放数据,比如高级语言中的全局变量)
data segment
db 20 dup(0)
str db "Hello World!$"
data ends
;代码段
code segment
start:
;设置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指令
将下一条指令的偏移地址入栈
跳转到定位的地址执行指令
-
ret指令
将栈顶的值pop给IP
示例代码:
assume cs:code,ds:data,ss:stack
;栈段(存放数据,比如高级语言中的局部变量)
stack segment
db 20 dup(0)
stack ends
;数据段(存放数据,比如高级语言中的全局变量)
data segment
db 20 dup(0)
str db "Hello World!$"
data ends
;代码段
code segment
start:
;设置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;业务逻辑代码
call print
mov ax,1122h
;退出程序
mov ah,4ch
int 21h
print:
mov ax,3344h
push ax
mov dx,offset str;offset 获得标号对应的偏移
mov ah,9h
int 21h
pop ax
ret
code ends
end start
-
函数调用,参数使用寄存器
示例代码
assume cs:code,ds:data,ss:stack
;栈段(存放数据,比如高级语言中的局部变量)
stack segment
db 20 dup(0)
stack ends
;数据段(存放数据,比如高级语言中的全局变量)
data segment
db 20 dup(0)
data ends
;代码段
code segment
start:
;设置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;业务逻辑代码
mov bx,3h
mov dx,4h
call sum
;退出程序
mov ah,4ch
int 21h
;参数:传递两个字型参数,参数分别用bx,dx存放
;返回值:返回值存放在ax中
sum:
mov ax,bx
add ax,dx
ret
code ends
end start
栈平衡
- 在逆向过程中发现ip突然上升,然后又恢复,指的是调用了一次函数
- 函数内部使用栈里面的数据不能pop来取,只能用段地址+偏移地址(SS:SP)来取
-
这里引入bp寄存器
-
在栈里面寻址不能用SS:[SP + 1]
-
所以引入bp寄存器
-
mov bp,sp
mov ax,ss:[bp + 1]
函数栈平衡:保证函数调用前后的栈顶是一致的
- 外平栈
push 1h
push 2h
call sum
add sp,4
- 内平栈
sum:
mov bp,sp
mov ax,ss:[bp+2]
mov ax,ss:[bp+4]
ret 4
示例代码:
assume cs:code,ds:data,ss:stack
;栈段(存放数据,比如高级语言中的局部变量)
stack segment
db 20 dup(0)
stack ends
;数据段(存放数据,比如高级语言中的全局变量)
data segment
db 20 dup(0)
data ends
;代码段
code segment
start:
;设置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;业务逻辑代码
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
;参数:传递两个字型参数,参数分别用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
;函数栈平衡:保证函数调用前后的栈顶是一致的
;1.外平栈:由函数外部保持栈平衡
;2.内平栈:由函数内部保持栈平衡