관리 메뉴

IT창고

System 어셈블리어 반복문 본문

보안/System

System 어셈블리어 반복문

방구석여포 2018. 1. 18. 21:10

어셈블리어의 반복문(for, while, do_while)에 대해 알아보겠습니다.


어셈블리어에서 분기문과 반복문의 차이는 jmp명령어를 사용해서 반복시켜주는가 아닌가로 나눠집니다. 분기문과 반복문의 차이가 거의 없습니다. 


어셈블리어에서 증감명령어가 있는데 inc, dec 명령어가 있습니다.

inc 명령어는 메모리나 레지스터 값을 1씩 증가 시킵니다.

dec 명령어는 메모리나 레지스터 값을 1씩 감소 시킵니다.


먼저 간단한 반복문을 만들어보겠습니다.

C언어로 만든 소스입니다.

10값에서 1씩 감소하는 프로그램입니다.


이와 같은 기능을 가진 어셈블리어를 만들어보겠습니다.


반복문과 분기문의 차이는 코드가 반복되는가 아닌가의 차이입니다. 무한루프에 빠지지않도록 조건 분기를 꼭 주어야 합니다.


C언어로 for문을 확인하면 아래의 코드와 같습니다.

int cnt = 10;


int main(){


for( ; cnt > 0 ; cnt -- ){      

printf("%d\n",cnt);

cnt--; //inc(++), dec(--)


}

return 0;

}


실행결과는 while문과 똑같고 위에 만든 어셈블리어의 결과와도 같습니다.


이번에는 문자열을 입력받아서 거꾸로 출력하는 어셈블리어 프로그램을 작성하겠습니다.

입력은 scanf, gets, fgets, 등 어떤것이든 상관없습니다. 단 문자열 길이가 1024byte를 넘으면 안됩니다.



 우선 C언어로 구성해보았습니다. 이제 어셈블리어로 만들어보겠습니다.



어셈블리어로 만들경우 유효주소를 이용한 연산을 할때 [] 안에서 메모리와 메모리는 +를 이용한 연산이 불가능하기에 뮨자열 길이를 담고있는 레이블 주소 buffer의 값을 레지스터에 옮겨서 연산을 해야합니다.

Comments