8086汇编

汇编

调试

1
2
3
4
5
6
7
debug test.exe
-r 查看当前的状态,包括寄存器、 地址和汇编指令
-p 单步步过
-t 单步步入
-u 查看汇编代码,在输入u接着显示
-d 0d9a 显示内存
-g 退出

指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
call
ret
;加减法:
add p1,p2 ;两数相加把结果放p1
inc ax ;自增相当于ax++
sub p1,p2;两数相减把结果放p1
dec ax ;自减相当于ax--
loop ;每循环一次CX(计数寄存器)的值减一

cmp p1,p2;两数相减比较
CF:进位位,有进位或借位为1
ZF:零值位,计算结果为0则为1
cmp ax,bx;
ax- bx ==0 -> CF:0 ZF:1
ax!=bx-> ax-bx!=0 -> ZF:0
ax<bx -> ax-bx<0 -> CF:1 ZF:0
ab>bx -> ax-bx>0 -> CF:0 ZF:0
ax<=bx -> ax-bx<=0 -> CF:1 || ZF:1
ax>=bx -> ax -bx>=0 -> CF:0 || ZF:1


jmp addr;无条件跳转,不依赖条件
je/jz (标号/地址);条件转移,等于则跳转,ZF=1
jne addr;不等于则跳转,ZF=0则跳转
jb addr; 低于则跳转 CF=1
ja addr; 高于则跳转 CF=0 && ZF=0
jnb addr;不低于则跳转
jna addr;不高于则跳转

“函数”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
assume cs:code
code segment
;定义一个函数
btadd PROC
;取ax,bx相加并把结果保存在ax
add ax,bx
;返回
ret
btadd ENDP
;程序入口
start:
mov ax,3
mov bx,4
call btadd
;退出
mov ax,4C00H
;DOS中断
int 21
code ends
end start

Flag寄存器

xxxxxxxxxx __construct() 当一个对象创建时被调用,__destruct() 当一个对象销毁时被调用,__toString() 当一个对象被当作一个字符串被调用。__wakeup() 使用unserialize时触发__sleep() 使用serialize时触发__destruct() 对象被销毁时触发__call() 在对象上下文中调用不可访问的方法时触发__callStatic() 在静态上下文中调用不可访问的方法时触发__get() 用于从不可访问的属性读取数据__set() 用于将数据写入不可访问的属性__isset() 在不可访问的属性上调用isset()或empty()触发__unset() 在不可访问的属性上使用unset()时触发__toString() 把类当作字符串使用时触发,返回值需要为字符串__invoke() 当脚本尝试将对象调用为函数时触发php