어셈블리 공부 하세요?

gurugio의 이미지

저는 어셈러브라고 작은 어셈블리 스터디 사이트를 운영하고 있습니다.

그런데 제 주위 분들이 왜 어셈블리를 공부하냐고 물어보면

뭐라 답하기가 곤란할때가 많습니다.

가장 큰 이유는 신기하고 즐겁기 때문이고

다른 언어나 이론을 배울때 도움이 되기 때문이지만

어셈블리를 모르는 분들한테 아무리 설명해봐야 이해를 못하시거든요.

어셈블리는 거의 죽어가는 언어라고는 하지만

의외로 어셈블리를 공부한다고 하면 굉장히 어려운걸 하려고 한다는 듯이

보시더라구요... 알고보면 다른 언어에 비해 어렵지도 않은데 말이죠.

리눅서 여러분들은 어셈블리 공부하시나요?

왜 하시나요? 어떻게 하시는지도 말씀해주시면 감사하겠습니다.

.. 실은 제 사이트에 초보 강좌를 쓰려고 하는데 어떤 시각으로 써야할지 몰라서

조언을 좀 얻고자 글을 씁니다. 게시판 성격에 안맞으면 삭제하겠습니다. )

Necromancer의 이미지

저는 개인적으로는 내부가 안보이는 프로그래밍은 별루입니다.
노가다 해서라도 내부를 마음껏 뒤집고 다니는게 좋더군요.
어셈블리 손댄게 이때문인데... 486시절에 dos extender만든답시고 열나게
삽질하고 기계어 코드 덤프까지도 떠봤고(MASM 5.0이었었는데 이넘은
lgdt 명령어의 기계어 코드를 이상하게 만들더군요.)
인터넷 없던 시절에 통신망 자료실에 돌아다니던 ralf brown의 문서와
인텔 메뉴얼을 우연히 수집했던 기억도... (상당히 도움되는 문서입니다.)

어셈블리 모르면.... 간단히 말하자면
컴퓨터가 내부적으로 돌아가는 원리를 모른다는거나 마찬가지입니다.

고급언어들을 보면 하드웨어 동작방식에 대한 부분을 적당히 혹은 완전히
가려버리고, 대신 그 언어 나름대로의 철학이 문법이나 여러가지 요소에
반영되어 있죠. (물론 이들 철학의 공통점을 말한다면 어느정도 사람의 생각과 맞게
되어 있어서, 어셈블리보다 더 빠른 플밍 속도를 보장합니다. 어느 고급언어이든
다 마찬가지.)

Written By the Black Knight of Destruction

rOseria의 이미지

그다지 프로그래밍 많이 배운 것은 아니지만, 어셈을 조금 배운 적이 있습니다. ( 사실 깊게 배운건 아니지만요 ) 하지만, 어셈을 조금이라도 배웠기 때문에 CPU 내부 구조라던가 세부적인 동작과정에 대해서 더 잘 이해할 수 있었다고 생각하거든요.

그리고, 또 세세한 디버깅 할 때 .. 어셈을 아는 것과 모르는 것은 차이가 날 거구요, 최적화라던가 그런 부분에서 인라인 어셈블리를 쓸 수 있다면 더 좋을 것이라고 생각합니다.

CPU가 기계어로 동작하는 한, 어셈을 배우는 것은 - 능숙하게 쓸 정도는 아니라도 - 프로그래머로서 필요한 필수 교양과목은 되지 않을까 합니다.

----
한 발자국, 한 발자국 - 언젠가는 도약하리라 ~

anfl의 이미지

처음엔 의도적으로 배웠습니다. 밑바닥 부터 알고 싶어서...
printf("1+2=%d", 1+2); 에서 어떻게 1+2의 결과가 3이 나올수 밖에 없는가가 궁금했습니다.
그러다가 한동안 손을 놓고 고급언어(C,C++)를 탐닉하던 시절이 있었지요.
그때 어셈을 조금안다는것이 언어와 시스템을 이해하는데 도움이 된다는걸 깨달았습니다.
그리고나서 다시 어셈을 본격적으로 배우기 시작했습니다.
어셈을 배운것이 두고 두고 도움될것 같았고, 밑바닥부터 알고 싶었습니다.

지금 생각해보면 그때의 선택이 현명했다는 생각이 듭니다.
커널소스를 이해한다던지, 디버깅을 할때 그때 배워둔덕분으로 일을 쉽게 쉽게 해결할수 있다고 느낍니다.

초보자를 위한 강좌를 여신다고 하시니 말씀드리고 싶은것은 무엇보다 동기유발이 중요하다고 생각합니다.
제 주위의 사람들도 어셈을 왜 배우냐고 질문할때가 많습니다. 필요성을 못느끼는것이지요.
그리고 실제 어셈을 모른다고 해서 크게 불편할것도 아쉬울것도 없습니다.
어셈을 어셈이라는 랭귀지에만 촛점을 맞출게 아니라 어셈을 앎으로 해서 얻어지는 더 큰것들에 촛점을 맞추어 동기유발을 시키는것이 좋을것 같다고 생각합니다.


zeroness의 이미지

프로그래머의 달인이 되고 싶은가?
운영체제를 만들어 보고 싶은가?
CPU의 동작 메커니즘을 손금 들여다보듯 보고 싶은가?
컴퓨터에 관한한 지존의 자리에 오르고 싶은가?
진정한 해커가 되고 싶은가??
등등....
또 있습니당~~
컴터가 따분하고 심심하게 느껴지는가?? ㅋㅋㅋ
밤에 잠이 안오는가?? ㅎㅎㅎ

인간에게 있어 열정은 둘도없이 소중한 것이다. 경력이나 학력보다도... - 월리엄 록펠러 1세 -

markboy의 이미지

처음에는 최적화 문제로 공부했었고요. (대충 8년전쯤 일입니다. 지금 생각해도 무모한 일이었지요. :) )

지금은 가끔 SoftIce나 WinDBG로 디버깅할때 유용하게 쓰고 있습니다. :)

jobc42의 이미지

잘 안열리는데
일시적인 현상인가요;

written by suup

elpaso의 이미지

저도 초보인데...어셈강좌 배우고 싶습니다. 싸이트 주소라도... :oops:

士別三日 卽當刮目相對

함기훈의 이미지

elpaso wrote:
저도 초보인데...어셈강좌 배우고 싶습니다. 싸이트 주소라도... :oops:

http://www.asmlove.co.kr/

사실 저도 기대중.. ^^;

간다.

멈출까 나아갈까
망설이고 있을 때에는
나아가라고 배웠다.

함기훈의 이미지

음.. 뭔가 "예제"를 가지고 하는건 어떨까요? ^^;
대개 책들이 잔뜩 기본설명 해준다음에 그에 관련된
조그마한 예제들(좀 재미없는)로 지면을 채우는데..

"Perl 제대로 배우기" 같은 것에서는 작은 프로그램을
점점 더 크게 이거저거 되게 키워나가는 식으로 되어있어서
꽤 호기심이 가더군요 ^-^

이런 방식이 가능하다면.. 재미있을 것 같습니다. ;)

간다.

멈출까 나아갈까
망설이고 있을 때에는
나아가라고 배웠다.

gurugio의 이미지

지금 계획은 이렇습니다.

문법에 대해서는 다루지 않으려고 합니다.

mov 를 어떻게 쓰고 add는 뭐고.. 이런거는 책도 많고

이미 나온 강좌도 많거든요.

지금 윈도우즈에서 어셈블리 코딩에 관해 인라인이나 MMX나

윈도우즈 SDK 프로그래밍에 대해서 번역도 하고 강좌도 쓰고 있습니다.

지금은 80386 프로그래머 레퍼런스 메뉴얼을 번역중인데요

명령어 설명 부분하고 지금은 사용안하는 부분들 빼고 백페이지정도

번역하고 있습니다.

도스 어셈블리 예제는 이미 기초부터 좀 긴거까지 제가 공부하면서 만들고

정리한게 있고요.

그래서 도스 어셈블리 예제에서 시작해서 시피유 구조, 윈도우즈에서 사용하기,

인라인과 MMX로 실제 프로젝트에서 적용하기까지 기획하고 있습니다.

이미 써논게 있으니까 잘하면 이번 달 내로 어느정도 결과물이 나올것 같습니다.

근데.. SSE2는 저같은게 손대볼 수준이 아니라서... oops

동기유발이 무척 중요할것 같습니다.. 동기유발... 고민해볼 문제인것 같습니다.

여러분 정말 감사합니다.

codebank의 이미지

초기 어셈블리를 배울때는 거의 강요에 의해서 뜻도 모르고 배웠죠.
점수를 주는 과목이었지만 별도움은 안됐었던걸로 기억합니다.
이유가 IBM 380인가의 머신 어셈이었기에 활용해볼 수도 테스트해 볼 수도
없었거든요. 개인적으로 작동도 안되는 코드들은 정말 싫어합니다. :-)
그후에 마우스의 움직임 이라든가 모니터로의 빠른 접근들 때문에 IBM PC용
어셈을 배웠는데 이건 진짜 재미있게 배운것 같네요. 물론 필요한 부분만을
사용하기위해서 수박겉할기식으로 배운것이지만...
그래도 같이 공부하던 친구들이 허르미 소스를 고쳐가면서 만든 라이브러리는
상당한 속도를 가지고 있었죠.
그 후에는 취직을해서 하드웨어를 제어하는 부분에서 인라인 어셈을 C에 포함
시켜서 사용했고 시대의 흐름에 따라서 보호모드에 관련된 자료들을 보려고
386 Code를 공부한적도 있었던것 같네요.

다른 분들에게 쉽게 설명하려면 위에분들이 말씀하신것처럼 동기유발이 중요
하다고 생각합니다.
지금이야 컴퓨터들이 하도 빠르니까 별로 눈에 보이지는 않겠지만 그래도
1부터 10000까지 더하는 프로그램 같은 것부터 시작해서 어셈블리의 가장
큰 장점인 장비 제어를 설명한다면 그보다 좋은건 없다고 생각합니다.
(물론 보호모드 상에서의 장비제어는 전적으로 커널단에서 작업을해서 힘들
겠지만 Real mode상에서 장비제어하는 부분은 상당히 재미있다고 생각합
니다.)
Serial포트를 이용해서 이용하지 않는 Serial마우스에 LED를 연결하고 불을
깜빡이게 한다던지 모터를 연결해서 전진 후진등을 할수있게 한다던지하면
그것도 재미있는 공부방법이 되겠죠. :-)

------------------------------
좋은 하루 되세요.

RedPain의 이미지

gurugio wrote:
리눅서 여러분들은 어셈블리 공부하시나요?

왜 하시나요? 어떻게 하시는지도 말씀해주시면 감사하겠습니다.


전 OS를 만들어 보겠다는 일념으로 어셈블리어를 공부하고 있습니다.

요즘 들어서 하는 고민이 두가지가 있는 데요.
먼저 코딩스타일이라고나 할까요...
자주 쓰이는 명령어는 거의 몇개가 안되더군요.
mov가 사실상 대략 50%정도를 차지하구요.
push, pop, xor, cmp, jmp명령어( jmp, je, jl, jz 등등 ), call, ret, add, sub, lea, inc, dec, rep, movsw, 또 지금 생각이 안나는 몇개의 명령어들이 대부분을 차지하고 있습니다.
이것들을 어떻게 효율적으로 쓰는가..
문법적인 문제는 대부분 이해를 했는 데 다른 언어 배울 때처럼 예제가 많은 것이 아니거든요.
다른 언어 배울 때처럼 예제가 많다면 참 좋을 텐데 말이죠..

또 전 특이하게 gas를 쓰고 있는 데요.
더더욱 자료를 찾기가 힘들군요.
nasm을 써도 되겠지만 gas에 정이가서 :)
지역 Label(이런 용어가 있는 지는 모르겠습니다만 Label이름을 다 다르게 해야 하다보니까 Label이름이 너무 길어지더라구요 )도 쓰고 싶고 지 소스코드를 나눠서 모듈로 만들어서 한 몸으로 합치고 싶은 데 그것도 안 되고..

헉..쓰다 보니 쓸 때없는 얘기만 ㅡ.ㅡ;;
좋은 하루되세요. ^_^

지나가는새의 이미지

저도 어셈러브에서 도움을 많이 받았습니다.
이자리를 빌어서 감사의 말씀을 전합니다.

저도 아직 초보를 벗어나지 못한 수준이지만, 어셈을 공부할 때의 가장 아쉬운점은

"Hello world"를 찍는데 너무 오래 걸린다는 것입니다. -_-;

물론 이걸 찍는게 (어찌보면)C만큼 쉽지 않다는건 알지만 그 과정이 너무 멀고 또 힘들다는 생각이 들더군요.

무엇보다 어셈을 공부하려는 사람들의 일차적인 욕구는 '무엇인가를 까보고 싶은' 것이라 생각됩니다.

사실 CPU 이론이나 레지스터에 관한 방대한 지식보다는 금방 무엇인가를 해 봤다는것이 더욱 어셈을 하는데 필요한 욕구를 충족해 주는것 같습니다. 아시겠지만 조금씩 하다보면 언젠가는 스스로 CPU나 레지스터에 관해 탐독하게 되는건 수순이니까요..

그리고 도스쪽의 강좌가 많던데 이번에 초보강좌를 하시게 된다면 리눅스를 이용해보시는게 어떨까요.. 조심스레 제안 합니다.

Fever Pitch!

sadpeople의 이미지

저두 가끔 한번씩 들르는 사이트인데 잘 만드셨더군요.. (저는 어셈을 전혀 모릅니다.. )
현재 MASM만 컴에 깔려 있습니다.. 이넘을 한번 써보고 싶군요..
그럼 초보강좌 부탁드립니다.

봉쥬르 라이프~~

Necromancer의 이미지

Assembly HOWTO에 간단한 예가 나와 있습니다.

시스템 콜 관련 부분은 http://linuxassembly.org 에 가보면 문서 링크가
있고요.

NASM 클론 프로젝트로 벌이는데, 이넘 어셈블리로 짜고 있죠.
요즘 게을러서 얼마 못했긴 했지만.

Written By the Black Knight of Destruction

서지훈의 이미지

C / C++ / ETCs 이런 언어들은 수학적으로 말하면...
일정하게 증명된/정의된 공식이라고 할 수가 있겠고...
Assembly는 이 공식들을 증명하는 과정이라고 하면 얘기가 쉽지 않을까요?
그렇기 때문에 지금하고 있는 일에 대해 좀 더 깊이가 있게 알고 싶고,
"왜?" 라는 질문을 자주 던지시는 분들은 이거에 빠져보고 hacking에 빠져 보면은 질문의 답들을 얻으실 수가 있을 겁니다.

그러니 Assembly는 '道' 로 가는 길이 아닌가 생각합니다^^

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);