본문 바로가기

정글37

TIL(11일차) 어셈블리어에서의 포인터, 다중배열 어셈블리어에서 단항 연산자 '&'와 '*'는 포인터의 생성과 역참조를 수행한다. 어떤 객체를 나타내는 식 Expr이 있다면 &Expr은 객체의 주소를 주는 포인터가된다. 주소를 나타내는 식 AExpr에 대해 *AExpr는 그 주소의 위치한 값을 준다. 따라서 Expr와 *&Expr는 동일하다. 인덱스 i가 레지스터 %rdx와 %rcx에 각각 저장되어 있는 경우 대해 생각해보면 E와 관련된 수식들은 아래에 표와 같이 표현 할 수있다. 결과 값 레지스터는 %eax(데이터) 또는 %rax(포인터)에 저장하는 수식의 어셈블리 코드이다. 다중배열 C언어에서 다중 배열은 일반적으로 다음과 같이 선언한다. int A[5][3]; typedef int row3_t[3]; row3_t A[5]; 배열 A는 다섯 개의 행.. 2023. 5. 2.
TIL(10일차) 어셈블리어 간단한 계산 명령어와 연습문제 어셈블리어 간단한 계산 명령어와 연습문제 leaq 연습문제 rbx가 p 이고, rdx 가 q를 저장하고 있다고 가정하에 답을 적는 문제 였는데 leaq가 x(rbx) 면 x+rax가 되므로 연산하는 것을 차근차근 따라가다보면 풀만 했던 문제이다. 단항 연산자 주소의 개념에 대해 조금더 깊숙히 알 수있게 되는 파트인 것 같다. (rax)는 *rax로 보면 되므로 rax value가 가르키는 value 값을 찾으면 된다. 유의 할 점은 저 ()부분이고 나머지는 쉽게 풀 수 있었다. 스택 프레임의 대략적인 플로우 rbp로 값을 할당 해놓고 rsp로 이동을 한다 여기서 중요한건 스택메모리 구조는 주소의 값이 높은 곳에서 낮은 곳으로 쌓이는 것이다. 즉, 주소와 스택의 쌓이는 데이터 높이와는 반 비례 관계인 것이.. 2023. 5. 1.
TIL(9일차) 기계어 인스트럭션 보기 우리가 하는 말을 컴퓨터는 어떻게 알아 들을까? 라는 생각을 한 번쯤은 해본적이 있을 것이다. 우리는 쉽게 프로그래밍 언어를 사용해서 컴퓨터가 그걸 받아들이는 과정을 코딩이라고 생각할 수 있지만 그건 아닌 것을 우린 알고 있을 것이다. 실제로는 0,1 밖에 못알아 듣기 때문이다. 모든 사람이 그렇게 깊게 알필요 없으니까 그냥 알고만 넘어가자고 하지만 나 스스로 프로그래밍 한다고 하면 컴퓨터가 어떻게 내말을 알아 듣는지 까지는 알아야 한다고 생각이 들었다. 책을 보고 공부를 해보자 기계 수준의 표현의 부분을 보니 난해한 말들이 굉장히 많다. 처음 보면 굉장히 까다롭지만 천천히 따라가면 대강 이해는 간다. 다른 정글의 팀원들이 어셈블리어부터 기계어 인스트럭션 부분을 굉장히 어려워 하는 것같아서 따로 필요한 .. 2023. 4. 30.
TIL(8일차) 어셈블리어 기계어 수준의 코드를 파악하기 위해 간단한 어셈블리어를 공부하려고한다. C언어의 기초가 어느정도 있다고 가정하에 보면 복잡하긴 하지만 못읽을 정도는 아니었던 것 같다. 유튜버 동빈나 님의 영상을 찾아보고 따로 정리하려고 한다. 어렵다고 생각와중에 진짜 알기 쉽게 설명해준다. 영상 시리즈를 보고 정리한 내용을 적으려 한다. https://www.youtube.com/watch?v=uOIq-P2eQXs&list=PLRx0vPvlEmdAXwJnNtKIVeC27UmwljRYA&index=3 기본 문법 rax : 시스템 콜에 실직적 번호를 가르키고 함수가 실행되고 그 결과가 감기는 명령어 rbx : 베이스 레지스터 -> 메모리 주소 지정 rcx: 주로 반복문에 사용되고 계산용 rdx: 데이터 레지스터이고 연산수행.. 2023. 4. 28.