현재 사용자 정의 asm과 같은 프로그래밍 언어 용 컴파일러를 작성하고 있으며 데이터 레이블에 적절한 PC 상대 주소 지정을 수행하는 방법에 대해 혼란스러워합니다.어셈블리와 유사한 언어 컴파일러에서 PC 상대 주소 지정
main LDA RA hello
IPT #32
HLT
hello .STR "Hello, world!"
위의 의사 코드는 컴파일 후, 다음의 진수 결과 :
31 80 F0 20 F0 0C 48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 21 00
3180
, F020
및 F00C
는 LDA
, IPT
및 HLT
지침입니다.
코드에서 볼 수 있듯이 LDA
명령어는 hello
레이블을 인수로 사용합니다. 컴파일 할 때 02
이라는 값이됩니다. 이는 "Incremented PC + 0x02"를 의미합니다 (코드를 보면 LDA
호출과 관련하여 "Hello, world!"행의 위치입니다.) 문제는 다음과 같습니다. .STR
은 명령어가 아니며 컴파일러에게 실행 파일 끝에 (0 종료 된) 문자열을 추가해야한다는 것을 알려주기 때문에 hello
라벨 선언 다음에 다른 명령어가 있었으므로 그 오프셋은 잘못되었습니다.
하지만 올바른 방법으로 오프셋을 계산할 수있는 방법을 찾지 못했습니다. 컴파일러가 시간을 거슬러 올라갈 수있는 것 외에는 두 번 컴파일해야합니까? 처음에는 데이터 레이블, 실제 지침 ?
'hello'의 선언에 대한 오프셋은'.STR' 변수 다음에 오는 명령어에 의해 변경되지 않습니다. – kdopen