2011-05-16 3 views
9

6502 프로세서를 사용하여 어셈블리에서 while 루프를 작성하려고하는데 16 진 코드 작성 방법을 알 수 없습니다. 루프가 시작되고 끝나는 위치에 대한 레이블이있는 곳에 속기를 사용하여 작성된 예제를 본 적이 있지만 실제 16 진 코드는 표시되지 않습니다. I가 유용한 것으로보고어셈블리의 while 루프 작성

두 코드는 :

  1. 는 X의 등록 번호로 메모리에 바이트를 비교 (약칭 : CPX, 헥스 : EC). 이 동일한 경우
  2. 제로로 Z 플래그를 설정
  3. 지점 X 바이트 경우 Z 플래그 = 0 (약칭 : BNE, 진수 : D0)를 시작하는
+5

왜 어셈블러 대신 16 진수 코드를 사용 하시겠습니까? –

+0

@jnhyf "16 진 코드"? 어떤 IDE, 어셈블러 또는 컴파일러를 사용하고 있습니까? 이미 6502 어셈블리에 대한 경험이 있습니까? – bzlm

+2

어셈블러를 사용하지 않고 6502 프로그램을 작성한다고 말하지 않기를 바랍니다. 개발 시스템에 무엇을 사용하고 있습니까? 사과 ][ ? 또는 무엇을? –

답변

6

가 여기 장소 : http://www.obelisk.demon.co.uk/6502/. 이 페이지에는 PC에서 실행할 수있는 크로스 어셈블러가 있습니다. 그 당신을위한 좋은 개발 플랫폼이 될 수 있습니다.

아무것도하기 전에 포함하는 소프트웨어 개발 프로세스를 이해하기 위해 6502 그럼 당신은의 작업의 이론을 이해해야한다 :

을 -는 "소스 파일을"준비를하므로, 라는 상징적 지시의 당신 전화 "속기"
- 6502 이해 기계 명령어로 해당 소스 파일을 변환, 어셈블러를 사용하여
- 6502
에 번역을로드-

귀하의 예제 프로그램은 SRC에서 DSTLEN 메모리 바이트를 복사하려고 번역 기계 명령어
을 실행하기 위해 6502 을 말하고.

이 같은 포맷 :

 LDX #0 ; Start with the first byte 
_LOOP LDA SRC,X ; load a byte from SRC into the A register 
     STA DST,X ; store that byte into DST 
     INX  ; bump the index register to point to the next SRC and DST locations 
     CPX #LEN ; have we moved LEN characters? 
     BNE _LOOP ; if not, go move the next one 

를 (예를 들어, END 같은) 더 문 라인을 추가 한 후, SRC, DSTLEN을 정의한 후에는 cploop.txt과 같은 파일에 전체 내용을 저장합니다.

그런 다음 어셈블러에 번역하도록 지시합니다. 어셈블러는 여러분이 말하는 16 진수 바이트로 표현 될 수있는 바이너리 6502 기계 코드 파일을 제공합니다.

컴퓨터 코드 파일을 시뮬레이션 된 6502에 제공합니다. 그러면 컴퓨터 코드가 구현 한 작업을 실행하도록 6502에 알립니다.

+0

덕분에, 그 도움이하지만 난 아직도 그 웹 사이트에서이 예제 같은 방법에 불분명입니다 : " \t LDX # 0 \t \t, 첫 번째 바이트로 시작 _LOOP \t LDA SRC, X \t는, \t STA를 이동 우리는 한계 \t BNE _LOOP " 이 진수로 표현 될 수에 도달 할 때까지 ..., DST, X \t INX \t \t는, 다음 인덱스 ... \t CPX #LEN \t 범프. _loop 라벨은 그곳에있는 축약어에서 중요하지만 실제 기계 코드에서 그와 같은 것을 가지는 방법을 알지 못합니다. 죄송합니다. 코드 서식을 지정하는 방법을 모르겠습니다. – jnhyf

+0

@jnhyf "*이 코드를 6502 기계 코드로 작성하는 방법"과 "어떻게 그 코드를 16 진법으로 변환 할 수 있습니까?"라는 문제를 해결할 필요가 있습니다. 그것이 그대로 당신을 도울 어렵습니다. – bzlm

+0

@jnhyf - 두 단계가 있습니다 : (1) 어셈블리 언어로 프로그램을 작성하고, "속기"(btw)라는 용어를 사용하십시오. (2) 어셈블리 언어 파일을 어셈블러에 제공하면 원하는 16 진 코드가 만들어집니다. –

1

while 문은 정말 의미

  1. 시험 조건
  2. 조건이 거짓 인 경우,
  3. 1로 돌아가 뭔가 (간단한 JMP 또는 분기를) 할 5
  4. 로 이동
  5. 나머지 프로그램

6502, 당신이 많은 가정을 할 수 없다면 이것의 어느 것도 극히 간단하지 않을 것입니다. 테스트중인 조건이 항상 레지스터가 될 경우 비교 명령어 (cmp, cpx, cpy)와 분기 명령어는 분명히 필요한 것입니다.

메모리에 저장되는 단일 바이트가 될 경우 , 그 바이트를로드 한 다음 비교해야합니다.

2 바이트로 저장된 16 비트 값인 경우 각 바이트 값을로드하고 테스트해야합니다.

플로트를 다루고 있습니까? 부동 소수점 패키지 (예 : Commodore 64 ROM BASIC 부동 소수점 루틴)를 작성했거나 사용할 수있는 경우이를 사용해야합니다.

고급 언어에 데이터 유형이있는 이유를 알 수 있습니다.

실제로 처리하는 데이터 유형에 따라 다르지만 65024에서 while을 구현하면 위의 내용을 따라야합니다.

비교할 데이터가 항상 X로 표시되고 목적지가 항상 + 127/-128 바이트 (Bxx 명령어의 범위 제한)라는 것을 알고 있으면 질문에서 식별하는 특정 케이스는 OK입니다.

2

분기 명령어는 1 바이트 서명 된 상대 주소 피연산자를 사용하며, 이는 분기 타겟을 생성 할 다음 명령어의 주소에 추가됩니다.
$D0 $00 : 무 조작 : 분기 명령어는 항상 2 바이트를 차지하기 때문에, 대상 주소는 분기 명령어의 주소 플러스 (로그인 확장) 피연산자 마이너스 2

예입니다 분기 다음에 간다 명령
$D0 $FE : Z=0 인 경우 무한 루프를 생성하여 지점 자체를 다시 가리 킵니다.

+0

심하게 말로 된 질문을 해독하고 답변하기위한 Upvote. ; -) –

3

다음은 어셈블리 ("속기"라고하는 것)와 기계 코드 간의 통신을 보여주는 예제입니다. 먼저, 알고리즘에 대한 어셈블리 코드가 있습니다. 일부 매개 변수는 추상화되어 있습니다.

* = 4000   ; This is the address where our program will be stored 

     LDX #len 
loop LDA src,X 
     STA dest,X 
     DEX  
     BNE loop 

물론 컴퓨터 코드로 변환 할 수는 없습니다. 또한 len, srcdest의 값을 입력해야합니다

src = $1234 
dest = $5678 
len = 10 

loop 이름에 대해 이해하는 것은 것은 단지 같은 src이 값 $1234을 할당한다는 것입니다, loop는 명령어의 주소를 할당됩니다 그 후에.따라서이 경우에는 LDX #len이 2 바이트를 차지하므로 (은 $4000 + 2 = $4002으로 설정 됨) 이것은 어셈블러에 의해 자동으로 수행되지만 물론 종이로이 모든 작업을 수행 할 수도 있습니다.

위 어셈블리 프로그램의 6502 기계 코드는 무엇입니까?

A2 0A 
BD 34 12 
9D 78 56 
CA 
D0 F7 

어떻게 알 수 있습니까? 글쎄, 난 그냥 http://www.masswerk.at/6502/assembler.html에 온라인 6502 어셈블러에 위의 프로그램을 붙여 넣었습니다. LOOP의 실제 값도 BNE LOOPBNE 명령어 자체에 비해 단지 상대적 주소에 대한 기계 코드를 계산하는 데 사용되지 않습니다 방법

4000  LDX #LEN  A2 0A 
4002 LOOP LDA SRC,X  BD 34 12 
4005  STA DEST,X  9D 78 56 
4008  DEX    CA 
4009  BNE LOOP  D0 F7 
400B 

참고 : 그것은 심지어 당신에게 조립 및 기계 코드의 상세한지도를 보여줍니다 F7은 -9이고, $400B$4002 사이의 차이는 -9입니다.

이렇게하면 모든 것을 기계어로 변환 한 다음 점프하면 다음 명령의 시작 주소와 점프 대상 주소의 차이를 계산합니다. 역방향 점프는 음수이고 앞으로 점프는 긍정적이어야합니다.

+0

최적의 루프를위한 Upvote. ; -) –