반응형

이번에는 시퀀스 카운터에 대해 알아볼께요


SEQUENCE COUNTER SEGMENT에 들어갑니다.


그럼 다음과 같은 화면이 나올거에요

인풋값은 하나인데 아웃풋은 2개인데다가 인풋값보다 짧군요.

지문을 읽어보도록 하죠

SEQUENCES ARE ZERO-TERMINATED

READ A SEQUENCE FROM IN

WRITE THE SUM TO OUT.S

WRITE THE LENGTH TO OUT.L

해석해보자면

0을 기준으로 하나의 출력값을 만듭니다.

IN값을 받아서

OUT.S에는 더한 값을 출력하고 

OUT.L에는 더한 갯수를 출력하세요.

군요


이제 이 로직을 어떻게 만들까에 대해서 생각해보도록 하죠.

우선 0이 들어오기 전까지의 갯수를 카운트 하는 모듈이 하나 필요하고 

그다음은 0이 들어오기전까지 값을 더하는 모듈이 하나 필요 할듯하네요.

그리고 0이 여러번 들어왔을때의 처리방법도 생각해둬야 겠네요.


그런 끝에 만들어진 로직이 다음과 같습니다.

뛰어넘는 구간이 많고 조잡해보이지만 이 로직을 참고로만 보신다면 더 줄일 수 있으실겁니다.

물론 무조건 줄인다고 좋다는건 아니지만 말이죠


잡설은 그만하고 코드분석을 하도록 하죠.

첫라인의 값들은 인풋으로 들어온 값을 좌,우,아래로 보내주는 역활을 하고있습니다.

매우 심플합니다.

그 다음 라인을 보죠

첫번째 모듈부터 보도록 하겠습니다.


입력값을 받아서 ACC에 저장합니다.

0인지 비교하여 0이면 ZERO: 로 넘어가고 아니면 아래 로직을 실행합니다.

SWP  BAK과 ACC값을 바꿉니다.

오른쪽에서 들어오는 값을 저장합니다.

END로 이동합니다.

0일 경우 이후 로직이 수행됩니다.

BAK과 ACC 값을 바꿉니다.

ACC의 값을 아래로 보낸 후 0으로 초기화합니다.

이후 END: 로직으로 BAK값을 ACC로 돌려둡니다.


첫번째 모듈은 0값을 기준으로 입력값을 누적하는 모듈입니다.


두번째 모듈을 보죠

위에서 보내온 값을 받습니다.

0인지 확인 합니다.

0일 경우 ZERO: 로 이동합니다.

그렇지 않을경우 ACC의 값을 왼쪽으로 이동합니다.

그 후 1을 오른쪽으로 이동합니다.







두번째 모듈은 ACC의 값을 가지고있다가 0이 필요할때 보내주고 갯수를 증가해주는 부분입니다.

여기서는 따로 처리하는 부분이 크지않습니다.

입력값을 보내던가 갯수를 추가하기위한 값을 보내는 정도라서 다시 잘 수정한다면 이 로직은 없어도 될거같은 부분이네요.

일단 지금까지는 합을 구하는 부분까지만 나왔으니 다음 모듈이 갯수를 구하는 모듈이라는 것을 짐작하실수 있을겁니다.


그럼 세번째 모듈을 보도록 하죠

위에서 값을 받아 ACC에 저장합니다.

0인지 확인하여 0이면 ZERO로 이동합니다.

아닐경우 BAK 값과 ACC값을 바꿉니다.

그리고 왼쪽에서 오는 값을 더합니다.

END로 이동합니다.

0일 경우 다음로직을 수행합니다.

BAK값과 ACC값을 바꿉니다.

ACC값을 아래로 보냅니다.

ACC값을 0으로 초기화합니다.

BAK값과 ACC값을 바꿉니다.


첫번째 모듈과 비교를 해보면 달라진 부분이업습니다.

네 똑같아요

단지 왼쪽으로 받느냐 오른쪽으로 받느냐의 차이뿐입니다.

마지막 세번째 라인은 해당값을 OUT으로 보내는 것 뿐이네요.


이상으로 SEQUENCE COUNTER를 마치도록 하겠습니다.


반응형

+ Recent posts