2012-04-07 91 views
2

我在业余时间学习汇编语言,成为一名更好的开发人员。我已经从亚马逊购买了一本书,很快就会发布,并且我正在尝试在深入研究之前熟悉基本概念。汇编和寄存器

我对用于通用任务的通用寄存器感到困惑。我知道C编程语言,并且已经阅读了关于调用约定的汇编和Windows API。

但是,如果您有一个非常简单的任务,例如将两个数字加在一起,并且没有引用C等,那么你会使用哪个寄存器?

我意识到这是一个基本问题。

+1

为什么不写一个简单的程序,并看看反汇编代码开始? – Michael 2012-04-07 15:59:48

+0

@Michael,查看C编译代码的最佳方法是什么?我知道在.NET中你可以使用ILASM/ILDASM,而且我知道如何在Java中完成它。我不知道如何在C. – w0051977 2012-04-07 17:07:52

+0

@ w0051977中做到这一点,许多C编译器都可以选择输出汇编源代码而不是二进制库或可执行文件。检查你的编译器的文档。 – 2012-04-07 18:38:46

回答

3

无论你想要什么,真的。

在第一代8086处理器中,一些通用寄存器(AX,BX,CX,DX)也具有半特殊用途。例如,LOOP操作码假定你的循环计数器在CX中; DIV操作码将结果存储在AX和DX中。一些寻址模式可以使用BX或SI或DI作为偏移量,但不能将其他通用寄存器用作偏移量。

在成功的处理器世代中,其中一些特殊用途已经淡化 - 例如,我认为现在大多数操作码可以使用任何寄存器作为偏移量,而不仅仅是BX。所以大多数情况下,通用寄存器是可以互换的。

如果你想遵循历史先例,(E)AX是“累加器”,所以它将是传统的地方,例如,正在对一系列数字进行求和时的运行总数。因此,如果您正在进行添加,并且您不确定将结果放入哪个注册表中,(E)AX将是一个很好的默认选择。