汇编 之call介绍
Call自动将下一条指令入栈 没有ret这条指令
Retn , retf 弹出栈
Retn + imm 表示平栈大小
Call 相当于 当前位置入栈 跳转子程序
Mov ax, $ + 6 ;$表示当前1p
Push ax
Jmp PRINTF
PRINTF:
功能
ret相当于 取栈顶入栈位置 跳转入栈位置 释放栈
Mov bx,sp
Jmp word ptr ss: [bx]
;释放栈
Add sp ,2
c调用约定
Mov ax,3 最后一个参数先入栈
Push ax
Mov ax,2
Push ax
Call Add
Add: ;ax返回值
Push bp
Mov bp ,sp
Mov ax,[bp+4]
Add ax,[bp+6]
Pop bp
Retn
栈寄存器bp的作用算局部变量的位置 00 00 00
函数标准写法
1. 保存环境 push bp
2. 保存栈底 mov bp,sp
3. 申请局部变量空间 sub sp , 4 抬栈大小就是变量的大小
4. 保存寄存器环境 push ax 可以有可以无
5. 恢复寄存器环境 pop ax
6. 释放局部变量空间 add sp +4
7. 恢复环境 pop bp
8. 返回 retn
00 00 00 00 00 00 00 00 00 00
变量1 变量2 栈底 bp 程序位置 ip(段内) 参数1 参数2
00 00 00 00 00 00 00 00 00 00 00 00
变量1 变量2 栈底 bp 程序位置 ip(段间) 参数1 参数2
中断指令INT 中断需要 iret表示中断返回
中断表不能传参,所以只能寄存器传参
Int 10 bios 检测硬件
Int 21 系统
INT i8
中断调用指令:产生i8号中断
IRET
中断返回指令:实现中断返回
INTO
溢出中断指令:
若溢出标志OF=1,产生4号中断
否则顺序执行
Int 建了一个表 通过下标寻址来调用函数指针来实现对应的功能,如果找不到系统直接崩溃
Debug调试器调试 在程序中加int3中断 汇编代码 cc 随时定位
在g直接到你想停的位置,快速定位 e int 3的位置 改代码 90 可以做到快速定位
Not 什么都不干 汇编代码 90
可以对齐 解决花指令
用于任意设置进位标志
CLC 复位进位标志:CF←0
STC 置位进位标志:CF←1
CMC 求反进位标志:CF←~CF
串操作指令中,需要使用
CLD 复位方向标志:DF←0
STD 置位方向标志:DF←1
在编写中断服务程序时,需要控制可屏蔽中断的允许和禁止
CLI 复位中断标志:IF←0
STI 置位中断标志:IF←1
LOCK 封锁总线 用于线程同步 ;原子操作
只能锁一条指令 执行指令后自动解锁
HLT 进入暂停状态 not 消耗指令 hlt什么都不干
交权指令 ESC 浮点协处理器8087指令是与8086的整数指令组合在一起的,当8086发现是一条浮点指令时,就利用ESC指令将浮点指令交给8087执行