2012-04-13 4 views
2

현재 DCPU-16 어셈블러를 사용 중입니다 (http://0x10c.com/doc/dcpu-16.txthttp://jazzychad.net/dcpu.html 참조).DCPU-16 명령어의 이진 표현에 선행 1이있는 이유

어셈블러 명령어가 16 진수/2 진수로 변환되는 방식에 대해 이해할 수없는 한 가지 점이 있습니다.

일례로서

, DCPU-16 2 (또는 16 진수 0x0002 바이너리 0b000010)

명령 포맷 십진수, 레지스터 B의 값을 설정하도록되어

SET B, 0x0002 

같은 지시를 받아

bbbbbbaaaaaaoooo 

따라서, 하단의 연산 코드는 4 비트, 제 1 값은 6 비트, 제 2 값은 6 비트이다.

SET == 0x1 == 0b0001 
    B == 0x01 == 0b000001 
     0x0002 == 0b000010 

을 DCPU-16

입니다 대한

0b0000100000010001 == 0x811 

되는 전체 명령하지만 올바른 값으로 끝나는 :

손으로 명령을 변환

, 이것은 내가 어떻게 할 것입니다
0b1000100000010001 == 0x8811 

즉 1을 더하는 이유는 무엇입니까?

저는 어셈블러와 다른 종류의 하드 코어 저수준 기계 명령어에 완전히 익숙합니다. 그래서 이것이 매우 어리석은 질문이라면 저에게 꼭 알려주십시오.

답변

5

따라서, 0x00-0x1f 리터럴은 명령어 값 0x20-0x3f 의해 지정된

 
Values: (6 bits) 
    0x00-0x07: register (A, B, C, X, Y, Z, I or J, in that order) 
    ... 
    0x20-0x3f: literal value 0x00-0x1f (literal) 

- 즉, (6 중)의 최상위 비트가 설정된다. 따라서 리터럴 0x02의 명령어 값은 0x22입니다.

명령어 값 0x02은 C 레지스터를 참조하므로 어셈블 된 명령어가 0b0000100000010001 == 0x811이어야한다고 생각하는 내용은 실제로 명령어 SET B, C이됩니다.

+0

아, 물론 알겠습니다. CPU는 레지스터 또는 값의 의미를 구분할 방법이 없습니다. 고마워요! –

+0

내가 완전히 grok 경우 보자 -이 오프셋을 사용하여, 나는 명령의 bbbbbb 비트 블록에 리터럴 10 진수 값을 쓸 수 있습니다 -하지만, 말하자면 10 진수 40을 레지스터 a에 넣고 싶습니다. 즉, SET B, 0x0028'이면'bbbbbbaaaaaaoooo' 명령은'SET'을위한 oooo ='00001','B'를위한 aaaaaa ='000001', '다음 단어 (리터럴)'을위한 bbbbbb ='011111', 다음 단어에 '0000000000101000' (= 40)? –

+1

@ManuelKiessling : 오른쪽에 대해 들립니다. –

0

링크 된 텍스트 설명은 명령어가 실행 가능한 코드로 어셈블되는 방법에 대해서는 언급하지 않지만 링크 한 에뮬레이터 페이지의 자바 스크립트에서 리버스 엔지니어링 할 수 있습니다. 바이너리 명령을 생성하는 "팩"이라는 내부 기능이있는 것 같습니다. 팩 기능은 다음을 수행합니다 :

words[0] += value << (4 + operand * 6); 

이것은 구문 분석 된 입력에 대해 반복적으로 호출됩니다. 어셈블리 문서에 대해 공급 업체/발명가에게 묻는 것이 좋습니다. 사양에 따르면