목록취미/TIS-100 공략 (12)
안 쓰던 블로그
Solve SEQUENCE COUNTER without using the SWP instruction 그냥 풀면 이렇게 풀린다 https://foxtrotin.tistory.com/200 원래는 BAK에 값을 저장하다가 0이 오면 출력하는 방법으로 풀었는데 BAK을 쓰지 않는다면 ACC만 쓰면 된다 ACC만 쓰려면 0이 올 때까지 수를 그냥 ACC에 계속 누적하다가, 0이 오면 출력하는 방법으로 하면 되긴 할텐데 그러면 ACC에 새로운 값이 들어오면 누적값이 없어지는 거 아니야? 할 수도 있음 의외로 되게 간단한 방법이 있는데 0이 오면 터무니 없는 음수 값을 ACC에 더하고, 0이하라면 0이 왔다고 판단하고 출력하면 된다 물론 입력값에 음수가 없다는 위험한 전제가 있어야 하지만. 어쨌든 여기서는 음수가..
0이 들어올 때까지 들어온 값의 합을 저장하다가 0이 들어오면 합을 S에, 값의 길이를 L에 출력한다 한 노드 당 한 개씩 있는 ACC와 BAK을 활용해야 한다 ACC는 새로운 값이 오면 무조건 덮어씌워지므로 1. 값을 받는 노드 2. 합을 저장하는 노드 3. 길이를 저장하는 노드 이렇게 다 따로 해줘야 한다 맨 처음에 입력을 받아서 ACC값에 넣고 왼쪽, 아래, 오른쪽으로 보낸다 그냥 MOV LEFT, RIGHT, DOWN 으로 하면 다음 값을 받아서 넘어가니까 꼭 ACC에 저장한 뒤 그 값을 넘겨야 한다 내 코드에서는 값을 받아오는 노드 기준으로 오른쪽 3개가 길이 저장 왼쪽 3개가 더할 값 저장 아래 2개가 합을 저장하는 작업을 수행한다 합을 저장하는 작업을 하는 노드를 자세히 보면, UP에서 오는..
Solve SIGNAL AMPLIFIER in fewer than 100 cycles 원래 단순하게 풀면 160사이클씩 나오는 신호증폭기 문제를 100사이클 이하로 풀어야 하는 도전과제다 근데 이미 코드가 값을 받는다->두배->옮긴다 가 전부라 아니 여기서 뭘 더 줄여? 라고 생각할 수도 있는데 '병렬처리' 개념만 알면 쉽게 풀린다 1. 값을 ACC에 저장한다 2. 자기 자신을 더한다(두 배) 3. ACC값을 넘긴다 이 3사이클을 동시에 2개의 노드에서 실행한다 그러면 2개의 노드는 각자 다른 숫자를 두 배 하는 작업을 한다 예를 들어 첫 번째 수인 66을 오른쪽 노드가 두 배 작업을 하고 있을 때 아래 노드는 이미 그 다음 수인 34를 두 배 작업을 하고 있는 것 한 번에 두 개씩 처리하니 사이클이 약..
Solve SELF-TEST DIAGNOSTIC in over 100,000 cycles 맨 첫번째 문제를 100000사이클 이상을 돌려서 풀면 된다 (그냥 풀면 80정도 나옴) 루프문을 돌려서 100000번 수행하도록 만든다 어셈에서 루프는 goto문으로 작성한다 ACC에 999저장하고 LOOP1: 을 해놓고 SUB1을 한다. 그러면 한 번 돌 때마다 ACC값을 -1한다 JNZ는 ACC값이 0이 아니면 LOOP1으로 돌아간다 즉, ACC값이 0이 될 때까지 계속 그 안을 돈다 그 짓을 999번 하고 300번 더 한다 이 코드를 한 1시간 넘게 돌리면 세 번의 사이클+랜덤 숫자까지 다 사이클 101482번이 나온다 사실 딱 맞추게 돌리려면 283번인가를 돌리면 되는데 그냥 넉넉하게 해봤다 아무튼 기다리다..
IN.A와 IN.B에서 값을 받는다 OUT.P에 IN.A-IN.B 값을 쓴다 OUT.N에 IN.B-IN.A 값을 쓴다 두 값을 따로 저장하는 방법도 있지만 쉬운 난이도에서 그렇게까지 할 일이 없다 아웃값을 보면 P와 N은 부호만 다른 값이라는 걸 확인할 수 있다 처음에 A값을 ACC에 저장, B값을 바로 빼버린다 그러면 ACC에는 A-B가 있다. 이 값을 바로 P에 보내면 P는 되고, 이 값을 NEG로 부호를 반전해서 N에 보내면 N도 완료된다