2012-04-05 3 views
7

DCPU specification에 따르면 SET 명령어가 실패하는 유일한 시간은 a 값이 리터럴 인 경우입니다.[PC]에 쓸 수 있습니까?

다음과 같이 작동합니까?

SET [PC],0x1000 

더 유용한 버전은 그래서 오히려 이상한 무한 루프가 될 것이라고이 PC의 오프셋 설정 될 것이다 : 아마

SET [PC+0x2],0x89C3 ; = SUB PC,0x2 
+0

"DCPU 사양"이란 무엇입니까? 가지고 계신 경우 링크를 제공해주십시오. –

+1

@AaronDigulla, http : ///x10c.com/doc/dcpu-16.txt – Matt

+1

+1 가상의 컴퓨팅을 좋아하는 방법 : –

답변

7

(= 나는 그것이 작동해야하지만 난 노력하지 않았다고 생각) .

이것은 "자체 수정"코드라고하며 제한된 RAM 및 b) 제한된 코드 크기로 인해 8 비트 시대에 널리 사용되었습니다. 이와 같은 코드는 매우 강력하지만 오류가 발생하기 쉽습니다. 코드 기반이 커지면 이는 곧 유지 보수의 악몽이 될 수 있습니다.

유명한 유스 케이스 :

  1. 윈도우 95는 스택에서 코드를 렌더링 그래픽을 구축하기 위해 다음과 같은 코드를 사용했다.
  2. 바이러스 및 트로이 목마는 C64
  3. 시뮬레이션 스위치 문 (A JMP을 simluate에 복귀 주소를 스택에 쓰기 코드 또는 조작) 공격 벡터로 사용
+0

유일한 차이점은 나는'PC' 값이 스택/램과 완전히 다른 메모리 공간에 있기 때문에 DCPU를 사용하여 스택에서 코드를 실행할 수 없다는 것을 볼 수있다. 그래서'SET PC, ###'는 점프 할 수 없다. 스택 – Matt

+0

@Mat - DCPU를 사용하여 스택에서 코드를 실행할 수 있습니다. DCPU 사양의 맨 아래를 살펴보십시오. 해당 코드의 메모리 덤프입니다. – flumpb

+0

@kisplit, 스택에 코드를 넣을 수는 있지만 어떻게 할 수 있습니까? 그 덤프는 실행 가능한 코드 일뿐입니다. – Matt

4

[PC]에 대한 값이 없습니다, 그래서 당신은 포인터를 (레지스트리 또는 메모리)로 사용할 수있는 PC에 저장하여 둥근 방식으로해야한다고 생각합니다.

 
     SET A , PC 
     SET [A+3], 0x8dc3 ; SUB PC, 3 (if A can't be changed from outside SUB PC,2 works too.) 
+0

코드 섹션은 램/스택과 동일한 숫자를 사용하므로이 코드는 작동하지 않습니다.그 문장 다음의'A'는 숫자로 평가 될 것이고,'[A + 3]'는 코드 섹션보다는 메모리 내의 그 위치를 참조 할 것입니다. – Matt

+1

@Mat - 별도의 섹션이 없습니다. DCPU로 자체 수정 코드를 작성할 수 있습니다. – flumpb