BackEnd25 OPCODE + ADDRESS : 16진수 4자리를 이용한 기계어 표현법 1 RXY 증권 시세 표시기 주소가 XY인 메모리 셀에 있는 비트 패턴으로 레지스터 R을 로드합니다. 예: 14A3은 주소 A3에 있는 메모리 셀의 내용을 다음과 같이 만듭니다. 레지스터 4에 배치됩니다. 2 RXY RXY 비트 패턴 XY로 레지스터 R을 로드합니다. 예: 20A3은 값 A3이 레지스터 0에 배치되도록 합니다. 3 RXY레지스터 R에 있는 비트 패턴을 주소가 XY인 메모리 셀에 저장합니다. 예: 35B1은4 0RS 레지스터 R에 있는 비트 패턴을 레지스터 S로 이동합니다. 예: 40A4는 레지스터 A의 내용이 레지스터 4에 복사되도록 합니다. 5 RST 레지스터 S와 T의 비트 패턴을 2의 보수 표현인 것처럼 추가하고 결과를 레지스터 R에 남겨 둡니다. 예: 5726은 레지.. 2024. 3. 28. 1.2.8 어셈블리어로 태스크의 병렬처리 태스크의 병렬처리 시의 문제점 태스크가 서로 독립적일 때는 병렬처리가 쉽지만 서로 협력하는 태스크들은 병렬처리가 어렵다 왜냐하면 한 태스크를 처리하고나서 다른 태스크를 처리하고자 하면 이때 쓰이는 자원을 이전 태스크가 수정해서 제대로 쓸 수 없는 경우가 있다 해결책 : lock, unlock 이때 쓰이는 해결책을 '동기화'라고 부른다. 그중 하나인 lock, unlock 방식을 살펴 보겠다 lock : 한 태스크가 자원을 상요하는 동안 다른 태스크가 접근 못하도록 하는것 unlock : 접근 제한 조치를 해제하는 것 lock은 0이면 사용 가능하고 1이면 사용할 수 없음을 표시한다 실행 예 : 1. 프로세서는 레지스터에 있는 값 1과 메모리에 있는 lock의 0을 바꾸게 된다. 2. 하지만 이 연산을 이.. 2022. 3. 8. 1.2.7 기계어의 어셈블리어로 번역 RISC-V어셈블리어와 기계어의 관계 표 번역 과정 1단계 : 16진수의 2진수로의 변환 (기계어를 2진수로 쓰면 너무 길어지기 때문에 4비트를 한 글자만으로 표현할 수 있는 16진수를 쓴다) 예 : 00578833 = 0000 0000 0101 0111 1000 0011 0011 2단계 : 이진수를 해석하는 방식을 맨 오른쪽 7비트 (=opcode)로 결정 예 : 011 0011 = R-type 3단계 : 결정한 해석 방식에 맞게 해석 예 : (아래 사진) (참고용 : 아래는 모든 해석 방식) 2022. 3. 4. 1.2.6 어셈블리어로 긴 수치와 주소를 쓰는 법 32비트 크기의 상수를 만드는 법 RISC-V는 한 명령어당 최대 32비트까지만 쓸 수 있게 설계 되어있고 그 중 상수를 표현하는 파트인 immediate는 12비트까지만 쓸 수 있다 이것을 극복해서 32비트 꽉 채워서 상수를 만드는 방법은 두 이진수 문장을 합치는 것이다. 아래가 예시다. 목표 x19에 00000000000000000000000000000000 00000000001111010000010100000000 넣기 1단계 lui는 상수를 기존 11 ~ 0비트가 아니라 레지스터의 31~12비트에 넣는 함수이다 그리고, 넣을 0000 0000 0011 1101 0000은 십진수 976과 같아서 lui x19, 976를 쓴다. 따라서 현재 x19 = 000000000000000000000000000.. 2022. 3. 2. 1.2.5 어셈블리어로 문자와 문자열 사용해보기 문자 구현의 원리 컴퓨터가 레지스터로 문자를 표현하는 방식은 언어처럼 특정 십진수와 특정 문자가 같다고 약속으로 정해두고 그렇게 인식하도록 CPU를 설계하는 것이다. 그것에 대한 규약이 ASCII(American Standard Code for Information Inter-change) 문자열 구현의 원리 문자 데이터 모아서 문자열을 만드는데, 컴퓨터가 어디까지가 문자로 처리할 지를 결정하도록 하기 위해 문자열의 길이에 대한 정보도 같이 써야한다. 이때 쓰는 방식은 다음 3가지로 나뉜다. 1. 문자열의 맨 앞에 길이를 표시 (JAVA) 2. 구조체처럼 같이 사용되는 변수가 그 길이를 표현 하도록 하기 3. 마지막에 문자열의 끝을 표시하는 특수문자를 두기 (C) 어셈블리어로 문자열 복사 프로시저 구현 .. 2022. 2. 27. Clean Code : 추상화 추상화 코드 블럭 내의 코드들을 추상화를 해야한다 왜냐하면 세부적인 건 변동할 확률이 높아서 추상적으로 먼저 안정적이게 틀을 잡아야한다. 그리고 프로그래머가 세부적인 것보단 핵심에 좀더 집중할 수 있게 해준다 예를들자면 아래 코드들과 같다 public interface Vehicle { double getFueltankCapacityInGallons(); double getGallonsOfGasoline(); } 위 코드를 아래와 같이 바꾼다 public interface Vehicle { double getPercenFuelRemaining(); } 아니면 이렇게도 가능하다 public class Point { public double x; public double y; } 위의 코드를 아래로 바꾼다 .. 2022. 1. 18. 1.2.4 어셈블리어로 프로시저 구현 프로시저 : 특정 업무 수행을 위한 절차들의 기술 함수 : 각 절차의 구현 (프로시저와 함수는 코드의 가독성과 재사용성을 높이는 추상화 방법 중 하나다) 인수 : 입력 겸, 데이터와 프로시저를 잇는 인터페이스 프로시저의 실행 과정 1. 프로시저에 인수 입력 2. 프로시저에 제어 넘기기 3. 프로시저는 필요한만큼 메모리를 가져가서 작업을 수행한다 4. 프로시저는 리턴 5. 사용한 프로시저를 원래 위치에 되돌려 놓기 이때 쓰이는 레지스터들의 역할 x0 : 0만 담음 x1 : 다음 실행될 명령어의 주소를 담음 x2 : 다른 레지스터들의 값을 보존 (=sp, stack pointer) x5~7 : 보존 X x8(=fp), x9 : 보존 O x10~17 : 인수용 x18~27 : 보존 O x28~31 : 보존 X.. 2022. 1. 18. Clean Code : 주석2 정보를 제공하는 주석 때로는 기본적인 정보를 주석으로 제공하면 편리하다. 예를 들자면 반환할 값에 대한 설명이다 // kk:mm:ss EEE, MMM dd, yyyy 형식이다. Pattern timeMatcher = Pattern.compile( "\\d*:\\d*:\\d* \\w*, \\w* \\d*, \\d*"); 이왕이면 시각과 날짜를 변환하는 클래스를 만들어 코드를 옮겨주면 더 깔끔해 질수 있긴하다. 의도를 설명하는 주석 때때로 주석은 이해를 돕는 수준이 아니라 의도 자체를 알려줄 수도 있다. 예를 들자면 함수가 기능을 수행할때 그것의 코드블럭의 코드가 어떻게 그 기능을 수행하게 되는지 불분명할때 알려줄 수 있다. 의도를 명료하게 밝히는 주석 인수나 반환값 자체를 명확하게 만들면 좋긴 하겠지만, .. 2022. 1. 12. Clean Code : 주석 나쁜 코드는 주석을 달게 아니라 새로 짜라 일단 잘 달린 주석은 그 어떤 정보보다 유용하지만, 신중하지 못한 주석은 더 이해하기 어렵게 만든다. 오히려 주석은 달면 무조건 좋은게 아니라 절대 선이 아니라 필요악임을 명심해라. 코드만으로 대게 의도를 충분히 표현할 수 있고 그렇게 되면 주석은 전혀 필요가 없다. 주석은 단지 우리가 코드로 의도를 표현하는데에 '실패' 했을 때, 만회하기 위해 선택하는 차악일 뿐이다. 그런 이유도 있지만 좀더 큰 이유는, 코드는 시간이 지남에 따라 변화하고 진화하지만 주석은 언제나 코드를 따라가지 못한다. 시간이 지남에 따라 점점 더 코드와 괴리되서 주석이 무엇과 관련되있는 것인지 조차 알 수 없는 모호한 고아로 변하는 사례가 너무나도 많다. 심지어 부정확한 주석은 주석이 아.. 2022. 1. 12. Clean Code : 함수 1. 작게 만들어라 이건 로버트 C. 마틴의 생각이다 그의 40여년간 경험상 작게 만드는게 좋다고 확신한다. 나도 동의한다. 왜냐하면 함수가 길 수록 기억해야 할 것과 집중해야 하는 요소가 많아 져서 이해하기 어려워진다. 또한 짧으면 함수들을 나열한 것처럼 작성이 되는데, 함수는 동사나 동사구를 이름으로 쓰기까지 해서 작성 결과가 마치 이야기 책을 써놓은 것처럼 작성이 되서 이해하기 매우 숩다 2~4 줄인게 좋다고한다 이것을 위해 if, while, for의 코드블록은 한 줄이여야한다. 그리고 대게 거기서는 함수를 호출한다 2. 함수는 한가지만 해야한다. 그런데 정확히 한가지를 한다는 것의 기준이 무엇인가? 리턴만 해야하는가? 조건문을 하나만 써야하는가? 답은 추상화 수준이 하나여야 한다. 세부적인 기능.. 2022. 1. 11. 이전 1 2 3 다음