태그 보관물: assembly

assembly

학습 어셈블리는 프로그래밍에 어떤 도움이됩니까? [닫은] 무슨 일이 일어나고 있는지

저는 약 10 년 동안 더 높은 수준의 언어 (Python, C #, VBA, VB.NET)로 프로그래밍을 해왔으며 “후드”아래에서 무슨 일이 일어나고 있는지 전혀 전혀 모르고 있습니다.

학습 어셈블리의 이점이 무엇인지 궁금하며 프로그래머로서 어떻게 도움이됩니까? 더 높은 수준의 코드로 작성한 내용과 어셈블리에서 발생하는 내용 사이의 연결을 정확하게 보여줄 리소스를 제공해 주시겠습니까?



답변

실제로 어떻게 작동 하는지 이해할 수 있기 때문 입니다.

  • 함수 호출은 무료가 아니며 호출 스택이 오버플로 될 수있는 이유 (예 : 재귀 함수)를 이해합니다. 인수가 함수 매개 변수에 전달되는 방법과 수행 할 수있는 방법 (메모리 복사, 메모리 지정)을 이해합니다.
  • 메모리는 무료가 아니며 자동 메모리 관리가 얼마나 가치가 있는지 이해합니다. 기억은 당신이 “그냥 가지고있는 것”이 ​​아닙니다. 실제로 기억하고 관리해야하며, 가장 중요한 것은 잊지 말아야합니다.
  • 제어 흐름이 가장 기본적인 수준에서 어떻게 작동하는지 이해합니다.
  • 더 높은 수준의 프로그래밍 언어로 된 구문을 더 높이 평가할 것입니다.

결론은 C # 또는 Python으로 작성한 모든 내용이 컴퓨터가 실행할 수있는 일련의 기본 동작으로 변환되어야한다는 것입니다. 클래스, 제네릭 및 목록 이해 측면에서 컴퓨터를 생각하기는 쉽지만 고급 프로그래밍 언어로만 존재합니다.

우리는 정말 멋져 보이지만 저수준의 일을하는 것으로 잘 번역되지 않는 언어 구조를 생각할 수 있습니다. 그것이 실제로 어떻게 작동하는지 알면 왜 일이 그 방식대로 작동하는지 더 잘 이해할 수 있습니다.


답변

“후드에서 발생하는”항목과 포인터 작동 방식 및 레지스터 변수 및 아키텍처 (메모리 할당 및 관리, 매개 변수 전달 (값 / 기준) 등)의 의미에 대한 이해를 돕습니다.

C를 빠르게 살펴 보려면 어떻습니까?

#include <stdio.h>

main()
{
  puts("Hello World.");
  return(0);
}

gcc -S so.c다음으로 어셈블리 출력을 컴파일 하고 살펴보십시오 so.s.

 $ cat so.s

    .file   "so.c"
    .section    .rodata
.LC0:
    .string "Hello World."
    .text
.globl main
    .type   main, @function
main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $16, %esp
    movl    $.LC0, (%esp)
    call    puts
    movl    $0, %eax
    leave
    ret
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
    .section    .note.GNU-stack,"",@progbits


답변

나는 당신이 찾는 대답이 여기 있다고 생각합니다 : http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language

기사에서 인용 :

사실이지만, 다음 고객의 앱을 어셈블리로 작성하지는 않을 것입니다. 그러나 어셈블리 학습을 통해 얻을 수있는 이점은 여전히 ​​많습니다. 오늘날 어셈블리 언어는 주로 하드웨어 직접 조작, 특수 프로세서 명령어에 대한 액세스 또는 중요한 성능 문제를 해결하는 데 사용됩니다. 일반적인 용도는 장치 드라이버, 저수준 임베디드 시스템 및 실시간 시스템입니다.

문제는 사실 더 복잡한 고급 언어가되고 ADT (추상 데이터 형식)가 많을수록 이러한 옵션을 지원하기 위해 더 많은 오버 헤드가 발생한다는 것입니다. .NET의 경우 아마도 부풀어 오른 MSIL 일 것입니다. MSIL을 알고 있다고 상상해보십시오. 이곳은 어셈블리 언어가 빛을 발하는 곳입니다.

어셈블리 언어는 프로그래머가 얻을 수있는만큼 프로세서에 가깝기 때문에 잘 설계된 알고리즘이 타 오르고 있습니다. 어셈블리는 속도 최적화에 좋습니다. 모든 것이 성능과 효율성에 관한 것입니다. 어셈블리 언어를 사용하면 시스템 리소스를 완벽하게 제어 할 수 있습니다. 어셈블리 라인과 마찬가지로 단일 값을 레지스터로 푸시하고 메모리 주소를 직접 처리하여 값이나 포인터를 검색하는 코드를 작성합니다.

어셈블리로 쓰려면 프로세서와 메모리가 어떻게 작동하여 “일이 발생하도록”하는지를 정확히 이해해야합니다. 어셈블리 언어는 암호화되어 있으며 응용 프로그램 소스 코드 크기는 고급 언어의 코드보다 훨씬 큽니다. 그러나 그것에 대해 실수하지 마십시오. 시간을 내고 어셈블리를 마스터하려는 노력을 기울이면 더 나아질 것이며 현장에서 눈에 띄게됩니다.

또한이 책은 컴퓨터 아키텍처의 단순화 된 버전을 가지고 있기 때문에이 책을 추천합니다. 컴퓨팅 시스템 소개 : 비트 및 게이트에서 C 및 그 너머로, Austin Sanjay J. Patel의 텍사스 대학교 (University of Texas)의 2 / e Yale N. Patt, 어 바나 / 샴페인 일리노이 대학교


답변

내 겸손한 의견으로는 별로 도움이되지 않습니다.

나는 x86 어셈블리를 매우 잘 알고있었습니다. 내 과정에서 어셈블리가 나타 났을 때 약간 도움이되었고 인터뷰 중에 한 번 나타 났으며 컴파일러 (Metrowerks)가 잘못된 코드를 생성했음을 증명하는 데 도움이되었습니다. 컴퓨터가 실제로 어떻게 작동하는지는 매혹적이고, 나는 그것을 배운 것에 대해 지적으로 부유하다고 느낍니다. 당시에 노는 것도 재미있었습니다.

그러나 오늘날의 컴파일러는 거의 모든 코드에서 거의 모든 사람보다 어셈블리를 생성하는 것이 좋습니다. 컴파일러를 작성하거나 컴파일러가 옳은 일을하고 있는지 확인하지 않는 한, 아마도 배우면서 시간을 낭비하고있을 것입니다.

C ++ 프로그래머가 여전히 유용하게 묻는 많은 질문은 어셈블리를 아는 것으로 알려집니다. 예를 들어 : 스택 또는 힙 변수를 사용해야합니까? 값이나 const 참조로 전달해야합니까? 그러나 거의 모든 경우에있어서, 이러한 선택은 계산 시간 절약이 아닌 코드 가독성에 기초하여 이루어져야한다고 생각합니다. 예를 들어 변수를 범위로 제한 할 때마다 스택 변수를 사용하십시오.

저의 겸손한 제안은 소프트웨어 디자인, 알고리즘 분석 및 문제 해결과 같이 실제로 중요한 기술에 초점을 맞추는 것입니다. 큰 프로젝트를 개발 한 경험이 있으면 직관력이 향상되어 어셈블리를 아는 것보다 훨씬 가치가 높아집니다.


답변

작업중인 시스템의 한 단계 ‘더 깊은’에 익숙해야합니다. 한 번에 너무 멀리 건너 뛰는 것은 나쁘지 않지만 원하는만큼 도움이되지 않을 수 있습니다.

고급 언어의 프로그래머는 하위 언어를 배워야합니다 (C는 훌륭한 선택입니다). 컴퓨터가 객체를 인스턴스화하거나 해시 테이블 또는 세트를 만들도록 지시 할 때 덮개 아래에서 진행되는 일을 이해하기 위해 어셈블리에 이르기까지 모든 과정을 진행할 필요는 없지만 코딩 할 수 있어야합니다 그들.

Java 프로그래머의 경우 C를 배우면 인수를 전달하여 메모리 관리에 도움이됩니다. C로 광범위한 Java 라이브러리를 작성하면 Set의 구현을 사용할 때 (해시를 원하십니까? 또는 트리를 원하십니까?) 스레드 환경에서 char *를 처리하면 String을 변경할 수없는 이유를 이해하는 데 도움이됩니다.

다음 단계로 … AC 프로그래머는 어셈블리에 어느 정도 익숙해야하며 어셈블리 유형 (내장 시스템 상점에서는 찾을 수 없음)은 게이트 레벨에서 사물을 이해하는 데 도움이 될 것입니다. 게이트를 다루는 사람들은 양자 물리학을 알아야합니다. 그리고 양자 물리학 자들은 여전히 ​​다음 추상화가 무엇인지 알아 내려고 노력하고 있습니다.


답변

알고있는 언어로 C 또는 C ++에 대해서는 언급하지 않았으므로 어셈블리에 대해 생각하기 전에 잘 배우는 것이 좋습니다. C 또는 C ++는 관리되는 언어로 완전히 투명한 모든 기본 개념을 제공하며이 페이지에서 언급 된 대부분의 개념을 실제 프로젝트에서 사용할 수있는 가장 중요한 언어 중 하나로 이해합니다. 그것은 당신의 프로그래밍 기술에 진정한 부가 가치입니다. 어셈블리는 매우 특정한 영역에서 사용되며 C 또는 C ++만큼 유용하지는 않습니다.

또한 관리되지 않는 언어의 작동 방식을 이해하기 전에 어셈블리로 뛰어 들지 말아야한다고 말하고 싶습니다. 그것은 거의 의무적 인 독서입니다.

더 나아가려면 어셈블리를 배워야합니다. 언어의 각 구문이 정확히 어떻게 생성되는지 알고 싶습니다. 정보를 제공하지만 완전히 다른 수준의 복잡성입니다.


답변

언어를 잘 알고 있다면 최소한 한 단계의 추상화 수준으로 기술에 대한 기본 지식이 있어야합니다.

왜? 일이 잘못되면 기본 메커니즘에 대한 지식을 통해 이상한 문제를 훨씬 쉽게 디버깅하고 자연스럽게 더 효율적인 코드를 작성할 수 있습니다.

예를 들어 Python (/ CPython)을 사용하여 이상한 충돌이나 성능 저하를 시작하면 C 코드를 디버깅하는 방법에 대한 지식은 참조 계산 메모리 관리 방법에 대한 지식과 마찬가지로 매우 유용 할 수 있습니다. 이것은 또한 C 확장으로 무언가를 쓸 때 / 그렇다면 알 수 있도록 도와줍니다.

이 경우 귀하의 질문에 대답하기 위해 어셈블리에 대한 지식은 실제로 숙련 된 Python 개발자에게 도움이되지 않습니다 (추상화에 너무 많은 단계가 내려갑니다 .Python에서 수행 한 작업은 많은 어셈블리 명령을 초래합니다)

그러나 C에 익숙한 경우 “다음 단계 아래로”(어셈블리)를 아는 것이 실제로 유용 할 것입니다.

마찬가지로 CoffeScript를 사용하는 경우 Javascript를 아는 것이 (매우) 유용합니다. Clojure를 사용하는 경우 Java / JVM에 대한 지식이 유용합니다.

이 아이디어는 프로그래밍 언어 외부에서도 작동합니다. 어셈블리를 사용하는 경우 기본 하드웨어가 작동하는 방식에 익숙해지는 것이 좋습니다. 웹 디자이너 인 경우 웹 응용 프로그램이 어떻게 구현되는지 아는 것이 좋습니다. 당신이 자동차 정비공이라면, 물리학에 대한 지식을 가지고있는 것이 좋습니다