Assembly x86汇编:如何将代码移动到视频内存并执行代码?

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

我正在编写一个简单的程序来改变旧的x86 16位PC的内存库配置

目前,当我从主存执行代码时,它挂起。这似乎是因为代码本身在主内存中。执行代码时,由于内存配置发生更改,代码本身被销毁

因此,我想将代码从主内存移动到视频内存,并希望从视频内存执行它

请给我以下代码的建议,以便将代码从主存移到视频内存并执行。执行以下代码仍然会导致系统挂起

.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(如果是)。