어셈블리어 CMP 명령어에 대해 궁금한점이 있습니다

gurumong의 이미지

안녕하세요
어셈블리어를 공부하고 있는데요
비교를 수행하는 cmp 명령어에 대해서 의야한 점이 있습니다
책에 cmp명령어에 대해서 설명하길...
목적지 피연산자를 수정하지 않는 sub 명령과 동일하다고 되어있습니다

예를 들면 4와 1의 비교는 sub를 이용한 뺄샘 4 - 1 와 같고
소스 피연산자를 2의 보수로 바꿔 4 + (-1)
뺄셈을 덧셈으로 바꾸게 되고 이 연산의 결과는

   00000100
 + 11111111
-----------
(1)00000011

결과는 3이 되는데
캐리가 발생하지 않았습니까?

그런데 cmp에서 제로 플러그가 0이고 캐리가 1일때는
소스 피연산자가 클 경우라고 설명하고 있습니다
그럼 4 보다 1이 더 크다고 말하게 되는것이지 않나요?
무엇을 잘못 알고있어서 이렇게 생각한 결과가 책과 다른지 모르겠습니다 ㅜ.ㅜ

irondog의 이미지

sub 연산하는데 왜 소스 피연산자를 2의 보수로 바꿔서 덧셈을 하죠? sub라는 인스트럭션이 분명히 있는데 말입니다.

gurumong의 이미지

프로세서가 뺄셈을 덧셈으로 고쳐 계산하기 위해서 내부적으로 소스 피연산자를 2의 보수로 바꾸지 않나요?
그 계산의 과정중에 캐리가 발생하게 되는데 책에서 알려주는 cmp의 결과와 맞지 않아서
그게 궁금해서 아직 잘 모르겠어요 ㅜ.ㅜ

Necromancer의 이미지

이건 인텔이나 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

gurumong의 이미지

이렇게도 해보았는데요

MOV    AL, 04h
MOV    BL, 01h
SUB    AL, BL

디버거로 수행해보니 결과는 3이 되고 캐리는 클리어 되네요
제가 알기로 프로세서는 2의 보수를 이용해 뺄셈을 덧셈으로 처리하는걸로 알고있는데요
직접 계산을 해보면 그 계산의 결과로 캐리가 발생하는데
프로세서는 결과값만 동일하고 캐리는 반대로 없다고 나오는데

이게 어찌되는것일까요? ㅜ.ㅜ

irondog의 이미지

http://pages.cs.wisc.edu/~smoler/x86text/lect.notes/arith.int.html

Quote:
SUBTRACTION
...
sign magnitude:

- if the signs are the same, then do subtraction
- if signs are different, then change the problem to addition
- compare magnitudes, then subtract smaller from larger
- if the order is switched, then switch the sign too.


글자 강조한 곳을 읽어 보시면 2의 보수연산이 필요 할 때가 따로 있다는 확인 하실 수 있습니다.
더 자세한 것은 링크에 가셔서 SUBTRACTION란을 찬찬히 읽어 보시면 됩니다.

gurumong의 이미지

무부호 정수에 대해서 뺄셈을 수행할때
목적지 피연산자가 클 경우와
소스 피연산자가 클 경우가 있는데

소스 피연산자가 보다 클 경우
소스 피연산자를 2의보수로 바꾸고 보다 작은 목적지 피연산자를 더하게 되면
비트를 모두 채워서 넘치게 하지 못하니 캐리가 발생하지 못하게 되고

목적지 피연산자가 보다 클 경우
소스 피연산자를 2의 보수형태로 비트를 바꿨을때 비트가 모두 1일때의 차이보다도 목적지 피연산자가 더 크게 되니 이 둘을 덧셈을 수행했을때 무조건적으로 캐리가 발생하게 되는데

실제 프로세서는 이와 다른 정반대의 캐리값을 내어놓는데요..
책에서도 마찬가지이구요

┌────┬────┐
│  캐리  │  관계  │
├────┼────┤
│   0   │  X≥Y  │
├────┼────┤
│   1   │  x<Y  │
└────┴────┘

(X - 목적지 피연산자, Y - 소스 피연산자)

왜 이러한 반대의 캐리값을 내어놓는걸까요?

Necromancer의 이미지

앞글에서 님의 의도하신 바를 제가 잘못 봤군요.

덧셈일경우 그냥 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

gurumong의 이미지

아아 그런것이로군요..
단순히 캐리를 자리올림과 자리내림 수준에서 이해했어야하는것인데
혼자 상상의 나래를 펴며 삽질한것이네요
저는 이것 때문에 하루종일 고민했답니다;;
정말 감사드립니다 (__)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.