C의 구조체 및 sizeof(int)보다 큰 크기의 변수를 어셈블리 코드로 변환하고 싶습니다.

HDNua의 이미지

C의 구조체 및 sizeof(int) 이상의 변수를 어셈블리 코드로 변환하고 싶습니다.

안녕하세요. Javascript를 이용한 컴파일러를 개발하고 있는 군인입니다.
프로젝트의 설명은 여기를 참조하세요.
(https://kldp.org/node/143071)

음.. 이번엔 정말 애매한 질문입니다.

1. 어셈블리에서 구조체를 사용하는 방법, 또는 C의 구조체를 어셈블리 코드로 변환하는 방법이 궁금합니다.
어셈블리에서 구조체를 정의하고, 구조체를 함수의 인자로 넘기거나 각 멤버에 접근하는 방법이 궁금합니다.
찾아보니 이런 사이트를 발견했는데, 이런 식으로 C 구조체 정의가 어셈블리와 어떻게 매치가 가능한지를
보여주시면 이해하기 편할 것 같습니다.
http://www.csee.umbc.edu/courses/undergraduate/313/spring05/burt_katz/lectures/Lect10/index.html
http://www.csee.umbc.edu/courses/undergraduate/313/spring05/burt_katz/lectures/Lect10/structuresInAsm.html

2. 컴파일러 또는 MASM, NASM, GAS를 입문할 수 있는 책 추천바랍니다.
아무래도 구조체에서 막힌 게 제가 어셈블리에서 사용할 수 있는 명령어 중
모르는 것이 많아서 그러리라 생각하고 있습니다.
그래서 어셈블리를 공부하고 싶은데 이에 관해 좋은 책을 추천받고 싶습니다.
찾아보니 드래곤 책 같은 게 나오긴 하는데 가격이 후덜덜하네요;

KLDP 여러분의 도움을 청합니다. 읽어주셔서 감사합니다.

HDNua의 이미지

한 번만 더 수면 위로 올려보고 그래도 없으면 그러려니 하겠습니다.

저는 이렇게 생각했습니다.

mirheekl의 이미지

http://assembly.ynh.io/

참고가 될 듯.

--

HDNua의 이미지

"C to Assembly"같은 당연한 키워드가 있었는데 이걸로 찾아보질 않았습니다. 찾아봤더니 여러가지 나오더군요.

일단 주신 링크를 이용해 코드를 작성도 해보고, 지금 가지고 있는 책을 이용해 C플랫이라는 언어의 어셈블리 변환 코드도 참조해봤는데, 양쪽 모두 구조체가 어떻게 어셈블리 언어로 변환되는지가 나오지 않습니다. 어쩌면 언어 자체에서 지원하지 않는 기능인지도 모르겠구요. 그런데 저번에 찾아본 건 struc이라는 키워드로 구조체를 잘 정의하던 것 같기도 하던데 말이죠.

결국 무엇을 공부해야 어떻게 구조체를 목적파일에 기록하고 어떻게 기록된 목적파일을 읽어올 것인지는 아직도 모르겠습니다. 써놓고 보니 질문이 확장되어있네요.

질문에도 썼지만, 혹시 컴파일러 공부에 관한 내용, 또는 오브젝트 파일에 어떻게 정보를 기록하는지와 같은 정보가 있으시다면 힌트 주시면 직접 찾아보겠습니다.
매번 좋은 답변 감사합니다. 좋은 하루 되세요 ^^

저는 이렇게 생각했습니다.

익명 사용자의 이미지

어셈블리에서는 결국 액세스 하려는 메모리 주소, 그 메모리 주소에 있는 값, 레지스터를 이용한 연산 이 정도만 정의를 하고 있는 편입니다.

C의 구조체는 그 구조체의 인스턴스가 생성되고 나면 그 인스턴스가 시작하는 메모리의 주소 (base address)에서 각각의 멤버들은 offset 으로 메모리 주소를 표현할 수 있습니다.
즉, 어셈블리에서는 구조체를 정의하는 별도의 문법이 없더라도 언제든지 언어 자체의 기본 기능으로 구조체의 기능을 구현 할 수 있게 되는 거죠.

어셈블러의 종류에 따라서 의사명령어가 있어서 별도로 구조체를 정의하는 명령어가 있을 수는 있어요.
하지만 이 부분은 어셈블러마다 다르기 때문에 그 어셈블러를 알아야 할 수 있는 겁니다.

32bit 시스템에서

struct test_struct{
int a;
short b;
char c;
char d;
}

struct test_struct x;

x.a 의 주소 = {x의 시작 주소}
x.b 의 주소 = {x의 시작 주소} + 4
x.c 의 주소 = {x의 시작 주소} + 6
x.d 의 주소 = {x의 시작 주소} + 7

HDNua의 이미지

그럼 결국 제가 찾은 링크의 struc 키워드는 모든 어셈블리가 정의하고 있는 키워드는 아닌 것이군요.
나머지는 그냥 다 말씀하신 것처럼 오프셋으로 위치 조정만 하는 식으로요.

좋은 답변 감사합니다.

저는 이렇게 생각했습니다.

cinsk의 이미지

System V Application Binary Interface - x86 이런 걸로 검색하시면 ABI 문서를 찾을 수 있고, 해당 architecture/os에서 사용하는 구조체 형태에 대해서 알 수 있습니다.

HDNua의 이미지

주신 키워드로 찾아보겠습니다. 답변 감사합니다.

저는 이렇게 생각했습니다.

klyx의 이미지

ABI는 API의 바이너리 버전이라고 생각하심 됩니다.
API호환이라고 하면 보통 소스레벨에서 호환되는 거고, ABI호환이라고 하면 바이너리 레벨에서 호환이 되는 거지요.

예를 들어, C++에서 구버전은

int foo();

라는 함수였던게 새버전에서는

int foo(int def = 0);

와 같이 바뀌었다면 소스레벨에서는 호환이 되겠지만 심볼이 바뀌니까 바이너리 레벨에서는 호환이 안되므로 구버전과 신버전 사이에서 API는 호환되지만 ABI는 호환이 되지 않아서 신버전 라이브러리를 설치할 경우에는 이에 의존하는 바이너리를 전부 새로 컴파일해줘야합니다.
비단 이런 경우뿐만 아니라 구조체의 레이아웃이 바뀐다던가 클래스 구조가 바뀐다던가 하는 것으로도 쉽게 ABI 호환성이 깨질 수 있습니다.
보통 ABI가 호환안되는 버전 업에서는 x.y.z 버전이라고 할때 x가 바뀌는 경우가 많지요.

HDNua의 이미지

굉장히 재미있는 내용이네요. 좋은 정보 알아갑니다.

저는 이렇게 생각했습니다.

댓글 달기

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