2개의 명령어의 차이를 설명하기 앞서,
처음에
어셈을 연습하면서,
LSR r0,#4
같은걸 해보지 않았는가?
(난 해봤는데 ㅠ.ㅠ )
즉,
쉬프트 명령어는
opcode에 올수는 없는걸까?
결론부터 말하면 없다.~!!
두가지 이유를 설명하자면,
우선,opcode 에는 4비트가 할당되었고
16개의 명령어중에 쉬프트 명령어는 없다. ( 너무 당연한 걸 애기한건가? ㅠ.ㅠ )
다른 하나는 mechanical 한 측면에서 설명하자면,
opcode의 명령어는 ALU에서 실행되는 명령어이다.
하지만,
지나번 강의에서 말 했던 거 처럼
암에서는 alu에서 shift연산장치를 따로 빼냈다.
그 연산 장치에는 operand2 만 들어 갈수있다.
그래서,
operand1 은 shift 연산을 못 하는 이유가 또한 그거다.
(너무 뻔한 애기를 한거 같군 -_-;)
그럼,
이제 본론으로 들어가자.
LSR : logical shift right
ASR : arithmetic shift right
해석대로 하자면,
논리 쉬프트 와 산수 쉬프트 인데,
과연 어떤 차이 일까?
직접 한번 해보는 수 밖에 없다.ㅠ.ㅠ
mov r0,#0x11
mov r1,r0,lsr #1
mov r2,r0,asr #1
즉,
r0 레지스터에 0001 0001 => 십진수로 17 (하위 8비트만 나타냈다.)
r1 레지스터에 0000 1000 => 십진수로 8
r2 레지스터에 0000 1000 => 십진수로 8
둘다 나누기 2의 결과를 보였다.
별 차이없다. -_-;
무작정 해보는건 별 효과가 없는거 같다. ㅠ.ㅠ
어셈블러 가이드 원본을 보자.
ASR
Arithmetic shift right by n bits divides the value contained in Rm by 2n, if the contents
are regarded as a two’s complement signed integer.
LSR
Logical shift right by n bits divides the value contained in Rm by 2n, if the contents are
regarded as an unsigned integer.
다른부분은 다 똑같고,,
signed 냐... unsigned 냐만 틀리다.
그러면,
unsigned 로 주어보자.
mov r0,#-17
mov r1,r0,lsr #1
mov r2,r0,asr #1
그러면,
r1 =>214748....
r2 => -9
그렇다.
LSR 은 말 그대로 logical 쉬프트 연산이였다. 그냥 쉬프트만 시키는거다.
반면에,
ASR 은 arithmetical 즉,, 산술연산이다.
컴퓨터는 곱셈, 나눗셈을 오른쪽, 왼쪽 연산으로 한다는건 누구나 알 것이다.
asr 이 lsr 과 다른것은
레지스트리 값을 확인하면 알겠지만,
signed bit 값을 유지시켜 준다.
그래서,
산술연산이 가능한것이다.
이제,
우리는 산술연산을 할때,,,
logical shift 가 아닌 arithmetical 연산을 해야 할 것이다.
이상,
다 아는 내용을
쓸데없이 졸라 길게 쓴
arm designer 고득녕이였습니다.
카페 게시글
검색이 허용된 게시물입니다.
다음검색
첫댓글 처음엔 좀 재미있는 주제가 될꺼 같아서 시작했는데,,, 별 내용이 없는거였다. 정말로 주제선정을 제대로 하지 못한 쓸데없는 강의가 된거 같다. ㅠ.ㅠ
아니야..다 아는 내용은 아닌듯 하다 득녕아 수고 많았다. 오퍼랜드 1,2 차이점이 뭔줄 모르는 사람도 많을 거다. 좋은 강의 계속 부탁한다~!! ㅋㅋ