8051模拟器汇编入门(5)子程序

有时,编写代码来完成特定任务可能会变得冗余。在汇编语言中,尤其如此,因为指令的数量有限,大多数任务都涉及用它们做非常相似的事情。子程序是一组旨在执行程序中频繁使用的操作的指令。从某种意义上说,这就像在C或Java这样的语言中编写函数,但层次稍微低一些—特别是我们必须自己做更多的切换工作。

假设你想要将所有寄存器设置为零。有八个寄存器,所以写出来需要八条指令。如果你想在多个地方这样做,每次都写出八条指令就会变得很痛苦。相反,我们可以使用子程序,只写一次。为此,我们使用CALL(实际上是ACALL或LCALL)和RET指令。例如,

继续阅读

8051模拟器汇编入门(4)寄存器组和堆栈

8051架构提供了两种保存值以便以后使用的好方法:寄存器组(register bank)和堆栈(stack)。

通用寄存器实际上存在于RAM中。RAM的前32个字节被使用。默认情况下,使用的是前8个字节。然而,这可以更改为第二个8个字节、第三个8个字节或第四个8个字节。使用哪组由PSW寄存器的RS1和RS0位确定。这些位可以使用SETB和CLR指令更改。SETB“设置”一个位(为1),CLR“清除”一个位(将其设置为0)。例如,

继续阅读

8051模拟器汇编入门(3)标签和跳转

由于程序计数器(PC)寄存器用于确定下一条指令的位置,它不能像其他寄存器那样被访问——即不能使用MOV指令。相反,PC有自己特殊的一组指令。我们称这些为“跳转”,因为它们实际上对应于从一条指令跳转到另一条指令。其中最基本的是JMP指令。

图片

模拟器中的程序计数器PC

继续阅读

8051模拟器汇编入门(2)算术与逻辑

由于算术逻辑单元(ALU),8051能够执行各种算术和逻辑运算。大多数操作都使用一个特殊的寄存器,称为累加器(accumulator),通常表示为ACC或A。例如,可以使用ADD指令将两个数字相加。

MOV A, #2
ADD A, #3

第一个操作数是累加器A,第二个操作数是立即值3。请注意,要将两个数字相加,A必须已经包含要相加的第一个数字。这可以通过使用MOV指令将立即值2移动到A来完成。加法的结果存储在A中,这意味着A的原始值不会被保留。ADD指令还会影响程序状态字(PSW)的进位位CY和辅助进位位AC。

继续阅读