반응형
1. 어셈블리 접미사의 의미
어셈블리 접미사는 기본적으로, q,l,w,b가 있다. (addq, addl,addw,addb) 각각 8,4,2,1 byte를 사용하는 연산이라고 생각하면 된다. 접미사를 사용하지 않기도 하는데, 기본적으로 생략했을경우, default는 8byte이다.
대부분의 상황에서 접미사는 거의 신경쓸 필요가 없지만, 작은 단위의 배열을 다루거나, (int 단위 배열) 구조체 내에 있는 변수를 다룰때는 특히 조심해야한다.
mov의 예시
mov a b #a값을 b에 넣는다 (b=a)
mov (a) b #*a값을 b에 넣는다 (b= *a)
mov a (b) #a값을 *b에 넣는다. (*b = a)
lea의 예시
lea (a) b #a값을 b에 넣는다 (b = a) 조금더 구체적으로는 b= &(*a) a값은 반드시 주소여야함. 단 실제로 *a를 하지는 않으므로, 부적절한 주소값을 대입한다고 문제가 생기지는 않음.
lea를 사용하는 이유
lea를 사용하는 이유는 주소값에 상수를 더하거나 주소끼리 더했을때, mov를 사용하면 두줄을 써야하는 연산을 1번으로 해결할 수 있다.
ex) leaq 0x123(,%rdi,2),%rax #rax레지스터에 0x123+%rdi*2의 주소를 집어넣는다. mov를 이용해서는 한줄로 이걸 계산할 수 없다.
mov와 lea 요약
쉽게 이야기하면 mov는 우리가 생각하는 그냥 옮기는 연산 (movq movl movw movb)
lea는 주소값끼리 합과 (배열 구조체등 연산) 주소를 mov시키는걸 합치기위해서 만든 연산 (leaq leal leaw leab)
반응형
'컴퓨터 시스템' 카테고리의 다른 글
shell 주요 함수 정리 (0) | 2021.11.07 |
---|---|
Little Endian과 Big Endian (0) | 2021.11.01 |
어셈블리 operations 모음 (0) | 2021.10.15 |
assembly 각 register의 역할과 caller-saved, callee-saved. (0) | 2021.10.11 |
실수의 저장 방식 (0) | 2021.10.04 |