2007년 03월 31일
인스트럭션을 추가 했는데 프로그램과 테스트의 복잡도가 낮아지다
Erlang으로 짬짬이 구현 중인 AVR 어셈블러
인스트럭션을 추가하면서 아래와 같이 오퍼랜드 변환을 인스트럭션 마다 하나 하나 구현해주었습니다. 당연히 테스트도 각 인스트럭션 마다 추가하였지요. 인스트럭션을 계속 추가하다보니 오퍼랜드 변환에 중복이 보였습니다.
그래서 아래와 같이 오퍼랜드 변환 함수를 빼내고 인스트럭션 정보에는 그 함수에 대한 레퍼런스를 넣었습니다. 코드 가독성이 높아졌습니다. add 인스트럭션은 크기가 1 Word이고 오퍼랜드는 Rd5, Rr5를 받는다. 또 각 인스트럭션을 모두 테스트할 필요도 없어졌습니다. operand_XXX만 테스트를 하면 되지요.
오퍼랜드 변환 함수의 적적한 이름을 찾지 못해 그냥 오퍼랜드 이름과 크기로 이름을 짖고 있습니다. 아직 개념 정립이 안되었기 때문이죠. 오퍼랜드의 형식으로 무리를 지을 수 있을 겁니다. 그럼 적절한 이름이 떠오르겠지요.
인스트럭션을 추가하면서 아래와 같이 오퍼랜드 변환을 인스트럭션 마다 하나 하나 구현해주었습니다. 당연히 테스트도 각 인스트럭션 마다 추가하였지요. 인스트럭션을 계속 추가하다보니 오퍼랜드 변환에 중복이 보였습니다.
instruction(Name) ->
case Name of
adc ->
{1, fun(Labels, A, {Rd5, Rr5}) -> {register_addr(Rd5), register_addr(Rr5)} end};
add ->
{1, fun(Labels, A, {Rd5, Rr5}) -> {register_addr(Rd5), register_addr(Rr5)} end};
그래서 아래와 같이 오퍼랜드 변환 함수를 빼내고 인스트럭션 정보에는 그 함수에 대한 레퍼런스를 넣었습니다. 코드 가독성이 높아졌습니다. add 인스트럭션은 크기가 1 Word이고 오퍼랜드는 Rd5, Rr5를 받는다. 또 각 인스트럭션을 모두 테스트할 필요도 없어졌습니다. operand_XXX만 테스트를 하면 되지요.
operand_rd5rr5(Labels, A, {Rd5, Rr5}) ->
{register_addr(Rd5), register_addr(Rr5)}.
instruction(Name) ->
case Name of
adc ->
{1, fun operand_rd5rr5/3};
add ->
{1, fun operand_rd5rr5/3};
오퍼랜드 변환 함수의 적적한 이름을 찾지 못해 그냥 오퍼랜드 이름과 크기로 이름을 짖고 있습니다. 아직 개념 정립이 안되었기 때문이죠. 오퍼랜드의 형식으로 무리를 지을 수 있을 겁니다. 그럼 적절한 이름이 떠오르겠지요.
# by | 2007/03/31 11:26 | Erlang | 트랙백 | 덧글(0)







☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]