명령어 연산 과정 궁금증

skycloud의 이미지

메모리에서 명령어를 가져와서 해석하고 명령을 진행하고 다시 메모리에 저장한다.
이게 기본 CPU의 명령어 처리 방식으로 알고 있습니다.
그런데 필요한 값이 어디에 저장되어 있는지 메모리에 있는 명령어가 어떻게 알죠?

예를 들어 처음 명령어가 아래라고 가정하면

f = (g + h) - (i + j);
add $t0, $s1, $s2
add $t1, $s3, $s4
한 다음에
sub $s0, $t0, $t1
가 진행되어야 하는데 메모리에 있던 sub 명령어는 t0,와 t1에 값이 저장되어 있는 것을 메모리에서 어떻게 아는 것인가요?
이미 정해져 있나요? 정해져 있다면 그 정해진 정보는 어디에 있고 어떻게 해석하나요?

pynoos의 이미지

f = (g + h) - (i + j)

위와 같이 뭔가 사전에 알 수 없는 값으로 이루어진 코드는 실행이 안됩니다.
위 코드 이전에 g, h, i, j 들의 초기값을 주겠죠.

그럼 그 값을 초기화 하는 과정도 기계어로 표현이 될 것이고,
계산하는 과정이나 출력을 위한 함수를 호출하는 것도 다 연결되겠죠.

만약 gcc 환경을 사용하신다면, 간단히 실행되는 코드를 만드신다음(a.c라고 가정). 컴파일 할 때, -save-temps 옵션을 주고 컴파일해 보세요
좀 더 자세히 원하면 -fverbose-asm 을 추가해서 실행해보세요.

$ gcc a.c -save-temps -fverbose-asm -o a

그럼 a.s 파일이 만들어지고, 그 내용을 보면 원하는 작업이 어떻게 일어나는지 알 수 있을 것입니다.

익명 사용자의 이미지

말씀하신 t0, t1 이 바로 메모리입니다.
컴퓨터구조, 어셈블리 공부한지 오래되어 다 까먹었는데,
s1, s2, s3, s4, t0, t1 그게 바로 메모리입니다.
명령어 입장에서는 뭐가 저장되었는지 당연히 모릅니다.
그리고 변수에는 메모리 주소값이 들어가기도 합니다.
컴퓨터 구조 책을 보실 것을 추천드립니다.

Stephen Kyoungwon Kim@Google의 이미지

약간 답변이 보완될 필요가 있을 것 같아서 남깁니다.

하드웨어는 대체로 모릅니다. 컴파일러가 기억하고 있습니다.

add $t0, $s1, $s2

add $t1, $s3, $s4

두 개의 덧셈을 저렇게 표현하는 것도 컴파일러고, 그 컴파일러가 자기가 두 덧셈 결과를 각기 t0, t1에 넣어 뒀다고 기억한 다음에 뺄셈에 필요한 코드를 생성할 때, 그 기억된 내용을 사용합니다.

이미 컴파일이 다 되어 수행되는 상황에서는 저 두 덧셈의 결과가 t0, t1에 각기 들어 있다는 정보는 남아 있지 않거나, 디버거를 위해 "debugging information section" 정도에 남아 있게 되는데, 보통 "수행되는" 코드는 debugging information section을 보지 않습니다. 반드시 남아 있지도 않고요.

코드가 기계어로 번역되어 메모리에 올라가면, 프로그래머가 만든 프로그램이 수행되는 거고, 그렇게 수행되는 동안 컴퓨터가 기계어 명령을 가져와서 해석하고 수행하여 그 결과를 메모리 또는 레지스터에 넣게 됩니다.

본문에 적으신 코드는 레지스터나 메모리라는 개념은 없고 그냥 임시 변수만 있죠. 컴파일러가 먼저 복잡한 소스 코드 구조를 저렇게 간단한 유사 기계어를 이용해서 먼저 표현합니다. 다음에 register allocation이라고 해서, 많이 쓰이는 임시 변수 대신 레지스터를, 적게 쓰이는 것 대신 메모리를 사용한다거나 하는 식으로 결정을 하고 실제 어셈블리 또는 기계어를 생성합니다.

skycloud의 이미지

아 감사합니다. 컴파일러가 중요한 일을 많이 하긴 하네요

댓글 달기

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