Busan IT/Assembly2015. 9. 24. 09:27

==================================Outline====================================

기본 명령어

- 나눗셈 idev/dev

- 나눗셈 연산 준비 cbw, cwd, cdq, cwde

- 레지스터 확장 movezx, movesx

----------------------------------------------------------------------------

 

** 박스의 겉넓이를 구하는 공식에 대한 assembly 공식 문제 풀이

 


2{length(width + height) + width*height)

bx = width + height

cx = width * height


1. bx = width + height

2. cx = width * height

3. ax = bx * length   

4. dx = ax        // dx = length(width+height)

5. dx = dx + cx  // dx = length(width+height) + width * height

5. dx = dx + dx  // dx = 2{length(width+height) + width * height}


나눗셈 idev/dev

나눗셈에 대하여 알아보자. 나눗셈은 division의 약자인 div를 사용한다. div는 양수만을 나눌 때 사용되고 idiv는 음수와 양수 모두(정수)에 사용된다.

 

//imulsigned(정수)이다.

16비트로 나누면 8비트, 8비트 나누어진다.

 

Assembly에서는 나눗셈 연산을 수행하면 몫과 나머지가 동시에 저장된다. 즉 소수점 계산이 아닌 정수 계산으로 연산이 진행된다.

 

 

 

/헥사 값의 첫 수에 영어가 나왔을 때 반드시 0을 붙혀 주어야 한다.

 

 

 

pdf p/133, 134 예제 해보기

책에 나와 있는 그대로 예제를 사용하여 그 값을 확인하면 된다. 어렵지 않다.

 




idiv는 연산 중에 가장 많은 사이클을 소모함을 알 수 있다.

양수는 그나마 사이클을 덜 소모한다.

 

때문에 코딩 시 음수를 사용하지 않는 경우 양수를 사용하는 것이 프로그램 성능에 도움이 된다.

 

나눗셈 연산 준비 cbw, cwd, cdq, cwde


나눗셈을 하는 경우 결과 값은 몫과 나머지가 나오기 때문에 몫과 나머지가 출력되는 레지스터를 정리할 필요가 있다. 몫은 AX레지스터에 입력됨으로 따로 신경 쓸 필요가 없지만 2byte1byte로 나누는 경우 이외의 같은 용량의 바이트의 제수가 피제수를 나누는 경우 DX레지스터를 준비해 주어야 한다.

 

주의함 점은 양수인 경우 확장 레지스터를 0, 음수인 경우 1을 넣어주어야 하는데 이 작업을 수행해주는 명령어가 존재한다. 아래의 명령어들은 operand가 필요없다는 점은 알아야 한다.

 

cbw(convert byte to word): AL -> AX로 확장

cwd(convert word to double): AX -> DX로 확장

cdq(convert double to quardword): EAX -> EDX로 확장

cwde(convert word to double extended): AX -> EAX(일반적으로 나눗셈을 위해 사용되는 명령어이다)



 

//음수인 경우의 수는 오른쪽 쉬프트를 사용할 때 가장 왼쪽 자리의 수는 1로 채워진다.

//음수를 유지하기 위한 작업이다.

 

 

레지스터 확장 movezx, movesx 

 

 

movezx 레지스터가 2byte인 경우 4byte로 확장하면서 0으로 채워준다.

movesx의 경우에는 레지스터의 값이 음수인지 양수인지 판단 후 확장시켜 준다.

 

movesxcwde명령어와 비슷하지만 cwdeAX레지스터에 한정된다는 점이 다르다.

 





반응형
Posted by newind2000