函数调用使用call指令,同时需要存入返回地址;当函数返回的时候需要使用ret指令族,使用ret还是retf根据call指令是近调用(只改变IP寄存器的值)还是原调用(同时改变CS和IP寄存器的值)来判断,ret使得sp指针+2,将2字节内容放入到IP寄存器中;retf使得sp指针+4,将4字节内容分别放入CS和IP寄存器中。
call指令先从右到左压入实参,在压入返回地址,然后备份ebp,将esp赋值给ebp,因此ebp可以用来栈中寻址,然后根据函数的信息在栈中开辟相应的空间。
退出的时候需要将ebp重新复制给esp来跳过局部变量的空间,然后pop ebp,再ret返回即可
call调用:相对代表增量,直接代表立即数,间接代表寄存器/内存
1.相对近调用,call 偏移量
2.间接绝对近调用,call 寄存器地址/内存寻址(2字节)
3.直接绝对原调用,call far 段基址(立即数):段内偏移地址(立即数)
4.间接绝对远调用,call far 内存寻址(4字节)
jmp调用不返回
1.相对短转移 操作数为-128~127
2.相对近转移 操作数为-32768~32767
3.间接绝对近转移
4.直接绝对远转移 jmp立即数形式的段基址:立即数形式的段内偏移地址
5.间接绝对远转移