머신 코드 프로그래밍을 배우는 데 도움이되는 자료? [닫은]


24

저는 Java에서 C ++로, C에서 프로그래밍에 이르기까지 신선하고 사랑하는 학생입니다. 나는 거꾸로 거슬러 올라가 어셈블리로 내려 가려고 생각했습니다.

그러나 놀랍게도 많은 사람들이 C만큼 빠르지 않으며 아무 소용이 없다고 말했습니다. 그들은 커널을 프로그래밍하거나 C 컴파일러를 작성하는 방법을 배우도록 제안했습니다. 내 꿈은 바이너리 (머신 코드)로 프로그래밍하거나 베어 메탈 (물리적으로 마이크로 컨트롤러 프로그래밍)을 프로그래밍하거나 바이오스 또는 부트 로더 또는 그와 같은 것을 쓰는 것을 배우는 것입니다.

많은 연구 끝에 내가 들었던 유일한 것은 16 진수 편집기 가이 시대와 시대에 찾을 수있는 기계 언어에 가장 가깝다는 것입니다. 내가 모르는 다른 것들이 있습니까? 머신 코드로 프로그래밍하는 법을 배울 수있는 자료가 있습니까? 8 비트 마이크로 컨트롤러 / 마이크로 프로세서에서 사용하는 것이 좋습니다.

질문 은 내 것과 비슷하지만 먼저 실제 학습에 관심이 있고 이론을 이해하고 싶습니다.


2
여기서 문제가 정확히 무엇입니까 ? 머신 코드로 코딩 할 수 있는지 묻는다면 아마도 "예"일 것입니다. 튜토리얼을 요청하는 경우 a) 귀하의 질문이 무엇인지 분명히 밝히십시오. 그러나 b) 건설적인 질문이 아닙니다.
ChrisF

6
C는 금속이 충분하지 않습니까?
Tom Squires

6
나는 program bare metal때마다 나는 내 서버 상자를 걷어차. 놀라운 작품!
yannis

7
더 내려가는 것을 고려한 적이 있습니까? 자신의 CPU를 해킹하십시오 : opencores.org
SK-logic

3
@ SK-logic, 예, 약 1 시간 후에 기계 코드 프로그래밍이 불가능 해집니다. 더 낫고 생산적인 아이디어는 CPU 구현으로 내려가는 것입니다. 또한 6502의 가상 버전 ( visual6502.org )과 최신 이산 논리 ( bradrodriguez.com/papers/piscedu2.htm )를 사용하여 CPU를 구성하거나이를 열망하는 사람들도 있습니다
Angelo

답변:


27

사람들 은 머신 코드로 프로그래밍하지 않습니다 (마조히즘 적이 지 않은 한). 도구를 사용하여 기계 코드 (교차 개발 도구를 포함한 컴파일러 또는 어셈블러) 또는 기계 코드를 생성하는 라이브러리 (LLVM, libjit, GNU lightning 등)를 생성합니다. 머신 코드 생성, 컴파일, 옵티 마이저 및 마이크로 아키텍처 관련 리소스도 관련이 있습니다.

그리고 종종 최적화 최적화 컴파일러는 할 수있는 것보다 더 나은 기계 코드를 생성합니다. 좋은 옵티 마이저보다 200 라인 어셈블러 코드를 더 잘 작성할 수 없을 것입니다.

기계 코드를 이해하려면 먼저 어셈블리를 학습하십시오. 머신 코드에 매우 가깝습니다. C로 (또는 Ocaml, Haskell, Common Lisp, Scala와 같은 고급 언어로) 코딩 할 수없는 것들에 대해서만 현명하게 사용하십시오. 좋은 방법은 종종 C 함수 내에서 asm명령어 (특히 GCC 확장 어셈블리 기능)를 사용하는 것입니다. 로 생성 된 어셈블리 코드를 읽는 gcc -S -O2 -fverbose-asm것도 도움이 될 수 있습니다.

리눅스 어셈블리 하우투는 읽을 수있는 좋은 일이다.

현재 프로세서의 명령어 세트 아키텍처 (즉, 칩이 이해하는 명령어 세트)는 매우 복잡합니다. 일반적인 것은 x86 (32 비트 모드의 일반 PC), X86-64 (64 비트 모드의 데스크톱 PC), ARM (스마트 폰 등 ), PowerPC 등입니다. 모두 역사적으로 경제적이기 때문에 매우 복잡합니다. 원인). 아마도 먼저 Knuth의 MMIX 와 같은 가상의 명령어 세트를 배우는 것이 더 간단합니다.


8
"사람들은 C (...)로 프로그래밍하지 않는다. 그들은 아마도 C 백엔드와 함께 현대 언어를 사용한다"
Abyx

나는 확실히 동의합니다. 현재 진행중인 프로젝트 ( MELT , gcc-melt.org 참조 )는 C로 번역 된 DSL입니다.
Basile Starynkevitch

나는 ISAs에 대한 언급을 추가했다
Basile Starynkevitch

6
만들고 어셈블러를 원하는 사람들은 어떻습니까? 머신 코드를 배우는 데는 일반적인 이유가 있지만 그 이유는 있습니다.
Jetti

명령 집합 아키텍처를 배우고 있다고 말하고 싶습니다 (조회 니모닉 사용). 정확한 명령어 인코딩을 명시 적으로 배우는 경우는 거의 없습니다 (예 : NOP가 0x90 임). 어셈블러 나 기계 코드 생성기를 작성할 때 많은 사람들이이를 알아야합니다. 마찬가지로 마찬가지로 유니 코드의 UTF8 인코딩을 마음껏 배울 필요는 없습니다.
Basile Starynkevitch

13

앞에서 언급했듯이 Learn Learn .

어셈블리 언어는 컴퓨터, 마이크로 프로세서, 마이크로 컨트롤러 및 기타 프로그래밍 가능한 장치를위한 저수준 프로그래밍 언어입니다. 지정된 CPU 아키텍처를 프로그래밍하는 데 필요한 기계 코드 및 기타 상수의 기호 표현을 구현합니다.

따라서 어셈블리는입니다 symbolic representation of machine code.

당신은 지금 "좋아요, 그래서 나는 어떻게 그 모든 것을 배우나요?" 나는 당신이 물어 너무 기뻐요 :

  1. 그것이 무엇인지 이해하십시오. 수준 이 매우 낮아서 컴퓨터에 대해 심도있게 이해할 수 있습니다. Wikipedia 로 시작한 다음 이 짧은 구절 을 읽으십시오 .
  2. 배우세요! 가장 잘 읽은 것은 아마도 어셈블리 언어의 기술어셈블리 언어 단계별입니다 : 리눅스를 이용한 프로그래밍
  3. 코딩하십시오!

나는이 다른 스레드를 읽고 있었고 나는 이것을 우연히 발견 했다고 생각한다 : programmer.s 그러나 전환을 더 쉽게하려면 어셈블리를 먼저 배워야합니다.
AceofSpades

1
고마워요, 대중의 요구에 따라 어셈블리를 배워야 할 것 같아요. +1
AceofSpades

8

목표를 재고 할 것을 강력히 권장하며 그 이유는 다음과 같습니다.

나는 BBC 마이크로 컴퓨터에서 6502 어셈블리 언어를 처음 배웠다 (모델 B, 32K). 매크로 어셈블러가 포함 된 멋진 BASIC 구현이있었습니다. 우리는 학교에 그들을 가지고 있었기 때문에 기계를 10 분 동안 사용하지 않은 경우 각 스크린을 가로 질러 각 스크린을 가로 질러 걷는 Lemming을 만들기 위해 직접 스크린 버퍼 조작과 같은 모든 종류의 장난스러운 프로그램을 작성했습니다. . 7 학년 친구들 사이에 낄낄 거림이 생겼습니다.

집에서 Commodore 64를 받았을 때 6502 어셈블리 언어를 실행하는 6510 CPU가 있지만 흥미로운 추가 기능이 있다는 것을 알게되었습니다. 나는 어셈블러를 구입하고 ( 카트리지에 와서 ) BASIC을 통해 프로그램을 호출해야했습니다. 베스트셀러 게임을 제작한다는 웅대 한 비전으로, 결국 펑키 한 칩 음악으로 애니메이션되는 흥미로운 색상 막대 효과를 수행하기 위해 비디오 디스플레이 하드웨어 레지스터를 인터럽트하여 비트 트위스트 된 여러 데모를 만들었습니다. 인상적이지만 유용하지는 않습니다.

그런 다음 ARM2 CPU가있는 Acorn Archimedes A310을 얻었으므로 BBC Micro (동일한 유산)와 같은 내장 매크로 어셈블러와 동일한 멋진 BASIC 구현을 사용했습니다. 나는 예술적인 친구가 그래픽을 제공 한 몇 가지 게임과 정현파 기반의 트리 피 데모를 만들었습니다. 이 두 가지 모두 프로그래밍하기가 어려웠으며 잘못된 코드는 시스템을 다운시킬 수 있으며 (실수로 하드웨어 리셋 레지스터 트립 등) 저장하지 않은 경우 모든 것을 잃어 버릴 수 있습니다 (플로피로!).

대학에서 저는 C ++과 C에 대해 소개했습니다.이를 사용하여 Sun / Solaris 및 다른 대형 메인 프레임 컴퓨터를 프로그래밍 할 수있었습니다. 이 머신들이 어떤 CPU 아키텍처를 사용했는지 전혀 모른다. C ++ 툴이 전문 애플리케이션을 만드는 데 필요한 힘을 줬기 때문에 어셈블러를 사용하거나 머신 코드를 읽을 필요가 없었다.

Uni 후, 나는 Windows와 여러 가지 유닉스를 작업했습니다. C와 C ++는이 모든 머신에서 작동했으며 결국 Java도 마찬가지였습니다.

그런 다음 디버깅을 위해 포괄적 인 툴 체인과 함께 DirectX와 함께 C ++을 사용하여 Windows와 Dreamcast에서 작업했습니다.

그런 다음 스마트 TV 용 ARM 기반 칩셋 (2000 년)으로 작업했습니다. ARM2에 대한 나의 경험이 여기에 관련되었을 수도 있지만 작업은 C 기반이었습니다. 아르키메데스에서 수행 한 하드웨어에 대한 모든 파킹은 간단한 비트 트위들 링 작업을 사용하여 C에서도 수행 할 수 있음을 발견했습니다. 저의 역할 중 하나는 코드베이스를 Windows, Playstation 2, Linux, 기타 TV 및 모바일 칩셋으로 마이그레이션하는 것이 었습니다. 이러한 모든 플랫폼은 C 컴파일러 (일반적으로 GCC)와 기본 시스템에 쓰는 일부 수준의 API와 함께 사용할 수있었습니다. 임베디드 세계는 거의 커널 O / S가 아닙니다. 부트 로더와 미니 BIOS를 작성하는 것 이상의 특정 플랫폼에 대한 전체 머신 코드를 알 필요가 없었습니다. 둘 다 가능한 첫 기회에 C 코드로 뛰어 들었습니다 (트랩 벡터를 설정 한 후,

다음 작업은 Windows에서 C ++, C # 및 JavaScript를 사용하는 작업이었습니다. 기계 코드가 없습니다.

현재는 C ++, JavaScript, Python, LUA, HTML 및 다양한 플랫폼에서 다른 언어로 작업하고 있습니다. 이 플랫폼이 어떤 기계 코드를 실행하는지 알 필요가 없습니다. 컴파일러는 코드를 필요한대로 변환합니다. 충돌이 발생하면 디버거 또는 런타임 진단 (예외, 신호 등)을 통해 오류가 발생합니다.

재미를 위해, 나는 집에있는 적은 여가 시간에 iOS 애플리케이션을 개발합니다. Objective-C와 여러 칩셋에서 작동하는 API를 사용합니다. 분명히 그들은 ARM 기반이지만 개발에서 어떤 기계 코드도 보지 못했습니다.

어셈블리 언어를 배우는 것은 매우 흥미 진진한 일이지만 이제는 더 높은 수준의 도구와 언어를 사용하여보다 규모가 큰 (또는 두 가지) 생산성을 높일 수 있습니다.

놀라운 어셈블리 언어 / 기계 코드 프로그래머가 이용할 수있는 직업 기회는 JavaScript, Java, C #, C ++ 또는 ObjC와 비교할 때 아주 적습니다.

나는 이것이 당신이 주요 목표가 아닌 취미 / 측면 관심사로 만들 것을 권합니다.


6
취미입니다. 나는 일이 어떻게 작동하는지에 관심이 있으며 가능한 경우 매우 기본적인 수준으로 조작하는 법을 배우고 있습니다. +1
AceofSpades

6

나의 제안? MIPS를 배우고 (간단한) MIPS 프로세서를 구축하는 방법을 배우십시오. 실제로 보이는 것보다 쉽습니다.

다른 아키텍처 중 일부에 비해 MIPS의 장점은 간단합니다. 많은 세부 사항에 얽매이지 않지만 다른 아키텍처에서 코드를 작성하는 데 필요한 모든 큰 아이디어를 계속 배울 수 있습니다.

우연히도, 이것은 내 (세번째) 인트로 CS 수업의 최종 프로젝트였습니다. 원하는 경우 과제를 읽고 강의를 통해 비디오 또는 슬라이드 로 탐색 할 수 있습니다 .

무엇보다도, 우리는 MIPS 코드를 바이너리로 설정되는 방식을 커버; 심지어 시험에서 (매우 간단한) 기계 코드를 해독해야했습니다.

모든 것을 다루고 싶지 않더라도 대부분의 강의는 학생들이 가장 좋아하는 강사 중 한 사람에 의해 진행되었으며 스스로 보는 것이 즐겁습니다.


링크와 시작 위치를 설명해 주셔서 감사합니다. +1
AceofSpades

6

저는 Java에서 C ++로, C에서 프로그래밍에 이르기까지 신선하고 사랑하는 학생입니다. 나는 거꾸로 거슬러 올라가 어셈블리로 내려 가려고 생각했습니다.

훌륭한 길입니다. C에서 어셈블리로의 나의 점프 (낙하?) 는 같은 이름 의 책 을 기반 으로 한 대학 과정 컴퓨터 구성 및 디자인 이었습니다.

파이프 라이닝 및 메모리 아키텍처를 통해 기본 MIPS 어셈블리에 대한 첫 번째 장에 대해이 책을 적극 권장합니다. 같은 주제를 중심으로 과정을 수강하거나 온라인에서 강의를 찾는 것이 더 좋습니다.

또한 MARS MIPS Simulator 를 참조 하여 손에 더러운 글씨를 쓰십시오.


4

기계가 완전히 작동하는 방식을 이해하려면 가능한 한 가장 낮은 수준으로 올라가서 현재 위치 (예 : C, C ++)까지 올라가는 것이 어떻습니까?

즉, 회로에 트랜지스터를 사용하여 자체 4 비트 가산기를 작성하지 않는 이유는 무엇입니까? (명령 / 자습서를 찾고 있다면 Google에서만)

그런 다음 약간의 RAM이있는 작은 컴퓨터를 만든 다음 어셈블리 학습을 시작하고 프로그램을 작성하십시오.


원래 포스터가 처음부터 컴퓨터를 구축하는 경우 자신의 어셈블리 를 정의 (배우는 것이 아니라 정의) 해야합니다 .
Basile Starynkevitch

@daniels 나는 진정한 저수준 비트에서 추가를 배움으로써 추론을 이해합니다. +1
AceofSpades

컴퓨터를 처음부터 새로 만드는 대안은 여전히 ​​이해하기에 충분히 간단한 Z80 또는 6502와 같은 일부 오래된 프로세서 (및 해당 어셈블리 언어)를 배우는 것입니다. 나는 당신이 놀 수있는 에뮬레이터조차 있다고 생각합니다.
조르지오

@AceofSpades Minecraft에서 CPU와 CPU 구성 요소 (예 : 가산기)를 쉽게 구축하는 가장 좋은 방법은 레드 스톤을 사용하는 것입니다. 나는 Minecraft에서 간단한 기계를 연구하기 시작했으며 컴퓨터의 이론과 논리에 대한 이해를 크게 높였습니다.
Aaron

1

나는 이것을 위해 만들어진 지침 세트, 시뮬레이터 및 기본 사항에 대한 몇 가지 자습서를 수업 당 하나의 지침 또는 개념으로 가지고 있습니다. 프로그램을 입력하고 실행 한 후 수행 내용을 익히고 다음 레슨으로 넘어가십시오.

http://www.github.com/dwelch67/lsasim

또한 몇 가지 주류 명령 세트에 대한 시뮬레이터도 있습니다. asm을 배우기 위해 사용하기에 좋은 어떤 것이 든 모두 (x86을 배우고, 마지막으로 배우고, 포크 한 것과 같은 시뮬레이터를 사용하고, 먼저 8088/86을 먼저 진행 한 다음에) 시뮬레이터에 대한 학습에는 장단점이 있으며, 시작할 때 하나의 주요 전문가는 무엇이든 충돌하지 않으며 가시성이 뛰어납니다. 새로운 명령어 세트를 배우기 위해 임베디드 플랫폼, 마이크로 컨트롤러 등으로 먼저 뛰어 들다 보면 무슨 일이 일어나고 있는지 알 수 없다는 장애물을 극복해야합니다.


1

Charles Petzold의 코드 는이 주제에 대한 아주 좋은 소개이며, 가산기, 카운터 및 RAM 배열을 구성하는 방법을 포함하여 컴퓨터를 구축하는 프로세스를 설명하고 기계 코드 및 어셈블리 언어 및 상위 언어와의 관계를 소개합니다. 또한 컴퓨팅 역사에 대한 훌륭한 기사입니다.

그리고 나는 이 질문을 electronics.stackexchange에서 읽었 습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.