Assembly 使用替代寄存器的Z80汇编
我试图为z80程序集编写冒泡排序,我发现我需要使用替代寄存器。但是推荐的语法(B′)不起作用,并且会产生错误。如何使用这些寄存器?没有直接使用阴影寄存器的说明。Assembly 使用替代寄存器的Z80汇编,assembly,z80,Assembly,Z80,我试图为z80程序集编写冒泡排序,我发现我需要使用替代寄存器。但是推荐的语法(B′)不起作用,并且会产生错误。如何使用这些寄存器?没有直接使用阴影寄存器的说明。 取而代之的是,存在一种将普通寄存器与影子寄存器交换的方法 把自己交给黑暗面 如果您计划在中断句柄1之外使用阴影寄存器,您还必须在使用阴影寄存器期间使用阴影寄存器 例如: di ;disable interrupts exx ;exchange registers BC,DE,HL with BC',
取而代之的是,存在一种将普通寄存器与影子寄存器交换的方法 把自己交给黑暗面
如果您计划在中断句柄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 …没有。还有一个。
如果堆栈没有为您剪切它,那么您必须使用将值存储在内存中
直接寻址内存的好处是不必丢弃值;缺点是它的运行速度比堆栈慢一点呃,已经40年了,考虑一下这样的问题吧。它们不能直接寻址。例如,您必须使用EXX指令来强制交换。主要用于快速IRQ服务代码,而不是一般用途编程。如果寄存器用完,则必须将值存储到内存中。堆栈是最好的地方。谢谢,但这是我的大学项目,我不得不处理像这样的旧东西。(这是我写的为数不多的几篇文章之一,它碰巧使用了Z80作为示例)顺便说一句,你的冒泡排序的寄存器有点可疑,也许你可以使用内存来处理一些很少使用的值(比如循环之间的初始化),但我想内部交换程序应该适合Z80上的寄存器,它们太多了。啊,已经40年了,考虑一下这样的问题。它们不能直接寻址。例如,您必须使用EXX指令来强制交换。主要用于快速IRQ服务代码,而不是一般用途编程。如果寄存器用完,则必须将值存储到内存中。堆栈是最好的地方。谢谢,但这是我的大学项目,我不得不处理像这样的旧东西。(这是我写的为数不多的几篇文章之一,它碰巧使用了Z80作为示例)顺便说一句,您的冒泡排序寄存器有点可疑,也许您可以使用内存来处理一些很少使用的值(如循环之间的初始化),但我想内部交换程序应该适合Z80上的寄存器,它们太多了。只有当中断处理程序使用阴影寄存器时,才必须禁用中断。例如,在ZX Spectrum上,ROM中的默认IM 1处理程序不使用阴影寄存器,您可以在不使用
DI
的情况下自由使用它们。当然,要做任何更复杂的事情,您通常会以自己的IM2处理程序结束,这样您就可以完全控制中断使用的寄存器。另外,如果您正在与VSYNC同步,并且每个帧都运行一些持续时间稳定的代码,那么您可以知道在哪些部分不可能获得正常的IRQ(因此只有手动请求才会使其崩溃)。DI被高估了关于内存存储。。。对于Z80,我们有时也会使用自修改代码:ld(next_load+1),bc
next_load:ld bc,12345
,因此您不需要额外的内存(代码已经为值保留了内存),并且为bc/de
寄存器加载值的速度要快2倍。但出于源代码可读性的原因,强烈反对使用这种技术,不推荐它,只提及它在Z80上可以正常工作(在现代CPU上绝对不行,在最好的情况下会导致巨大的性能损失,在某些体系结构上,如果写得太晚,它甚至无法正常工作)