강좌 & 팁
안녕하세요.
오늘도 ARM 명령어 하나를 선택하여 공부해 보겠습니다
RSB 명령어
RSB 명령어는 ADD, SUB와 같은 산술 명령어와 같은 분류에 속하는 명령어 입니다.
RSB 명령어는 32비트값의 뺄셈(반전)의 기능을 가지고 있습니다.
RSB 명령어는 어떤 값을 음수로 만들기위해 사용합니다.
정말 그런 기능을 하는 명령어인지 프로그램 해보겠습니다
1. 프로그램
다음 프로그램은 입력한 값을 음수(-)값을로 리턴되는 값을 출력하는 프로그램입니다.
다음은 rsb 명령어를 이용한 rsb.c 예제 프로그래입니다.
#include <stdio.h>
int asm_rsb_ex( int x, int y );
asm(" \n\
.global asm_rsb_ex \n\
asm_rsb_ex: \n\
rsb r0, r1, #0 \n\
mov pc, lr \n\
");
int main ( void )
{
int rsb;
printf("\n+------------------+\n");
printf("|ARMInstruction RSB|\n");
printf("+-------------------+\n\n");
rsb = asm_rsb_ex( 0x00000000, 0x00000077 );
printf("rsb = 0x%08X\n\n", rsb );
printf("Program END\n\n");
return 0;
}
결과를 예상해 보세요~
2. 프로그램 설명
프로그램은 간단합니다!
핵심이 되는 소스는 당연
rsb r0 , r1, #0
이 되겠습니다 ^^
위 코드는 다음과 같은 동작으로 처리됩니다.
r0 = 0x00000000
r1 = 0x00000077
r0 = 0x00000000 - 0x00000077
r0 = ??
r0 값은 어떻게 될까요?
예상으론.. 0xffffff89 가 될것입니다.!
어떻게 이렇값이 나오느냐!?
컴퓨터에서는 모든 데이터를 이진수로 다룹니다! (1010101 요런식으로요!)
하지만 저런 이진수로는 음수를 표현하기 힘들겠죠?
그래서 나온것이 부호화비트를 사용하여 음수를 표현했습니다.
부호화 비트를 사용한다는 것은,
최상의 비트가 0일경우 양수, 최상의 비트가 1일경우 음수로 표현하는 방법이 생겼습니다.
하지만 문제가 생겼죠?
예를들어
5를 이진수로 바꾸면
5 -> 0101
그럼 -5는?
-5 = 1101
하지만 이 두 수를 더하면?
5 + (5) = 0 이 답이죠?
하지만 답은?
0101 + 1101 = 0010
0010 이라는 값이 나옵니다.
0이 아니니 오답이겟죠?
문제가 생긴것입니다.
그래서 다른 이진수 음수 표현법이 필요하게 되었으며,
1의 보수 표현법
2의 보수 표현법이 생겨나게 되었습니다.
더 자세한 것들은...
더이상 언급하지 않겠습니다.
뭔가 주제에 어긋난 것 같다는 생각이 들었거든요
어쨋든!!
0x00000077 이란 값을 음수로 표현하면 2의 보수를 취해줍니다.
2의 보수 계산법은 값의 반전 + 1 입니다!
요렇게요!
16진수 -> 2 진수 -> 반전
0 -> 0000 -> 1111
0 -> 0000 -> 1111
0 -> 0000 -> 1111
0 -> 0000 -> 1111
0 -> 0000 -> 1111
0 -> 0000 -> 1111
7 -> 0111 -> 1000
7 -> 0111 -> 1000
이렇게 반전한 후 + 1을 하면!
16진수 -> 2 진수 -> 반전 -> +1
0 -> 0000 -> 1111
0 -> 0000 -> 1111
0 -> 0000 -> 1111
0 -> 0000 -> 1111
0 -> 0000 -> 1111
0 -> 0000 -> 1111
7 -> 0111 -> 1000
7 -> 0111 -> 1000 -> 1001
위 값을 16진수로 표현하면
0xffffff89
가 됩니다!!
맞나요~?
프로그램을 실행시켜 예상한 결과가 맞는지 확인해 보겠습니다
3. 프로그램 실행화면
다음은 프로그램 실행 화면 입니다.
여러분도 같은 결과가 나오나요~?
앞으로?
다음 글에도 역시 ARM 명령어중 하나를 선택하여 프로그램해 보겠습니다.
빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~