汇编语言子程序是如何定义的?

汇编语言子程序是如何定义的?,第1张

这样扮蚂定义的:

子程序名 PROC     NEAR|FAR

             .

              .

            RET

子程序名 ENDP

子程序名相当于标号,表示本过拆则程的符号地址。过程有NEAR和FAR两种类型,FAR型的过程可供段间调用,NEAR型过程仅供段内调用。

在一个过程中,至少要有一条返回指令RET,它可以书写在过程中的任何位置,但是过程执行的的最后一条指令一定是RET。

扩展资料:

注意事项

一、子程序调用指令

格式:CALL   [NEAR PTR]    子程序名

CALL指令的两个作用,1.将断点地址(CALL指令的下一条指令地址)压栈保存,2.转去子程序执行。

[NEAR PTR]可以省略。

二、返回指令

格式:RET     [N]

指令旅缺棚作用:实现子程序执行完后返回主程序的指令。从堆栈栈顶d出一个字数据(段内调用)送入IP作为返回地址。N是立即数,执行完RET之后,再将SP增加N,也叫“平栈”。

通过C语言函数形式封装汇编语言程序段,而后就可完全按照C语言函数的形式调用。这种方法保证了子程序稿轿段与主程序衔接的完全适配,使用简便。历返使用方法如下:

用低划线_后接关键字asm指示后面的语句是汇编语句。汇编语句既可以是单句,例如__asm mov bx,1;也可以是复合语句,即,用花括号对包含的多条单句,例如:

__asm

{ mov al, 3

mov dx, 0xE008

add ax,dx

}

在语键烂肆法规则中,这些语句与C语言的语句完全等价。因此,可以直接进行编译。

简单点说,call指令在跳转前保存当前指令地址,而jmp一类的指令不保存当前指令的地址。

详细点说:

call指令在跳转前会在栈中保存当前的程序计数器(IP)的值(有必要的话还要保存CS),保存完IP的值后,再去执行跳转指令。即相当于:

push CS (没有这种指令,有没有这一句还要看调用的类型:far/near)

push IP (没有这种指令)

jmp [word ptr/dword ptr] ...

这样,程序在执行ret/retf指令时就能从栈中取出IP的值,即相当于:

pop IP(没有这种指令)

pop CS(没有这种指令,有没有这一句也要看调用的类型)

来继续执行call指令后的其他指令,当然你也可以选择不执行ret,而把call当做jmp来用。这样也没有问题(没人这么干),只不过栈里多了点东西罢了,记得处理就好。

而形如jmp一类的指令只是简单的执行跳转(修改IP的值知粗),并不保存IP的值。当然跳转后程序也就不知道原来是从哪里跳转到这里来的,自然就无法返回。

当然皮猛腊,这个时候ret指令还是可以用的,因为ret指令只是简单的从栈顶取出一个word然后赋给IP,所以也可以用ret指令来实现jmp的功能(也没人这么干)。如:

mov bx,offset s

push bx

ret

这样就相当于:

jmp s

所以说不要只是记一个指令怎么用,而是要理解一个指令到底是什么原燃滑理。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12564781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存