어셈블리어 명령어 CMP와 JE 동작원리에 관하여 여쭈어봅니다.

victoryz12의 이미지


안녕하세요?

다름이 아니라

제가 어셈블리어 공부를 하고 있는중에 궁금한 점이 생겨났습니다.

예를 들어

CMP AL, 0
FE  fin

가 있다고 할때,

CMP 가 C 언어에서는 if 문으로 된다고는 하는데

CMP 가 피연산자와 연산자와 비교가 되어 어떤 내부동작으로 하여금 바로

아래의 JE 명령어에 전달해서 분기가 되는지 그 원리가 궁금합니다.

제 생각으로는 CMP 명령어를 통해서 0 혹은 1 이 레지스터에 저장이 되고

그 레지스터를 명령어 JE가 불러오는 식인거 같은데

만약 제 생각이 맞을때 어떤 레지스터가 저장소가 되는지 궁금합니다.

답변 부탁드립니다^^

freestyle의 이미지

CMP 연산의 결과로 EFLAGS 레지스터의 다음 플래그들이 영향을 받습니다.

The CF, OF, SF, ZF, AF, and PF flags are set according to the result.

각 EFLAGS의 플래그는 특정 조건일 때 SET(=1) 또는 UNSET(=0) 되는데,
그 중 ZF는 산술 연산이나 논리 연산의 결과가 0이 될 때 SET 됩니다.

CMP 명령은 내부적으로 Op1 - Op2로 처리됩니다.
즉 산술 연산이 발생하고, 두 값이 같다면 연산 결과가 0이 되어 ZF가 SET이 되지요.

The condition codes used by the Jcc, CMOVcc, and SETcc instructions are based on the results of a CMP instruction.

보통 CMP가 사용되는 용도가 말씀하신 바와 같이 c언어의 if문처럼 결과에 따른 분기이므로,
ZF 플래그를 검사해 jump하는 명령이 주로 뒤따르게 됩니다.

이 ZF를 검사하는 condition code가 Z 또는 E인데, ZF가 SET일 때를 의미합니다.
만약 JE라면 'ZF를 검사해 SET이면 특정 주소로 jump 하라'가 되고,
JNE라면 'ZF를 검사해 UNSET이면 특정 주소로 jump 하라'가 됩니다.

정리하면
CMP의 결과로 피연산자가 서로 같은지 아닌지에 따라 ZF가 SET 또는 UNSET 되고,
이 결과를 검사하는 접미사 E가 붙는 명령어가 사용된 것입니다(Z도 역시 ZF를 검사하기에 JZ를 쓸 수도 있습니다).

너무 장황하게 설명했는데, 'Intel Architecture Software Developer's Manual'를 보시면
Volume 2-A에서 CMP 명령어를 설명하고 있고, 그 결과 어떤 플래그가 바뀌는지 나와 있습니다.

각 플래그의 의미에 따라 어떤 접미사를 써야 하는지는 Volume 1 Appendix B 중 Table B-1에 나와 있습니다.

질문 주신 예처럼 분석이나 간단한 어셈블리 프로그래밍을 할 때는 자주 사용되는 패턴을 익히는 것이 보통이며,
필요나 기호에 따라 직접 명령어를 조합하여 쓰기도 합니다.

다음 페이지는 찾아보기 쉽게 EFLAGS의 각 플래그에 대한 명령어들을 교차 나열하고 있네요.
http://datasheets.chipdb.org/Intel/x86/Intel%20Architecture/EFLAGS.PDF
----------------------
Go to the U-City

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

victoryz12의 이미지

감사합니다^^

어떤 원리인지 이제 이해할 것 같습니다

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.