add = addition
sub = subtraction
-> 인자 2개 (공간, 값 또는 공간)
☞ 주의 | add eax, 10 : 여기서 10은 10진법에서의 10이 아닌 16진법에서의 10이다.
1) 레지스터 + 값, 레지스터 + 레지스터
우선 EAX에 0 값을 넣어준다.
ADD 명령어를 이용해 ADD EAX, 10 어셈블리와 ADD EAX, 7 어셈블리를 작성해주고 실행시켜주면 EAX의 값이 17로 바뀐다.
이번엔 ECX에 0 값을 넣어주고, ECX에 EAX 값을 이동시켜주면 현재 EAX와 ECX의 값은 똑같이 17이 된다.
ADD ECX, EAX 어셈블리어를 작성해 실행시켜주면 17 + 17 = 34(10진법) = 2E(16진법) 이므로 ECX에는 2E 값이 들어간다.
다시 EAX에 ECX 값을 더해주는 어셈블리를 작성해 실행시켜주면 17 + 2E = 45(16진법) 이므로 EAX에는 45 값이 들어가게 된다.
레지스터끼리 더할 때 크기가 다른 레지스터를 더해주고자 하면 다음과 같이 오류가 발생한다.
2) 레지스터 + 메모리 값
이번엔 레지스터에 있는 값을 메모리 주소에 있는 값과 더해보자.
EAX에는 현재 45 값이 들어있고, [402000]에는 0 값이 들어있다.
ADD DWORD PTR [402000], EAX 어셈블리를 실행시켜주면 메모리 [402000]의 값은 45로 바뀐다.
EAX의 크기가 4 byte이기 때문에 메모리에서도 4 byte만큼 이용하는데, 인텔은 리틀 앤디언 방식으로 하위 비트가 낮은 자리이므로 맨 첫 번째 비트에 45값이 저장된다.
ADD ECX, DWORD PTR [402000] 어셈블리를 실행시켜보자.
2E 값이 저장되어있던 ECX 레지스터에 메모리 [402000]의 값인 45를 더해주면 ECX의 값은 73으로 바뀐다.
마찬가지로 ADD EAX, DWORD PTR [402000] 어셈블리를 실행시켜주면 EAX에는 45가, [402000]에도 45가 들어있었기 때문에 EAX의 값은 8A로 바뀐다.
ADD AX, WORD PTR [402000]을 해주면, EAX에는 8A가 들어있었기 때문에 AX 역시 8A 값이 들어있고, 여기에 45를 더해주었기 때문에 EAX의 값은 CF로 바뀐다.
메모리 [402000]의 값을 0으로 초기화한 뒤 10을 더해주고자 하면 ADD DWORD PTR [402000], 10 으로 어셈블리를 작성하면 된다.
메모리끼리 MOV 명령어를 사용할 수 없는 것처럼 ADD 명령어도 사용할 수 없다.
값을 빼는 SUB 명령어도 ADD 명령어와 똑같이 사용하면 된다.
다음과 같이 SUB DWORD PTR [402000], 10 이라는 어셈블리를 작성해주면 원래 [402000]에는 10이 들어있었기 때문에 10을 뺀 0 값이 저장된다.
레지스터 EAX에서도 SUB EAX, 10 어셈블리를 작성하고 실행시키면 원래 있었던 값인 CF에서 10을 뺀 BF가 남는다.
'SISS > Assembly' 카테고리의 다른 글
메모리 주소지정방식 (0) | 2018.08.05 |
---|---|
레지스터로 주소지정하기 (0) | 2018.07.28 |
증감 명령어 (0) | 2018.07.28 |
JMP 명령어 (0) | 2018.07.22 |
메모리 크기 지정과 저장방식 (0) | 2018.07.18 |