16 비트 레지스터 기반 가상 컴퓨터가 있는데 실제 x86 컴퓨터 코드로 컴파일하는 단계는 무엇입니까? 컴파일 된 코드를 다른 실행 파일/DLL과 링크 할 수 있어야하는 경우가 아니면 을 JIT 컴파일러로 만들지 않습니다.VM 고유 코드를 x86 컴퓨터 코드로 컴파일하는 방법은 무엇입니까?
VM은 프로젝트에 VM을 추가하면 특수 언어 구문을 추가 할 수 있도록 만들어졌습니다. (예를 들어 게임 엔진에 임베드 된 경우 엔티티 개체 유형이 추가 될 수 있고 엔진의 여러 C 함수가 노출 될 수 있습니다.) 그러면 코드가 노출 된 특정 C 함수에 완전히 종속되거나 노출 된 C++ 클래스를 임베디드 된 응용 프로그램에서 사용할 수 있습니다.
스크립트 코드가 VM 바이트 코드에서 기본 EXE로 컴파일되는 경우 이러한 종류의 "연결"이 가능합니까?
또한 Lua의 VM과 마찬가지로 모든 기본 변수가 거대한 C 배열 인 "레지스터"에 저장되므로 레지스터 기반입니다. 레지스터 포인터는 범위가 변경 될 때 증가 또는 감소하므로 레지스터 번호는 상대적이며 스택 포인터와 유사합니다. 예컨대 :
int a = 5;
{
int a = 1;
}
수 있습니다, 가상 머신 의사 어셈블리 :
mov_int (%r0, $5)
; new scope, the "register pointer" is then incremented by the number
; of bytes that are used to store local variables in this new scope. E.g. int = 4 bytes
; say $rp is the "register pointer"
add (%rp, $4) ; since size of int is usually 4 bytes
; this is if registers are 1 bytes in size, if they were
; 4 bytes in size it would just be adding $1
mov_int (%r0, $1) ; now each register "index" is offset by 4,
; this is now technically setting %r4
; different instructions are used to get values above current scope
sub (%rp, $4) ; end of scope so reset %rp
이 부분에 대한 내 질문은 내가 이런 종류의 스택 포인터를 사용하는 것입니까? 기본 포인터? 이 개념을 대체하기 위해 무엇을 사용할 수 있습니까?
Q & A 사이트에 대한 귀하의 질문은 너무 광범위합니다. 책이나 대학 과정이 필요합니다. – EJP
나는 그것을 훨씬 덜 넓고 분명하게 만들었고, 그래서 그것은 2 개의 간단한 질문으로 귀결된다. – Accumulator
나는 여기에 실질적인 대답할만한 질문이 있다고 생각하지만, 당신이 묻고있는 것을 정확히 이해하기 란 거의 어렵지 않습니다. 나는 너를 돕고 싶다.하지만 질문을 조금이라도 더 바꾸려고하면 ... 너를 도울 수있게 도와 준다.) – Cauterite