SISS/Assembly

ADD, SUB

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