Assembly 使用替代寄存器的Z80汇编

Assembly 使用替代寄存器的Z80汇编,assembly,z80,Assembly,Z80,我试图为z80程序集编写冒泡排序,我发现我需要使用替代寄存器。但是推荐的语法(B′)不起作用,并且会产生错误。如何使用这些寄存器?没有直接使用阴影寄存器的说明。 取而代之的是,存在一种将普通寄存器与影子寄存器交换的方法 把自己交给黑暗面 如果您计划在中断句柄1之外使用阴影寄存器,您还必须在使用阴影寄存器期间使用阴影寄存器 例如: di ;disable interrupts exx ;exchange registers BC,DE,HL with BC',

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

没有直接使用阴影寄存器的说明。
取而代之的是,存在一种将普通寄存器与影子寄存器交换的方法

把自己交给黑暗面
如果您计划在中断句柄1之外使用阴影寄存器,您还必须在使用阴影寄存器期间使用阴影寄存器

例如:

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) 仅当系统在中断处理程序中使用shadow regs时适用

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

还有一个用于AF:AF'的阴影寄存器。
您可以这样访问:

ex af,af'    ;exchange af with its shadow register.
请注意,即使
ex
本身并不影响标志,
ex af,af'
也会将标志寄存器与其阴影交换

有关更多信息,请参阅:

请注意,作为一种算法,它很糟糕,应该被禁止。
请改为执行

使用堆栈
如果您进行了长时间的处理,那么就不能使用阴影寄存器,而必须使用堆栈,而使用and

…没有。还有一个。
如果堆栈没有为您剪切它,那么您必须使用将值存储在内存中


直接寻址内存的好处是不必丢弃值;缺点是它的运行速度比堆栈慢一点

没有直接使用阴影寄存器的说明。
取而代之的是,存在一种将普通寄存器与影子寄存器交换的方法

把自己交给黑暗面
如果您计划在中断句柄1之外使用阴影寄存器,您还必须在使用阴影寄存器期间使用阴影寄存器

例如:

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) 仅当系统在中断处理程序中使用shadow regs时适用

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

还有一个用于AF:AF'的阴影寄存器。
您可以这样访问:

ex af,af'    ;exchange af with its shadow register.
请注意,即使
ex
本身并不影响标志,
ex af,af'
也会将标志寄存器与其阴影交换

有关更多信息,请参阅:

请注意,作为一种算法,它很糟糕,应该被禁止。
请改为执行

使用堆栈Luke
如果您进行了长时间的处理,那么就不能使用阴影寄存器,而必须使用堆栈,而使用and

…没有。还有一个。
如果堆栈没有为您剪切它,那么您必须使用将值存储在内存中


直接寻址内存的好处是不必丢弃值;缺点是它的运行速度比堆栈慢一点DI的情况下自由使用它们。当然,要做任何更复杂的事情,您通常会以自己的IM2处理程序结束,这样您就可以完全控制中断使用的寄存器。另外,如果您正在与VSYNC同步,并且每个帧都运行一些持续时间稳定的代码,那么您可以知道在哪些部分不可能获得正常的IRQ(因此只有手动请求才会使其崩溃)。DI被高估了关于内存存储。。。对于Z80,我们有时也会使用自修改代码:
ld(next_load+1),bc
next_load:ld bc,12345
,因此您不需要额外的内存(代码已经为值保留了内存),并且为
bc/de
寄存器加载值的速度要快2倍。但出于源代码可读性的原因,强烈反对使用这种技术,不推荐它,只提及它在Z80上可以正常工作(在现代CPU上绝对不行,在最好的情况下会导致巨大的性能损失,在某些体系结构上,如果写得太晚,它甚至无法正常工作)