IT story

어셈블리 코드 대 머신 코드 대 객체 코드?

hot-time 2020. 4. 29. 08:12
반응형

어셈블리 코드 대 머신 코드 대 객체 코드?


객체 코드, 기계 코드 및 어셈블리 코드의 차이점은 무엇입니까?

차이점을 시각적으로 보여줄 수 있습니까?


머신 코드 는 CPU에서 직접 실행할 수있는 이진 (1 및 0) 코드입니다. 텍스트 편집기에서 컴퓨터 코드 파일을 열 수 있다면 당신은 인쇄 할 수없는 문자를 포함, 쓰레기를 볼 것입니다 (아니, 인쇄 할 수없는 문자)).

객체 코드 는 아직 완전한 프로그램에 연결되지 않은 기계 코드의 일부입니다. 완성 된 제품을 구성하는 특정 라이브러리 또는 모듈의 기계 코드입니다. 또한 완료된 프로그램의 기계 코드에서 찾을 수없는 자리 표시 자 또는 오프셋이 포함될 수도 있습니다. 링커는 연결 모든 것을 함께 이러한 자리하고 오프셋을 사용합니다.

어셈블리 코드 는 일반 텍스트이며 사람이 읽을 수있는 사람이 읽을 수있는 소스 코드이며 대부분 기계 명령과 함께 직접적인 1 : 1 아날로그를 갖습니다. 이것은 실제 명령, 레지스터 또는 기타 리소스에 니모닉을 사용하여 수행됩니다. 예는 다음 JMPMULT는 CPU의 점프와 곱셈 지침. 머신 코드와 달리 CPU는 어셈블리 코드를 이해하지 못합니다. 일반적으로 CPU 명령어에서 더 추상화 된 고급 프로그래밍 언어와 관련된 컴파일러를 생각하지만 어셈블러 또는 컴파일러를 사용하여 어셈블리 코드를 기계로 변환 합니다.

완전한 프로그램을 구축 하려면 어셈블리 또는 C ++과 같은 고급 언어로 프로그램의 소스 코드작성해야 합니다. 소스 코드는 객체 코드로 어셈블 (조립 코드) 또는 컴파일 (상위 언어 용)되며, 개별 모듈은 서로 연결되어 최종 프로그램의 기계 코드가됩니다. 매우 간단한 프로그램의 경우 연결 단계가 필요하지 않을 수 있습니다. IDE (통합 개발 환경)와 같은 다른 경우에는 링커와 컴파일러가 함께 호출 될 수 있습니다. 다른 경우에는 복잡한 make 스크립트 또는 솔루션 파일을 사용하여 최종 애플리케이션을 빌드하는 방법을 환경에 알려줄 수 있습니다.

다르게 동작하는 해석 된 언어있습니다 . 해석 된 언어는 특수 통역사 프로그램의 기계어 코드에 의존합니다. 기본 레벨에서 인터프리터는 소스 코드를 구문 분석하고 명령을 새 기계 코드로 즉시 변환하여 실행합니다. 런타임 환경 또는 가상 머신 이라고도하는 최신 통역사 는 한 번에 소스 코드의 전체 섹션을 평가하고 가능한 경우 캐싱 및 최적화하고 복잡한 메모리 관리 작업을 처리하는 것이 훨씬 더 복잡합니다. 해석 된 언어는 어셈블리 코드와 유사한 하위 수준의 중간 언어 또는 바이트 코드로 사전 컴파일 될 수도 있습니다.


다른 답변은 차이점에 대한 좋은 설명을 제공했지만 시각적으로도 요청했습니다. 다음은 C 코드에서 실행 파일로 이동하는 과정을 보여주는 다이어그램입니다.


어셈블리 코드는 사람이 읽을 수있는 기계 코드 표현입니다.

mov eax, 77
jmp anywhere

머신 코드는 순수한 16 진 코드입니다.

5F 3A E3 F1

객체 파일에서와 같이 객체 코드를 의미한다고 가정합니다. 이것은 링커가 채울 수 있도록 점프가 매개 변수화되는 것과 다른 기계 코드의 변형입니다.

어셈블러는 어셈블리 코드를 머신 코드 (객체 코드)로 변환하는 데 사용됩니다. 링커는 여러 객체 (및 라이브러리) 파일을 링크하여 실행 파일을 생성합니다.

한때 순수한 16 진수 (어셈블러를 사용할 수 없음)로 어셈블러 프로그램을 작성했습니다. 운 좋게도 이것은 오래된 (고대) 6502에서 돌아 왔습니다.


8B 5D 32 기계 코드입니다

mov ebx, [ebp+32h] 조립이다

lmylib.so containing 8B 5D 32 is object code


One point not yet mentioned is that there are a few different types of assembly code. In the most basic form, all numbers used in instructions must be specified as constants. For example:

$1902: BD 37 14 : LDA $1437,X
$1905: 85 03    : STA $03
$1907: 85 09    : STA $09
$1909: CA       : DEX
$190A: 10       : BPL $1902

The above bit of code, if stored at address $1900 in an Atari 2600 cartridge, will display a number of lines in different colors fetched from a table which starts at address $1437. On some tools, typing in an address, along with the rightmost part of the line above, would store to memory the values shown in the middle column, and start the next line with the following address. Typing code in that form was much more convenient than typing in hex, but one had to know the precise addresses of everything.

Most assemblers allow one to use symbolic addresses. The above code would be written more like:

rainbow_lp:
  lda ColorTbl,x
  sta WSYNC
  sta COLUBK
  dex
  bpl rainbow_lp

The assembler would automatically adjust the LDA instruction so it would refer to whatever address was mapped to the label ColorTbl. Using this style of assembler makes it much easier to write and edit code than would be possible if one had to hand-key and hand-maintain all addresses.


Source code, Assembly code, Machine code, Object code, Byte code, Executable file and Library file.

All these terms are often very confusing for most people for the fact that they think they are mutually exclusive. See the diagram to understand their relations. The description of each term is given below.


Types of code


Source code

Instructions in human readable (programming) language


High-level code

Instructions written in a high level (programming) language
e.g., C, C++ and Java programs


Assembly code

Instructions written in an assembly language (kind of low-level programming language). As the first step of the compilation process, high-level code is converted into this form. It is the assembly code which is then being converted into actual machine code. On most systems, these two steps are performed automatically as a part of the compilation process.
e.g., program.asm


Object code

The product of a compilation process. It may be in the form of machine code or byte code.
e.g., file.o


Machine code

Instructions in machine language.
e.g., a.out


Byte code

Instruction in an intermediate form which can be executed by an interpreter such as JVM.
e.g., Java class file


Executable file

The product of linking proccess. They are machine code which can be directly executed by the CPU.
e.g., an .exe file.

Note that in some contexts a file containing byte-code or scripting language instructions may also be considered executable.


Library file

Some code is compiled into this form for different reasons such as re-usability and later used by executable files.


Assembly code is discussed here.

"An assembly language is a low-level language for programming computers. It implements a symbolic representation of the numeric machine codes and other constants needed to program a particular CPU architecture."

Machine code is discussed here.

"Machine code or machine language is a system of instructions and data executed directly by a computer's central processing unit."

Basically, assembler code is the language and it is translated to object code (the native code that the CPU runs) by an assembler (analogous to a compiler).


I think these are the main differences

  • readability of the code
  • control over what is your code doing

Readability can make the code improved or substituted 6 months after it was created with litte effort, on the other hand, if performance is critical you may want to use a low level language to target the specific hardware you will have in production, so to get faster execution.

IMO today computers are fast enough to let a programmer gain fast execution with OOP.


Assembly is short descriptive terms humans can understand that can be directly translated into the machine code that a CPU actually uses.

While somewhat understandable by humans, Assembler is still low level. It takes a lot of code to do anything useful.

So instead we use higher level languages such as C, BASIC, FORTAN (OK I know I've dated myself). When compiled these produce object code. Early languages had machine language as their object code.

Many languages today such a JAVA and C# usually compile into a bytecode that is not machine code, but one that easily be interpreted at run time to produce machine code.

참고URL : https://stackoverflow.com/questions/466790/assembly-code-vs-machine-code-vs-object-code

반응형