使用替代寄存器的 Z80 汇编
Z80 assembly using alternative registers
我尝试为 z80 程序集编写冒泡排序,我发现我需要使用替代寄存器。但推荐的语法 (B') 不起作用并引发错误。我如何使用这些寄存器?
没有直接使用影子寄存器的说明。
取而代之的是 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。
使用堆栈卢克
如果你确实进行了冗长的处理,那么你就不能使用影子寄存器,而必须使用堆栈而不是使用 push
and pop
.
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.
直接寻址内存的好处是您不必丢弃值;缺点是运行起来比stack慢一点。
我尝试为 z80 程序集编写冒泡排序,我发现我需要使用替代寄存器。但推荐的语法 (B') 不起作用并引发错误。我如何使用这些寄存器?
没有直接使用影子寄存器的说明。
取而代之的是 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。
使用堆栈卢克
如果你确实进行了冗长的处理,那么你就不能使用影子寄存器,而必须使用堆栈而不是使用 push
and pop
.
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.
直接寻址内存的好处是您不必丢弃值;缺点是运行起来比stack慢一点。