Z80汇编使用备用寄存器

时间:2017-03-05 11:01:10

标签: assembly z80

我试着为z80程序集编写冒泡排序,我发现我需要使用替代寄存器。但推荐的语法(B')不起作用并引发错误。我该如何使用这些寄存器?

1 个答案:

答案 0 :(得分:4)

没有指示直接使用影子寄存器。
相反,有一个instruction EXX可以将正常寄存器与影子寄存器进行交换。

让自己陷入黑暗面
如果计划在中断处理程序 1 之外使用影子寄存器,则在使用影子寄存器期间还必须disable interrupts

示例:

di           ;disable interrupts
exx          ;exchange registers BC,DE,HL with BC',DE',and HL'
ld b,8       ;do stuff with the shadow registers
....
exx          ;put the normal registers in charge
ei           ;re-enable interrupts

1 仅当您的系统在中断处理程序中使用影子注册时才适用。

警告
禁用中断时不要进行冗长的计算,否则系统将无法对中断处理程序处理的外部输入作出反应。

AF还有一个影子寄存器:AF' 您可以这样访问:

ex af,af'    ;exchange af with its shadow register.

请注意,即使ex不影响标志本身,ex af,af'也会将标志寄存器与其阴影进行交换。

有关详细信息,请参阅:http://z80-heaven.wikidot.com/instructions-set

请注意bubble sort作为一种算法很糟糕,它应该被禁止 请改为实施insertion sort

使用堆栈Luke
如果您确实进行了冗长的处理,那么您就不能使用影子寄存器,而必须使用pushpop来使用堆栈。

ld b,8              ;normal processing
push bc              ;save bc for later
ld b,9              ;extended processing
... do stuff with bc
pop bc               ;throw away the extended bc and restore the old bc.

...没有。还有另一个。
如果堆栈没有为您剪切,则必须使用ld将值存储在内存中。

ld b,8               ;do stuff with bc
ld (1000),bc         ;store bc for later
ld b,9               ;do other stuff
.....
ld (1002),bc         ;store the extended bc
ld bc,(1000)         ;restore the saved bc
....                 ;continue processing.

直接解决内存的好处是你不必抛弃值;缺点是它运行速度比堆栈慢一点。