Assembly x86汇编:如何将代码移动到视频内存并执行代码?
我正在编写一个简单的程序来改变旧的x86 16位PC的内存库配置 目前,当我从主存执行代码时,它挂起。这似乎是因为代码本身在主内存中。执行代码时,由于内存配置发生更改,代码本身被销毁 因此,我想将代码从主内存移动到视频内存,并希望从视频内存执行它 请给我以下代码的建议,以便将代码从主存移到视频内存并执行。执行以下代码仍然会导致系统挂起Assembly x86汇编:如何将代码移动到视频内存并执行代码?,assembly,memory,x86-16,vga,vram,Assembly,Memory,X86 16,Vga,Vram,我正在编写一个简单的程序来改变旧的x86 16位PC的内存库配置 目前,当我从主存执行代码时,它挂起。这似乎是因为代码本身在主内存中。执行代码时,由于内存配置发生更改,代码本身被销毁 因此,我想将代码从主内存移动到视频内存,并希望从视频内存执行它 请给我以下代码的建议,以便将代码从主存移到视频内存并执行。执行以下代码仍然会导致系统挂起 .MODEL SMALL .STACK 100H .DATA MSG DB ' Bank Configuration is Successfully Chan
.MODEL SMALL
.STACK 100H
.DATA
MSG DB ' Bank Configuration is Successfully Changed',0DH,0AH,'$'
.CODE
MAIN PROC
MOV CX,OFFSET T_HERE - OFFSET F_HERE
MOV SI,OFFSET F_HERE
MOV DI,0B800H
REP MOVSB
JMP T_HERE
F_HERE:
MOV AX,@DATA
MOV AX,0B800H
MOV DS,AX
MOV DX,03872H
MOV AX,0DH
OUT DX,AX
MOV AH9
LEA DX,MSG
INT 21H
MOV AH,4CH
INT 21H
T_HERE:
MAIN ENDP
END MAIN
JMP T_HERE
@PeterCordes:NASM不生成DOS.EXE程序,但可以生成DOS.COM。如果尝试使用除MASM/TASM以外的其他工具,那么查看FASM可能是更好的选择,因为它支持DOS EXE和COM。如果您不能依赖RAM(因为固件以唯一正确的方式设置内存控制器后,您恶意破坏了内存控制器的配置);然后你不能依赖RAM中的堆栈,不能依赖RAM中的DOS函数,不能依赖RAM中的IVT或IRQ处理程序,等等。你自己的代码在RAM中只是冰山一角(即使CPU太旧了,你也不必担心缓存、推测性执行等)。这就是为什么在开机时(在任何东西使用RAM之前),只通过固件中的代码更改内存控制器配置的原因。如果您使用的是类似的东西,那么更改存储组大小将不可避免地改变内存对CPU的显示方式。BIOS和视频(0cxxxxh)段被定向到ROM,因此使用视频ram是唯一的方法。之后您必须重新初始化整个内存,包括重新隐藏BIOS(如果是)。JMP T_HERE
@PeterCordes:您可能希望看到:@PeterCordes:NASM不生成DOS.EXE程序,但它可以生成.COM。如果尝试使用除MASM/TASM以外的其他工具,那么查看FASM可能是更好的选择,因为它支持DOS EXE和COM。如果您不能依赖RAM(因为固件以唯一正确的方式设置内存控制器后,您恶意破坏了内存控制器的配置);然后你不能依赖RAM中的堆栈,不能依赖RAM中的DOS函数,不能依赖RAM中的IVT或IRQ处理程序,等等。你自己的代码在RAM中只是冰山一角(即使CPU太旧了,你也不必担心缓存、推测性执行等)。这就是为什么在开机时(在任何东西使用RAM之前),只通过固件中的代码更改内存控制器配置的原因。如果您使用的是类似的东西,那么更改存储组大小将不可避免地改变内存对CPU的显示方式。BIOS和视频(0cxxxxh)段被定向到ROM,因此使用视频ram是唯一的方法。之后,您必须重新初始化整个内存,包括重新隐藏BIOS(如果是)。