关于伪操作和伪指令
时间:2010-12-22 来源:soqsoq
在使用MASM过程中,我们经常接触到伪操作和伪指令这样两个概念。那么他们之间有什么区别吗?
简单来说,这两个概念虽然都是汇编程序的组成部分,但是,他们所操作的对象是不一样的。对于,伪操作,其操作对象是汇编编译器,而伪指令,其最终的操作对象是指令,也就是说,其对应的是用于CPU执行的指令。这就是他们之间简单但很微妙的区别。
所谓指令(instruction),针对汇编程序而言,就是将CPU直接识别的指令——二进制指令通过查表的方式转换为asmmebly指令而方便程序人员来编制程序,二进制指令就是我们所常说的机器指令。这个转换过程是编译器的工作,不用程序员来干涉。
我们可以通过以上的过程描述发现,通过以上从二进制到汇编指令的转换过程发现,这方便了程序人员进行程序的编制。但是,用汇编程序代码和高级语言的代码进行比较,汇编程序还是很复杂。比如说,一个简单比较过程,需要使用CMP、JMP、JNZ、JZ等一系列的指令来实现,不仅复杂而且容易出错,很大的影响了效率。正是因为这个方面的原因,MASM就出现了.if.endif.elseif等伪指令,这些伪指令为我们在汇编程序中使用和高级语言十分接近的的控制方式来进行比较、循环等结构控制。至于,这些伪指令到真正的指令之间的转换工作,交给汇编器来完成就好了。总结起来,伪指令最终面对的是CPU指令的指令。
而伪操作呢?伪操作是用来控制汇编器是如何来产生汇编指令的。还是if,我们在VC中常常可以看到#if DEBUG #endif这样的结构。这个结构是用来DEBUG用的,因为在调试过程中,我们经常需要查看代码是否能按我们的意图来进行工作,于是,使用这个结构来输出一些中间信息来方便我们进行判断。而在最后交付程序是,这些输出信息代码是不需要的。当程序中包含的输出信息不多的时候,这样的结构可能是不需要的,我们可以通过简单查找后将其删除就可以了,但是,在大型的应用程序中,这样的查找删除工作不仅效率很低而且容易出错。于是,人们自然想到了,通过一个控制开关,在开发调试工程中,让编译器产生中间信息输出的代码,而在交付程序时,调整控制开关不让其产生这些代码,不就可以很完美的解决这个问题吗?
对,这就是伪操作的目的。对应带汇编语言程序中就是使用if伪操作(注意没有前面的点号)。
归纳一下,伪指令是通过对一系列的指令进行包装,而使编译器最终产生符合我们要求(通过伪指令的形式反映我们的要求)的指令而提高产生代码的效率。而伪操作是通过类似指令的形式,告知编译器如何控制代码的产生和不产生。
简单来说,这两个概念虽然都是汇编程序的组成部分,但是,他们所操作的对象是不一样的。对于,伪操作,其操作对象是汇编编译器,而伪指令,其最终的操作对象是指令,也就是说,其对应的是用于CPU执行的指令。这就是他们之间简单但很微妙的区别。
所谓指令(instruction),针对汇编程序而言,就是将CPU直接识别的指令——二进制指令通过查表的方式转换为asmmebly指令而方便程序人员来编制程序,二进制指令就是我们所常说的机器指令。这个转换过程是编译器的工作,不用程序员来干涉。
我们可以通过以上的过程描述发现,通过以上从二进制到汇编指令的转换过程发现,这方便了程序人员进行程序的编制。但是,用汇编程序代码和高级语言的代码进行比较,汇编程序还是很复杂。比如说,一个简单比较过程,需要使用CMP、JMP、JNZ、JZ等一系列的指令来实现,不仅复杂而且容易出错,很大的影响了效率。正是因为这个方面的原因,MASM就出现了.if.endif.elseif等伪指令,这些伪指令为我们在汇编程序中使用和高级语言十分接近的的控制方式来进行比较、循环等结构控制。至于,这些伪指令到真正的指令之间的转换工作,交给汇编器来完成就好了。总结起来,伪指令最终面对的是CPU指令的指令。
而伪操作呢?伪操作是用来控制汇编器是如何来产生汇编指令的。还是if,我们在VC中常常可以看到#if DEBUG #endif这样的结构。这个结构是用来DEBUG用的,因为在调试过程中,我们经常需要查看代码是否能按我们的意图来进行工作,于是,使用这个结构来输出一些中间信息来方便我们进行判断。而在最后交付程序是,这些输出信息代码是不需要的。当程序中包含的输出信息不多的时候,这样的结构可能是不需要的,我们可以通过简单查找后将其删除就可以了,但是,在大型的应用程序中,这样的查找删除工作不仅效率很低而且容易出错。于是,人们自然想到了,通过一个控制开关,在开发调试工程中,让编译器产生中间信息输出的代码,而在交付程序时,调整控制开关不让其产生这些代码,不就可以很完美的解决这个问题吗?
对,这就是伪操作的目的。对应带汇编语言程序中就是使用if伪操作(注意没有前面的点号)。
归纳一下,伪指令是通过对一系列的指令进行包装,而使编译器最终产生符合我们要求(通过伪指令的形式反映我们的要求)的指令而提高产生代码的效率。而伪操作是通过类似指令的形式,告知编译器如何控制代码的产生和不产生。
相关阅读 更多 +