Input Output Device에는 각각의 Register가 들어있다. 이 register에 접근하여 원하는 정보를 얻어올 수 있다. Configuration Register ( Initiate 를 담당 ), Data Register, Status Register ( IO Device의 상태를 기억 ) UART : Universal Asynchronous Receiver and Transmitter 비동기방식 -> Clock이 필요없다, Full-duplex(전이중) 방식 통신 -> 동시에 송 수신이 가능하다. Asynchronous이기 때문에 Agreement가 필요하다 ( Protocol ) : 언제 보낼지, 어떤 형식으로 보낼지, 얼마나 빠르게 보낼지 Transmitter의 Data Format..
희소행렬을 표현할 때 Structure를 이용해 현재 행렬에 들어있는 값들만을 row, column 순으로 오름차순으로 정렬해 Array로 표현하는 방법이 있다. 이렇게 나타낸 행렬을 덧셈 곱셈등의 연산에도 활용할 수 있는데, 전치행렬을 구하는 연산도 적용할 수 있다. 다양한 전치행렬을 만드는 알고리즘 중, Fast Transpose가 단번에 잘 이해가 되지 않아서 정리해보았다. ( matrix array는 (row, column ,value) structure를 순서대로 담아놓은 Array임 ) 이해가 잘 안된 부분은 StartingPosition이였다. 한 번 이해하고 나니 크게 어렵지 않게 코드를 작성할 수 있었다. 다른 (느린) 전치과정과 달리 Fast Transpose는 옮겨담는 matrix a..
처리장치 등에서 입출력장치의 데이터에 접근하기 위해서 사용하는 방법. 입출력장치 내에 있는 레지스터를 특정 메모리 공간에 할당하여, 사용할 때 마다 그 공간을 참조하여 값을 이용할 수 있다. 할당받는 메모리 공간의 크기는 레지스터의 개수에 따라 달라진다. 메모리 주소가 32bit ( 4 byte )이고, 메모리 맵이 같은 크기의 4개의 구역으로 나누어져 있다고 생각해보면, 맨 앞 2개의 bit는 00, 01, 10, 11로 어느 구역으로 갈 지 결정하는 역할을 수행하게 된다. 이 두 bit을 처리하는 회로가 Address Decoder 이고, decoder에 의해 해당 메모리의 chip select가 활성화 (1) 가 되며 해당 구역에서 남은 30개의 bit으로 구성된 주소로 원하는 데이터를 찾아갈 수 ..
Tab 복사가 안돼서 삐뚤빼뚤 ㅜㅜ Execute unit in ARM Move instruction - MOV mov r0, r0, LSL#1 r0에 저장된 값을 logic shift left로 1칸 옮겨서 r0에 저장하라 mov pc, r14 r14에 저장된 값을 pc 레지스터에 저장하라 example r0 = 0x80000004 movs r0, r0, LSL#1 r0 = 0x00000008, CPSR = nzCv movs r0, r0, LSL#1 r0 = 0x00000010, CPSR = nzcv 대부분의 instruction은 (lsl#같은) Barrel shifter를 사용할 수 있다! instruction 뒤에 붙는 s는 명령어 수행 후 CPSR 플래그를 update하라는 의미 2bit 이상 ..
반복문을 이용하기 위해서는 Lable을 쓰면 간단하게 해결되는것 같다. Branch Instruction이 흐름을 제어하는 문장인데, 여기서 BL ( Branch Link ) 를 이용해서, 문장이 실행된 뒤, 조건에 맞으면 문장을 다시 실행시키는 방법으로 ( while문과 같은 원리 ) 해결해보았다. 일단 문제 해결을 위해서는 비교하는 명령어집합을 7번 실행하면 되니까, 레지스터 하나에 0을 넣고 한 번 실행할 때 마다 1씩 더해줘서 6이 되면 탈출하게 하면 된다. 값을 0으로 초기화하는 가장 단순하고 경제적인 방법은 XOR을 이용하는 방법이다. 같은 값을 XOR연산 시키면 무조건 0이 나오니깐.이전에 작성한 코드들을 loop : 를 통해 레이블링 해줬다. C의 goto같은 느낌인 거 같다. 막 쓰면 안..
첫 번째로, Input_data에서 연속한 주소를 둘 가져와 레지스터에 저장하는 코드를 작성하면 첫 주소를 R1에 불러오고, 그 값에 4 Byte를 더한 값을 R2에 저장. 이렇게 작성할 수 있겠다. ldr r0, =Input_data add r1, r0, #4 그 다음, R0이 가진 주소가 가리키는 Memory에 저장된 값을 R2, R1의 값을 R3에 저장한다.ldr r2, [r0]ldr r3, [r1] 이 코드를 실행하면 다음과 같은 레지스터 상태가 된다. 밑작업은 다 해줬다. 이제, 값을 비교하고 조건에 따라 Swap하는 방법에 대한 Instruction들을 입력해주면 한 번의 Loop를 작성하게 된다. 값 비교는 CMP 라는 Instruction을 이용한다. CMP는 비교대상인 레지스터에 저장된 ..
이번에는 ARM instruction들을 지원하는 ZedBoard위에서 값들을 정렬하는 방법을 공부해보려 한다.일단 컴퓨터구조나 다른 기본적인 과목들을 수강하지 않은 상태에서 어셈블리어를 시도하려하니 굉장히 고난도라는 생각이 계속 들고있다.명령어를 충분히 이해하지 못했거나, 또는 언어의 문법 자체가 굉장히 낯설기때문에부적절하거나 최적화가 굉장히 의심되는 코드가 많이 등장할 예정이지만뭐, 처음하는 사람의 애교 정도로 봐줬으면 좋겠다 ^^ 확실히 맥북을 1년정도 쓰다가 부트캠프로 윈도우를 설치해 돌리니, 화질저하나 여러 불편한 점들을 많이 느끼고 있다...포스팅하는데도 픽셀 자꾸 깨지고.. 캡쳐한 화면도 화질구지... ㅜㅜ 문제상황은 다음과 같다. Input_data로 8개의 정수의 나열을 4묶음이 있다. ..