Z80如何在内存中的不同位置加载不同的程序块?

时间:2012-08-15 23:24:05

标签: assembly z80

我的问题

构建下面的代码我得到: “319920C30020C30A20FBED563E00C600CA0520F33E55D3073E00FBC9”

我的问题是我假设这将用零填充,这样每个代码块都在程序存储器中的请求地址0000H,0038H和2000H。

我可以立即看到手动执行填充的工作,但Z80处理器如何加载上述程序,是否在正确的地址?

代码

STACK .EQU 2099H
.ORG 0000H
    ld  SP, STACK
    jp 2000H

.ORG 0038H
    jp  service_routine

.ORG 2000H
    EI
    IM 1 
    LD  A, 00H

LOOP:
    ADD A, 00H
    jp  z, LOOP

service_routine:
    DI
    ld  A, 55H
    out (07H),A
    ld  A, 00H
    EI
    ret

2 个答案:

答案 0 :(得分:1)

ORG指令只是告诉汇编器你认为PC在代码中的那个点。然后,汇编器可以使用它来计算相对跳转的正确代码。它不会指示汇编程序或加载程序实际加载该地址的代码。

答案 1 :(得分:0)

将磁盘映像转换为正在运行的程序的过程可能非常复杂。在过去,一块1k的零被认为是对磁盘空间的严重浪费,但今天在不同的规模上也是如此 - 你可能会嘲笑1K零但是没人会怀疑文件中的1G零是一个浪费。

根据机器架构,该过程可能涉及的不仅仅是重新定位代码块和数据块。例如,可能必须修补代码中的跳转地址 请参阅外部模块的正确地址。