어셈블리어 CMP 명령어에 대해 궁금한점이 있습니다
글쓴이: gurumong / 작성시간: 월, 2008/02/11 - 1:31오후
안녕하세요
어셈블리어를 공부하고 있는데요
비교를 수행하는 cmp 명령어에 대해서 의야한 점이 있습니다
책에 cmp명령어에 대해서 설명하길...
목적지 피연산자를 수정하지 않는 sub 명령과 동일하다고 되어있습니다
예를 들면 4와 1의 비교는 sub를 이용한 뺄샘 4 - 1 와 같고
소스 피연산자를 2의 보수로 바꿔 4 + (-1)
뺄셈을 덧셈으로 바꾸게 되고 이 연산의 결과는
00000100 + 11111111 ----------- (1)00000011
결과는 3이 되는데
캐리가 발생하지 않았습니까?
그런데 cmp에서 제로 플러그가 0이고 캐리가 1일때는
소스 피연산자가 클 경우라고 설명하고 있습니다
그럼 4 보다 1이 더 크다고 말하게 되는것이지 않나요?
무엇을 잘못 알고있어서 이렇게 생각한 결과가 책과 다른지 모르겠습니다 ㅜ.ㅜ
Forums:
sub 연산하는데 왜
sub 연산하는데 왜 소스 피연산자를 2의 보수로 바꿔서 덧셈을 하죠? sub라는 인스트럭션이 분명히 있는데 말입니다.
프로세서가 뺄셈을
프로세서가 뺄셈을 덧셈으로 고쳐 계산하기 위해서 내부적으로 소스 피연산자를 2의 보수로 바꾸지 않나요?
그 계산의 과정중에 캐리가 발생하게 되는데 책에서 알려주는 cmp의 결과와 맞지 않아서
그게 궁금해서 아직 잘 모르겠어요 ㅜ.ㅜ
이건 인텔이나 AMD
이건 인텔이나 AMD 프로세서 메뉴얼 보면 나와 있습니다.
플래그 레지스터쪽을 보면 될겁니다. 어느 경우에 CF, SF 등등의 플래그가 셋팅되는지 나와 있습니다.
그리고 님이 질문하신 내용은 signed와 unsigned에 관한 문제인데,
부호 없는 숫자라면 CF, ZF만으로 충분히 판단 가능하지만, 부호 있는 숫자라면 SF, OF까지 참조해서 결정해야 합니다.
어느 경우에 CF, ZF, SF, OF가 셋팅되는지 헷갈리네요. (논리회로 과목 들었다면 다 기본적으로 나오는건데 까먹었습니다 -_-;)
자료 찾아볼 시간도 안되고
조건분기 명령은 unsigned용과 signed 용이 틀립니다.
CF만 가지고 판단하는 조건분기명령(jb, jc 등)은 unsigned 용입니다.
연산한 수가 부호있는 숫자라면 jl 등의 signed용 분기명령으로 바꿔야 합니다.
추가 :
위 경우 CF만 가지고 판단하게 되면 4와 -1을 비교한게 아니라 4와 255를 비교한 게 되는군요. 두 수 모두 unsigned로 판단하니까요.
Written By the Black Knight of Destruction
이렇게도 해보았어요
이렇게도 해보았는데요
디버거로 수행해보니 결과는 3이 되고 캐리는 클리어 되네요
제가 알기로 프로세서는 2의 보수를 이용해 뺄셈을 덧셈으로 처리하는걸로 알고있는데요
직접 계산을 해보면 그 계산의 결과로 캐리가 발생하는데
프로세서는 결과값만 동일하고 캐리는 반대로 없다고 나오는데
이게 어찌되는것일까요? ㅜ.ㅜ
2의 보수연산이 필요 할 때가 있습니다.
http://pages.cs.wisc.edu/~smoler/x86text/lect.notes/arith.int.html
글자 강조한 곳을 읽어 보시면 2의 보수연산이 필요 할 때가 따로 있다는 확인 하실 수 있습니다.
더 자세한 것은 링크에 가셔서 SUBTRACTION란을 찬찬히 읽어 보시면 됩니다.
무부호 정수에
무부호 정수에 대해서 뺄셈을 수행할때
목적지 피연산자가 클 경우와
소스 피연산자가 클 경우가 있는데
소스 피연산자가 보다 클 경우
소스 피연산자를 2의보수로 바꾸고 보다 작은 목적지 피연산자를 더하게 되면
비트를 모두 채워서 넘치게 하지 못하니 캐리가 발생하지 못하게 되고
목적지 피연산자가 보다 클 경우
소스 피연산자를 2의 보수형태로 비트를 바꿨을때 비트가 모두 1일때의 차이보다도 목적지 피연산자가 더 크게 되니 이 둘을 덧셈을 수행했을때 무조건적으로 캐리가 발생하게 되는데
실제 프로세서는 이와 다른 정반대의 캐리값을 내어놓는데요..
책에서도 마찬가지이구요
(X - 목적지 피연산자, Y - 소스 피연산자)
왜 이러한 반대의 캐리값을 내어놓는걸까요?
앞글에서 님의
앞글에서 님의 의도하신 바를 제가 잘못 봤군요.
덧셈일경우 그냥 overflow나면 CF가 셋팅됩니다.
하지만 뺄셈일경우(2의 보수 덧셈) CF 셋팅 양상은 덧셈과 정반대가 되죠.
(빼는 수가 크면 오버플로우된 비트가 없습니다. 4-5나 4-8 식으로 하시면 아실겁니다.
반대로 빼는 수가 원수보다 작으면 2의 보수에서는 오버플로우 비트가 생기죠)
그래서 뺄셈일 경우 2의 보수로 바꿔 더하면서 나오는 overflow를 NOT으로 보정해서 CF로 보냅니다.
디지털논리회로 책을 찾아보아야 할 것 같네요.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
답변 감사드립니다.
아아 그런것이로군요..
단순히 캐리를 자리올림과 자리내림 수준에서 이해했어야하는것인데
혼자 상상의 나래를 펴며 삽질한것이네요
저는 이것 때문에 하루종일 고민했답니다;;
정말 감사드립니다 (__)
댓글 달기