어셈블리 언어에 대해서

awdxawdx101의 이미지

어셈블리어가 CPU종류에 따라 다르다고 알고있는데 헷갈리는게 있어서 고수님들께 질문드립니다.

1) 어셈블리어는 CPU 종류에 따라 다르나요 ?

2) 기계어 또한 CPU 종류마다 다르나요 ?

3) 리눅스는 AT&T 문법으로 알고있습니다. 그런데 윈도우즈에서 가상머신으로 우분투를 실행하고, 그 우분투에서 어셈과 관련된 작업들을 할 때 진짜 CPU는 intel문법이므로 intel문법으로 작업을 해야하나요?

DarkSide의 이미지

1) 2) 기계어가 다르므로 당연히 이와 일대일 매칭되는 어셈블리어도 다릅니다.
3) 인텔 문법, ATT 문법이란 건 없고, 해당 x86 CPU 에 따르는 어셈블리를 쓰면 됩니다.

jachin의 이미지

어셈블리어는 어셈블러에 따라 달라지고, 어셈블러는 CPU의 ISA를 반영하여 니모닉(mnemonic)을 제공합니다. 문법형식은 MS 어셈블러 형식과 AT&T형식이 있으며 Linux 에서 사용하는 gasm은 윈도우즈에서 사용하는 nasm과 같이 at&t 문법 형식을 따릅니다.

문법형식이라 말한 것은 레지스터 번호를 쓰는 방법이나 연산자, 간접주소지정방식 등을 표기하는 방법이 다르기 때문입니다.

문법은 CPU ISA 형식에 맞춰 nemonic을 구현하고 opcode와 operand를 표기하기 때문에 문법이 다르진 않습니다.

입문자들을 위해 같다고 표현하지만 많이 유사하며, 언어 개념의 확장 기능에 따라 지원하는 특정기능을 부분적으로 지원하는 어셈블러가 있을 수 있습니다.

1, 2) 따라서 CPU에 따라 어셈블러는 다를 수도 있지만 구조별로 따로 옵션을 주어서 다루기도 하고, 같은 어셈블러를 쓸 수도 있습니다. 그러나 CPU에 따라 기계어는 다릅니다.

어셈블러가 하는 것은 어셈블러가 지원하는 CPU에서 실행가능한 object code 혹은 실행파일을 만드는 것이기 때문에 가상머신이 제공하는 CPU 구조를 사용하는 것이 맞습니다. 대부분 x86 가상머신을 쓰기 때문에 윈도우즈에서 만든 object 코드는 "재사용" 할 수는 있지만 linking을 못할 수 있습니다. 결론. 가상머신이 지원하는 CPU 사양에 맞춰 어셈블러를 쓰세요.

awdxawdx101의 이미지

그럼 같은 CPU ISA를 사용한다고 해도 어셈블러의 종류에 따라 어셈블리의 문법 형식이 다르게 보이는 건가요?

chanik의 이미지

생각하시는대로, 어셈블리 문법은 사용하는 어셈블러에 의해 정해집니다.
아래 페이지에 두 가지 x86 어셈블리 문법이 간략히 비교돼 있네요.

https://en.wikipedia.org/wiki/X86_assembly_language#Syntax

익명 사용자의 이미지

"CPU 종류"는 대체 무엇인가요. 예컨대

1. Intel i7 9700K와 Intel i9 9900K는 같은 종류인가?
2. Intel i7 9700K와 AMD Ryzen 7 2700X는 같은 종류인가?
3. Intel i7 9700K와 Apple A12 Vortex는 같은 종류인가?

CPU라는 건 워낙 다양한 회사에서 다양하게 디자인해서 내놓는 물건을 통칭하는 이름인지라, 어디까지를 "한 종류"로 묶을지는 애매할 수밖에 없습니다. 기술 용어를 동원한다면 jachin님의 답변처럼 ISA가 같은 코어끼리는 대체로 기계어가 같다고 말할 수 있지요. 여기서도 "ISA가 같다"라는 기준을 어떻게 세우느냐에 대한 약간의 minor detail이 남기는 합니다만...

원래 현실이라는 게 이론이나 각종 분류 기준 따위로 재단하기에는 너무 지저분한 경우가 많아서요.

그건 그렇고, 저번 질문글(https://kldp.org/node/161220)도 그렇고 컴퓨터공학 원론 수준의 질문이 요즘 올라오는 건 아무래도 학기가 시작된 것과 관련이 있는 걸까요.

댓글 달기

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