我们正在研究一个Proteus模拟,该模拟实际上具有8x(2KB)外部存储器(6116),但到目前为止我们仍无法访问外部存储器。该课题说,外部存储器地址应从0x14000开始,我们设计了适当的解码器逻辑。并尝试了以下三种方式访问该地址:
目标:从0x14000开始将值从内部寄存器移至外部存储器
1-一起使用ORG和MOV指令
2-一起使用ORG $ PUSH-POP指令
3-不使用ORG指令+将1400移至DS(DataSegmentRegister)
但他们都不行
任何帮助将不胜感激
https://drive.google.com/open?id=1Eznyj0pQfS2ccj5eIesYnnle01v2ftId
答案 0 :(得分:1)
ORG仅告诉编译器期望代码(和静态数据)在内存中的位置。 (因此mov ax, OFFSET my_label
可以汇编到正确的数字地址)。这不是您所需要的,除非您正在此高地址加载代码,并在其附近带有标签的数据
相反,您可以将DS(和/或ES)设置为数字值,并使用相对于此的偏移量来寻址内存。
mov ax, 0x1400
mov ds, ax
mov byte ptr [0], cl
它将一个字节(从CL)存储到1400:000
,该字节在实模式下是线性地址0x14000
。
如果这不能满足您的要求,那么您还遇到了(虚拟)硬件问题,而不是软件问题。也许在https://electronics.stackexchange.com/
上询问该部分答案 1 :(得分:0)
一种可能的解决方案是两次(仅)写入第一次内存访问。
这可能与Proteus中的错误有关,这确实很奇怪
如您所见, 00h 存储器访问指令重复了两次,但对于 01h 指令之类的指令,通常无需重复执行
工作片段如下所示...
MOV AX,DATA_HERE
MOV DS, AX
MOV AX,1400H
MOV DS , AX
MOV CL,07H
MOV BX,00h
MOV [BX],CL
MOV CL,09H
MOV BX,00h
MOV [BX],CL
MOV CL,08h
MOV BX,01h
MOV [BX],CL