assembly 如何编写干净高效的英特尔8085 ASM程序?[关闭]

wlzqhblo  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(108)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

12小时前关闭。
Improve this question
我正在用8085汇编语言编写一个程序,以证明使用任意两个值的Demorgan定律,我不得不在堆栈中使用许多push-pop操作以及许多寄存器操作。将整个程序作为主函数编写会导致代码变得非常混乱,难以沿着。
我怎样才能有效地使用子程序和堆栈操作,使我的程序更有组织,功能更简单?任何提示和指导都将有很大的帮助。

u3r8eeie

u3r8eeie1#

在高层次上,你会把你的main函数转换成与高级语言或伪代码相同的函数。函数是一个抽象单元,参数传递是函数抽象的一个关键。然而,有时我们创建一个函数,要么只使用一次,要么不接受任何参数(弱抽象),只是为了让主代码不那么混乱。
至于汇编语言:你需要一个电话会议,至少作为指导。
在汇编中,我们可以为每个例程定制调用约定(尽管需要考虑函数指针,这是您可能不会使用的功能)。
调用约定将说明传递参数的寄存器和/或堆栈,以及如何接收返回值。一个约定是传递堆栈上的所有参数,但其他一些则传递寄存器中的(一些)参数,我认为这通常是首选。当在堆栈上传递参数时,您会遇到谁(调用方或被调用方)释放它们(将它们弹出堆栈)的问题。
在某些机器上,参数在全局变量(内存)中传递,而不是在堆栈中传递。我认为这通常是低效的(并且还使得函数不可重入,不能递归)。
另一种方法是非常古老的“内联”参数传递方法,其中常量或指针的参数块被放置在调用指令之后,并且被调用者从调用者的代码中拾取它们,并在参数块之后返回。这对于原始的FORTRAN来说是很好的,因为参数总是通过引用传递的。
调用约定还将说明是否存在任何调用保留寄存器。在一台寄存器如此有限的机器上,这是一把双刃剑,因为如果你使用一些寄存器作为调用保留,那么你就不能使用它们来传递参数,但是调用者将能够在调用过程中在寄存器中保留一些值。想要使用调用保留寄存器的调用者将假设寄存器已经被调用链中更高的某个函数使用,因此将在函数序言中推送寄存器并在尾声中弹出以恢复该寄存器,以便调用保留寄存器可以临时重新用于该函数。
同样,在汇编中,我们可以定制每个例程的调用约定,知道该例程的实现和调用者的实现,你应该能够建立一个相当有效的参数传递方法。然后建议每个例程,记录两个参数(即在寄存器中)、返回值以及哪些寄存器与它们被保存下来。(在某些时候,您可能会发现一个通用约定比为每个例程定制更有用。)

相关问题