어셈블리 언어를 배우는 것이 가치가 있습니까? [닫은]


97

ASM 을 배우는 것이 여전히 가치가 있습니까?

나는 그것을 조금 알고 있지만, 어셈블러에서 배운 모든 것을 C 나 C ++와 같은 언어로 1/10 시간에 할 수 있기 때문에 실제로 사용하거나 제대로 배운 적이 없습니다. 그렇다면 ASM을 정말로 배우고 사용해야합니까? 그것이 나에게 전문적으로 도움이 될까요? 내 수완이 증가할까요? 요컨대, 더 나은 프로그래머가 될 수 있을까요?

참고 : 저는 HLA (High-Level Assembler) 와 같은 것이 아니라 FASM 또는 NASM 과 같은 저수준 어셈블리에 대해 이야기하고 있습니다.


2
어셈블리 언어는 프로세서 / 컨트롤러에 연결되어 있습니다.
rmflow

7
크로스 플랫폼이 아니라는 뜻인가요? !!
ApprenticeHacker 2011


2
좋습니다. 모든 프로세서에 대해 다른 어셈블리 언어가 있습니까 ??? !!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker 2011

4
각 프로세서 제품군 에 대해 다른 어셈블리 언어 . 386 코드는 Intel 및 AMD 제품을 포함한 최신 x86 프로세서에서 실행되지만 일부 기능 세트는 고유 확장입니다. 이러한 추가 명령어 의 언어 는 동일하지만 결과 바이너리는 이식 할 수 없습니다.
spraff 2011-07-08

답변:


109

나는 Kip Irvine의 책 에서 배웠습니다 . 그의 (부적절한) 도서관에 대한 (공정한) 비판을 무시한다면, 나는 그것을 언어 자체에 대한 좋은 소개로 추천 할 수 있습니다. 정말 흥미로운 것들에 대해서는 인터넷에서 강박 관념을 찾아 내야합니다.

낮은 수준에서 일어나는 일을 이해하는 것이 유용하다고 생각합니다. 어셈블러를 연구하면서 CPU 파이프 라이닝, 분기 예측, 캐시 정렬, SIMD, 명령어 재정렬 등에 대해 배우게됩니다. 이에 대한 지식은 더 나은 고수준 코드를 작성하는 데 도움이됩니다.

게다가, 관습적인 통념은 대부분의 시간에 어셈블리를 직접 최적화하려고하지 않고 컴파일러가 그것에 대해 걱정하게하는 것입니다. 컴파일러가 생성하는 뒤틀린 것들의 몇 가지 예를 보면 왜 관습적인 통념이 유지되는지 더 잘 이해할 것입니다.

예 : LFSR은 rotate-with-carry 명령어를 사용하여 빠르게 실행됩니다. 이와 같은 특정 경우에는 컴파일러가 알아낼만큼 똑똑한 지 여부를 알아내는 것만 큼 어셈블러 버전을 작성하는 것이 쉽습니다. 때로는 컴파일러가 모르는 것을 알고 있습니다.

또한 쓰기 또는 실행, 스택 오버런 등과 같은 보안 문제에 대한 이해도를 높입니다.

약간 동시성 문제는 명령어 별 수준에서 무슨 일이 일어나고 있는지 알고있을 때만 분명해집니다.

완전한 소스 코드가없는 경우 디버깅 할 때 유용 할 수 있습니다.

호기심 가치가 있습니다. 어쨌든 가상 기능은 어떻게 구현됩니까? 어셈블러에서 DirectX 또는 COM 프로그램을 작성해 본 적이 있습니까? 큰 구조는 어떻게 반환됩니까? 호출 함수가 공간을 제공합니까? 아니면 그 반대의 경우도 마찬가지입니까?

그리고 그래픽 하드웨어를위한 특별한 어셈블리 언어가 있습니다. 비록 셰이더 언어가 몇 년 전에 고급 수준 이었지만 문제를 다른 방식으로 생각할 수있는 모든 것이 좋습니다.


7
잘 쓰여진 답변 +1. 배우는 것과 사용하는 것은 두 가지 다른 것입니다. 배우는 것은 좋은 생각입니다.
old_timer 2011

예를 들어 Linus Torvalds는 디스어셈블러를 사용하여 코드를 디버깅 하므로 x86 어셈블리에 대해 잘 알고 있다고 생각합니다.
Ivanzinho

54

나는 너무 많은 사람들이 예, 당신은 조립을 배우고 / 배워야한다고 말하기 위해 뛰어 들었다는 것이 흥미 롭다는 것을 안다. 나에게 질문은 얼마나 많은 어셈블리를 알아야합니까? 저는 여러분이 프로그래밍 언어처럼 어셈블리를 알아야한다고 생각하지 않습니다. 즉, 모든 사람이 어셈블리로 프로그램을 작성할 수 있어야한다고 생각하지 않지만 다른 한편으로는 그것을 읽고 실제로 무엇을 이해할 수 있어야합니다. (어셈블러보다 아키텍처에 대한 더 많은 지식이 필요할 수있는) 의미로 충분합니다.

확실히 어셈블리를 작성할 수는 없지만 (즉, 어셈블리에 사소하지 않은 코드를 작성할 수는 있지만) 실제 하드웨어 아키텍처에 대한 지식과 함께 읽을 수 있으며 사용되는 호출 규칙은 성능을 분석하기에 충분합니다. C ++ 코드의 어떤 부분이 해당 어셈블리의 소스인지 식별합니다.


4
기본 push, pop, mov 및 invoke 명령을 배워야한다는 뜻 입니까?
ApprenticeHacker 2011

10
동의합니다. 어셈블리를 알아야하는 필요성은 작업중인 프로그래밍 브랜치에 따라 크게 달라집니다. 웹 / 데스크톱 / 데이터베이스? 어셈블러는 잊어라. 컴퓨터 게임과 그래픽? 다소 편리 할 수 ​​있습니다. OS 개발 또는 실시간 임베디드 시스템? 필수입니다. 등등.
Lundin 2011

1
당신은 다른 대답을 잘못 표현하고 있습니다. 아무도 당신 조립 배워야 하거나 배워야 한다고 말하지 않습니다 . 질문에 따라 유용하거나 가치가 있습니다. 귀하의 답변은 여전히 ​​관련이 있습니다.
Luc Danton 2011

1
@burningprodigy : 사용하는 어셈블러에서 명령어가 어떻게되어 있는지 (즉, 인수의 순서 등)에 대한 기본적인 지식과 몇 가지 명령에 대한 매우 기본적인 이해가 있어야한다고 생각합니다. 또는 상점입니다. 그런 다음 어셈블리 조각을 살펴 봐야하는 경우 참조를 사용하여 각 지침을 이해할 수 있으며 그렇게함으로써 필요한 기본 사항을 배우기 시작할 것입니다.
David Rodríguez-dribeas 2011

1
나는 동의한다. 특히 어셈블리를 아는 것만으로도 최신 CPU의 효율성을 평가하는 데 도움이되지 않습니다. 그것이 목표라면 컴퓨터 아키텍처의 기본을 공평하게 공유하는 어셈블리에 대한 약간의 기본 지식이 훨씬 더 유용합니다. 조립이 필요한 대부분의 경우 최적화 된 프로그램의 덤프를 살펴 보거나 재미를 위해 (예 : 보안 관련 사항, 미니 커널 작성 등). 그러나 어셈블리 지식 때문에 마지막으로 설계 결정을 변경 한 때가 기억 나지 않습니다.
Voo

28

예-C 및 C ++ 개발자를위한 어셈블리를 배우는 주된 이유는 C 및 C ++ 코드의 내부에서 진행되는 작업을 이해하는 데 도움이되기 때문입니다. 실제로 어셈블리로 코드를 작성하는 것이 아니라 코드 디스 어셈블리 살펴보고 효율성을 평가할 수 있으며 다양한 C 및 C ++ 기능이 훨씬 더 잘 작동하는 방식을 이해할 수 있습니다.


24

다양한 패러다임에서 다양한 언어를 배우는 것은 가치가 있습니다. Java, C ++, C # 및 Python을 배우는 것은 모두 동일한 패러다임의 인스턴스이기 때문에 중요하지 않습니다.

어셈블리는 모든 언어의 뿌리 (근원에 가깝다)에 있기 때문에 어셈블리를 배우는 것이 가치가 있다고 말합니다.

그런 다음 다시 함수 프로그래밍 언어, 논리 프로그래밍, 스크립팅 언어, 수학 기반 언어를 배우는 것이 좋습니다. 시간이 너무 많기 때문에 골라서 선택해야합니다.


그리고 마침내 그것들을 모두 배웠고 무슨 일이 일어나고 있는지 엿볼 수 있다고 생각하면 J 를 발견 합니다.
Micha Wiedenmann

4

ASM을 아는 것은 디버깅 할 때도 유용합니다. 때로 "오류의 ASM 덤프"만 있으면되기 때문입니다.


2

당신은 어떤 용도 가 있습니까 하려는 일에 그것을 하고 있습니까? 현재하고 있거나 계획하고있는 일에 어떤 식 으로든 도움이 될 것입니까? 이것들은 여러분이 스스로에게 물어봐야 할 두 가지 질문입니다. 그에 대한 답은 여러분의 질문에 대한 답입니다.

좀 더 일반적인 의미에서 그렇습니다. 제 생각에는 asm (x86 또는 arm과 같은 것)을 배울 가치가 있다고 말하고 싶습니다. 얼마나 잘 작동하는지는 프로그래밍 내용과 디버깅 방법에 따라 다릅니다.


2

도달하려는 프로그래밍 수준에 따라 다릅니다. 디버거로 작업해야하는 경우 YES. 컴파일러가 어떻게 작동하는지 알아야한다면 YES. 어셈블러 / 디버거는 CPU에 따라 다르므로 많은 작업이 필요합니다. x86 제품군이 얼마나 크고 오래되었는지 확인하십시오.


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