어셈블리 공부를 하다가 레지스터에 관하여 여쭈어봅니다.

victoryz12의 이미지

안녕하세요^^

어셈블리를 공부를 하다가 레지스터에 대하여 궁금한 점이 있어서 질문을 드립니다.

1. SI 와 DI 의 정확한 의미와 사용 목적 및 예시를 알고 싶습니다.

- 공부를 하다가 SI와 DI 의 개념이 잘 안잡힌 것도 있지만, 설명이 와닿지 않습니다..

책과 제가 조사한 SI 및 DI 개념은 다음과 같습니다.

SI( Source Index ) :  레지스터나 메모리(1)로부터 메모리(2)로 데이터를 전송하기 위한 출발지 주소 지정에 사용된다. 
그리고 일반적인 전송이나 연산에도 사용된다. 
특히 문자열 처리 명령에 있어서는 메모리로부터 데이터를 전송하기 위한 출발지 주소 지정에 사용된다.

DI( Destination Index ) :  레지스터나 메모리(1)로부터 메모리(2)로 데이터를 전송하거나 비교할 때 
목적지 주소를 지정할 때 사용한다. 그리고 일반적인 전송이나 연산에도 사용된다.

메모리에서 메모리로 데이터를 전송할 때 출발지/목적지 주소지정이라는 게 정확히 무엇을 의미하는지 잘 모르겠습니다.

무엇보다 SI 와 DI 를 왜 사용하는지 AX 및 다른 레지스터를 사용해도 되는것이 아닌지 궁금합니다.

그리고 SI와 DI를 데이터 전송에 있어서 사용되는 예를 알고 싶습니다..

제가 찾은 예제로는 문자열 처리에 관한 SI 와 DI 가 있었습니다만 문자열의 문자 하나하나 읽을때 SI는 문자열 첫번째 주소를

가리켜서 점점 SI 를 1씩 증가시켜 문자 하나하나씩 읽는 것으로 보았습니다. 그런데 DI 같은 경우에는 문자열 맨 끝에서 시작이 되는 걸까요?

SI 와 DI 의 의미/개념 및 사용되는 예시를 알고 싶습니다. 물론 데이터 전송 그리고 문자열입니다.

2. 세그먼트 레지스터의 동작원리 및 세그먼트 레지스터 사용 예시

- 세그먼트 레지스터입니다.
제가 공부하였을 때 세그먼트 레지스터는 오프셋과 합쳐져서 세그멘테이션 메커니즘을 따라 선형 주소를 도출 하고 다시 선형 주소가

페이징 메커니즘을 통해서 물리 주소가 도출되는 것을 알게 되었습니다.

그런데 가상주소의 세그먼트 레지스터가 세그멘테이션 메커니즘 단계에서 디스크립터를 가리키는 그림을 보게 되었는데요.
이 디스크립터가 어디에 있는 디스크립터를 말하는지 ( 제생각으로는 cpu가 아닐까요?) 모르겠습니다..

그리고 세그먼트 레지스터가 16bit 로 이중에서 13bit 는 디스크립터 테이블 인덱스, 2bit는 RPL, 1bit는 테이블 인디케이터라고
하는데요..

디스크립터의 세그먼트 디스크립터를 가리킨다면 세그먼트 영역(text, .bss, heap, code 등)을 가리키는 것인데,
왜 굳이 세그먼트 레지스터의 테이블 인덱스가 13bit 나 되는지 모르겠습니다. 그만큼 디스크립터 테이블에 인덱스가 많다는 것을 의미하고

그만큼 다양해야 한다는 것일까요?
RPL 이 Requestor Privilege Level 로 명시 되어있는데 접근 권한이라 생각합니다만 무엇인지 궁금합니다.
만약 접근권한이 맞다면 각 비트에 따른 접근권한 또한 알고 싶습니다.

세그먼트 레지스터가 딱히 무슨 일을 하는지도 아직까지 감이 잡히지 않습니다..

또한 어떻게 사용되는지 알고 싶습니다.

질문이 2개였지만, 말씀을 드리다보니 길어진것 같습니다..

답변 부탁드립니다..

감사합니다^^

pastime의 이미지

1. strcpy(dst, src) 를 생각해 보시면 될 것 같습니다.

2. segment descriptor는 descriptor table (GDT/LDT) 내에 존재합니다.
table index가 13비트이니 각 테이블 별로 총 8192개의 descriptor를 사용할 수 있을 것입니다.
이게 많다고 할수도 있지만 구현 방식에 따라서 모자라게 될 수도 있습니다.
이를테면 thread 구현 시 각 thread별로 하나의 descritor를 할당한다고 가정하면
시스템에서 최대 생성 가능한 thread의 수가 8000개 정도 밖에 될 수 없을 것이고
둘 이상의 descriptor가 필요하게 된다면 그 만큼 줄어들 것입니다.
RPL은 해당 segment에 접근하기 위해 필요한 최소 previlege level을 의미하며
0이 가장 높고 3은 가장 낮습니다.

victoryz12의 이미지

답변 감사합니다..

다만,좀더 여쭙고 싶은것이 있습니다..

1. SI 와 DI 의 개념이 데이터 복사나 이동 명령어에 따라서 쓰이는 레지스터라고 제가 받아들여도 갠찮을지 궁금합니다..
혹시 몇 가지의 예를 들어서 자세히 설명해주실수 있겠습니까?? 혹여나 그에 따른 정보를 갖고 있는 자료도 좋습니다..

아그리구요..

2. 말씀대로라면 인덱스의 크기가 13비트인 이유가 디스크립터의 개수에 따라서 그렇게 만들어졌다는 말씀이신가요?
그리고 제가 조사했던 세그먼트 영역(텍스트, .bss, heap, 등)에 따라서 세그먼트 레지스터가 가리키는게 맞을까요??

pastime의 이미지

1. IA-32 개발자 매뉴얼 2권에서 movs 명령을 찾아보시면 될 것 같습니다.
x86은 레지스터 수가 적어서 위와 같은 특정 명령에서는 반드시 정해진 레지스터만
사용해야 하는 경우가 있습니다.

2. 세그먼트 레지스터를 16비트 크기로 맞추느라 그랬겠지요.. (뭐가 먼저인지는.. ;;)
OS를 구현하기 나름이겠지만!! 대체로 세그먼트 기법은 잘 안쓰는 편이라
code/data 세그먼트 정도만 구분하고 각 영역 별로 디스크립터를 설정하지는 않을 것입니다.

victoryz12의 이미지

궁금한점이..

1.
IA-32 개발자 매뉴얼 2권에서 movs 명령어를 찾아 보았습니다.

movs m8, m8

로 예를 들어서 설명이 되어있는데요. 그렇다면 SI DI 는 단순히 데이터 이동 혹은 복사 시에만 사용되는 것인가요?

정확히 개념이 잡히지 않았습니다만, 정의로는 메모리의 주소를 포인팅 하는 레지스터라고 했는데

AX나 BX 등의 레지스터를 사용해도 무방하지 않을까요? 왜 굳이 SI DI 레지스터를 사용해서 메모리 데이터 이동 혹은 복사에 사용되는지 모르겠습니다.

movs AX, BX

이런식으로 해서는 안될까요?

2.
무엇보다.. (1)우선적으로 descripter table 이 어디있는지 명확히 잘 모르겠습니다..
그리고 저의 짧은 생각으로 말입니다,..
(2)세그먼트 영역으로 code/data 세그먼트 정도라 구분하였을때 세그먼트 레지스터는 이 세그먼트 영역의 디스크립터만 가리키고 있을 텐데 그렇다면, 각 세그먼트 영역에 세그먼트 디스크립터가 있어서 세그먼트 레지스터가 디스크립터의 시작 주소를 가리키고 있다고 생각하면 될까요??

감사합니다^^

pastime의 이미지

1. 안됩니다. 왜냐고 물으시면 저도 모릅니다.. ;;
그냥 설계 상의 결정이 아닐까요?

2. 디스크립터 테이블은 메모리 상에 직접 만들어서 CPU에게 위치를 알려줘야 합니다.
세그먼트 레지스터로는 테이블 내의 몇 번째 디스크립터인지만 알 수 있습니다.

victoryz12의 이미지

1.

SI, DI 정말 너무 확신이 서지 않습니다..
제가 찾아본 정의 및 개념으로는
다른 범용 레지스터와 마찬가지로 연산과 간접 번지 지정에 사용된다.
이렇게 명시되어있는데 이해가 되지 않습니다.
혹시 설명해주실수 있으시겠어요?^^;;

감사합니다^^

pastime의 이미지

movs와 같이 반드시 사용해야 하는 레지스터가 정해진 경우가 아니라면
범용 레지스터와 같이 사용할 수 있다는 의미입니다.

jick의 이미지

1.
SI, DI 레지스터가 이름이 그렇게 붙은 건 순전히 태곳적 8086 CPU 시절에 아키텍처를 거지같이 만들어놨기 때문입니다.

스트링 복사 명령어를 보시면 아시겠지만 CPU 자체의 구조적 한계로 인해서 다른 레지스터는 쓸 수 없고 무조건 SI, DI만 쓸 수 있도록 해놓았습니다.

그런 경우가 아니고 일반적인 명령어라면 SI, DI 레지스터를 아무 용도로나 사용해도 상관없습니다. CPU가 일일이 명령어의 의도를 판정해서 시비걸 것도 아니고...

2.
세그먼트 레지스터는 굉장히 골치아픈 토픽이고 어차피 요즘 거의 쓰이지도 않는데, 꼭 알아서 써먹어야 하는 이유가 없다면 (MS-DOS용 프로그램을 짠다든지...) 그냥 건너뛰는 걸 추천합니다. 나중에 "일반적인" x86 어셈블리에 충분히 익숙해진 다음 천천히 보셔도 됩니다.

victoryz12의 이미지

1.

SI, DI 가 복사 명령에 따라서 쓰이는 레지스터라고 볼수 있겠는데요..

cpu 자체의 구조적 한계가 어떻게 되어있길래 si, di 만 쓸수 있게 된 걸까요?? 궁금합니다..ㅜㅜ

2.
제가 스터디 그룹때문에 발표하는 입장이라 그렇습니다.. 중요하지 않다고 해서 지나쳐 버린다면, 공부하고 발표하는 입장에서
중요한 의미를 찾지 못하고 가는 것 같습니다.. 혹시 아시거나 잘 설명되어있는 자료가 있으시다면 알려주셨으면 좋겠습니다..^^

감사합니다^^

tj의 이미지

인덱스로 쓸 수 있는 레지스터 제한하는 건 x86만 그런 것도 아니고 그게 제한되어 있다고 아키텍쳐가 거지같은 것도 아닙니다. x86이 하위 호환성 때문에 잡기능이 많긴 하지만 64bit으로 넘어가면서 문제가 되는 것들은 거의 버렸고 가변 인스트럭션 인코딩이라 좀 잡 규칙들이 많긴 하지만 지금에 와서 아키텍쳐상으로 거지같다고 불릴 이유는 별로 없습니다. 실제로 어려운 memory access ordering이나 cache coherency같은 부분들은 대게의 아키텍쳐보다 깔끔하게 되어있고, 가변 인스트럭션 인코딩도 복잡하긴 하지만 단위 용량당 인스트럭션 밀도가 높아서 코드 캐쉬 효율에 도움이 되기도 하구요.

Necromancer의 이미지

x86의 동작모드가 몇가지 있는데, 거기에 따라서 세그먼트 레지스터 쓰는법이 틀려집니다.
GDT, LDT 이야기 나온 것으로 봐서는 protected-mode를 이야기하시는거 같네요. real-mode에서는 단순합니다. (세그먼트*16+오프셋 = 실메모리주소)

protected GDT나 LDT는 GDTR, LDTR이라는 레지스터가 그 정보를 가지고 있고, (얘네는 그냥 접근 안됨)
운영체제가 이들을 어떻게 관리하느냐에 따라서도 다 다릅니다.

예를 들자면 GDT에 운영체제 필수 커널코드관련 디스크립터만 올려놓은 다음, 각 프로세스별로 각 GDT
하나를 할당해서 LDT를 구성하면 프로세스에게 타 프로세스를 안보이게 할 수 있지요.

덤 : LDTR은 인덱스밖에 없습니다. LDT 정보는 LDTR이 가리키는 GDT테이블 엔트리 내에 있습니다.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

댓글 달기

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