내가 짜다리 가르쳐 줄 기회가 많이 없었지만(뭐 사실 아는 것도 없었지만)
내가 무슨 글을 올리던 너에게 맞추는 것이 좋다고 생각되서 이런 자리를 마련하게 되었다.
모르는거 있음 바로 물어보고 그리고 내가 글 쓴거 말고 잡다한거 걍 가져다가 붙일건데
그건 볼필요 없다. 걍 붙이는 거니까.
사실 화가한테 포토샵이던 일러스트레이터든 일반 캠버스에 붓이던 아무 필요 없듯이
프로그래머에게 툴은 그냥 툴은 뿐이라고 생각되는게 내 일반적 상식이야.
그러나 20년 넘게 코딩하다보니 툴은 중요하다는 확신이 섰어.
중요한건 시간이야. 코더, 디벨로퍼, 아키텍트 중에 제일은 전부 다하는 사람이야.
존 카멕같이.
하지만 예전에야 그런 사람이 많았다 치더라도 요즘은 그런 사람이 드물어.
프로젝트도 워낙 큰게 많고 프로그램도 방대하고 똑똑한 사람도 많아졌기 때문이지.
그러나 혼자서 멋진 사람이 될 수는 있어. 범위를 한정할 줄 알고 그것을 실행할 수 있으면 되는거지.
밤이 너무 늦어서 이만 쓰고 넘 길게 쓰면 잠오니까 간단히 요것만 쓰지뭐.
회사들어와서 trace32 안쓰고 걍 어셈만 보고 디버깅 했었는데 5시간 동안 ...
선배가 C소스랑 연결하니까 30분만에 풀리더라.
툴을 아는 것도 상당히 중요한 것 같다.
지름길을 아는 것이라고 해야 하나. ㅋㅋ
그래도 가끔 다른 아티클에 대해서 관심을 가질 필요는 있어. 말할 줄은 알아야 하니까.
요즘 우리네 관리자들이 많이 하는 방식이지. 코딩 한줄 못하지만 들은 건 많아가지고
말한 것만 쌓은 모래성 같은 지식으로 사람을 컨트롤하는....
끝내기 전에 어셈블리어에 관해 간단히 말하자면.
어셈에 관한 글이 많은데 사실
기계어를 역 번역한게 어셈블리어다. 기계어랑 1대1 매칭이 되는 유일한 언어이지.
한 때 여기에 매진한 적이 있는데 뭐 사실 지금도 보안에 관심이 없는 건 아니지만.
기계어랑 1:1 되는 유일한 언어기 때문에 언젠가는 쓰이니까 담에 offline으로 갈쳐줄께~
창조하는게 더 재미있다는 사실을 안 뒤로는 게다가 어셈은 너무 생산성이 부족해서 :)
깊이 파려면 고급 언어를 하는게 여러모로 좋다는 결론을 내렸지(20년 이상 걸렸나 ㅋㅋ)
T자형 인재를 원하는 세상이니 모르는 것 보단 아는게 좋다.
밑에건 다 펀거.
[전광성의 어셈블리어 이해하기:1회] 어셈블리어를 배우기 위한 기본개념 (1) (1) : 어셈블리어를 배우기 위한 기본개념 (1) |
중학생 시절, 내가 C언어 책을 사서 공부하는 것을 보고 나의 친형이 경쟁심에 더 어려운 것을 해보겠다며 어셈블리어 책을 샀던 것이 기억난다. 형은 앞에만 조금 읽다가 재미없다고 책을 덮어버린 적이 있었다. 어셈블리어를 제대로 배워보겠다는 생각은 가져보았으나, 재미가 없어서 포기하는 경우가 많다. 어셈블리어를 배우다가 가장 장애가 되는 것은 ‘이런 것을 내가 왜 배울까?’ 하는 생각일 것이다. 어셈블리어를 배운다는 것은 단지 언어를 배울 뿐만 아니라, 기초적인 컴퓨터 구조의 원리를 익히는 과정이다. 정 지루하다면, 다른 프로그래밍 언어를 어셈블리어로 구현할 때 어떻게 해야 할지 상상해 가며 강좌를 읽어주기 바란다. 물론 하드웨어를 하는 분이시라면 굳이 그런 의문이 없을 테지만. 본 회에서는 매우 기본적인 개념을 다룬다. 컴퓨터관련 자격증 필기시험을 한번이라도 보았다면, 쉽게쉽게 이해할 수 있을 것이다. 그렇지 않더라도, 상식선에서 해결될 내용이니 걱정할 필요 없다. 부담없이 강좌를 봐주길 바란다. 어셈블리어와 고급언어의 구체적인 차이는 <표1>에 설명해 놓았다.
공부를 하다가 중간에 모르는 것이 생기면 일단은 그곳에 물음표를 달아놓고 지나가면 된다. 더 진도를 나간 후 다시 보면 이해할 수 있는 경우가 대부분이기 때문이다. 컴퓨터가 자료를 어떻게 표현하는지를 알려면 우선 이진수를 빼놓을 수가 없다. ‘컴퓨터는 0과 1밖에 모른다’라는 말은 한번 쯤 들어 보았을 것이다. 그렇다. 정말로 컴퓨터는 0과 1밖에 모른다. 우리가 고급언어로 프로그래밍 할 때는 컴퓨터가 0과 1밖에 모른다는 것이 그다지 와 닿지 않을 수도 있다. 대부분의 고급 언어는 이진 연산은 제공해도, 이진수를 직접 상수로 사용할 수 없다. 하지만 어셈블리어는 이진수를 직접적으로 제어할 수 있고, 이진수를 직접 상수로 사용할 수 있다. 그만큼 다른 언어보다 이진수를 가까이 하고, 이진수 차원의 제어를 필요로 하는 언어가 어셈블리어이다. 10진수는 0~9까지의 열 가지 숫자를 이용하여 숫자를 표현한다. 반면 이진수는 0~1까지의 두 가지 숫자만을 이용하여 숫자를 표현하는 것이다. 이진수의 한 예를 보여주겠다. (15) (0) 1011001010011100위에 괄호로 쓴 숫자는 무엇일까? 각각의 숫자에 번호를 매긴 것이다. 그 각각의 숫자 하나를 ‘비트(bit)'라고 한다. 위에 있는 이진수는 몇자리 숫자일까? 그렇다. 16자리 숫자이다. 그렇기 때문에 위의 이진수를 컴퓨터로 표현할 때는 16bit라고 한다. 16자리니까 16비트인 것이다. 비트에 숫자를 매긴 것을 다시 보자. 15는 맨 왼쪽, 그러니까 제일 높은 자리수를 나타내고 ’비트15‘라고 부른다. 또 이 숫자에서 제일 높은 자리 숫자이기 때문에 '최상위 비트' (MSB: Most Significant Bit)라고 한다. 한글로 하면 ’최상위 비트‘이다. 0은 맨 오른쪽의, 그러니까 제일 낮은 자리수를 나타내고 ’비트0‘이라고 부른다. 또 이 숫자에서 제일 낮은 자리 숫자이기 때문에 '최하위 비트' (LSB: Least Significant Bit)라고 한다. 한글로 하면 ’최하위 비트‘이다. 갑자기 많은 개념이 들어가서 헷갈리는가? 걱정말기 바란다. 나중에 나오면 다시 설명해 줄 것이다. 제공 : 코리아인터넷닷컴, a 2004년 11월 10일 |
[전광성의 어셈블리어 이해하기:1회] 어셈블리어를 배우기 위한 기본개념 (2) (2) : 어셈블리어를 배우기 위한 기본개념 (2) |
우선은 2진수를 어떻게 10진수로 변환하는지 알아보자. ㅁㅁㅁㅁ ㅁㅁㅁㅁ 이렇게 8비트의 이진수가 있다고 하자. 아까 비트에 번호붙였던 것이 기억나는가? 8비트니까 맨 왼쪽이 비트7, 맨 오른쪽이 비트 0이다. 10진수로 변환하려면 비트7 * (2의7승) + 비트6 * (2의 6승) + 비트5 * (2의 5승) + 비트6 * (2의 6승) + ... + 비트1 * (2의 1승) + 비트0 * (2의 0승)이렇게 하면 된다. 그런데 가만보자... 비트0이든 비트1이든 한 비트는 0 아니면 1이다. 그럼 조금 바꿔서 생각하면... 비트가 1인 자리수만 더해주면 된다. 0은 뭘 곱해도 0이 될테니까 덧셈에 아무런 도움을 주지 않을 것이다. 그렇다면 아예 (2의 □승)에 대한 표를 만들고 그것을 보고 변환하는 게 편할 것이다. 하지만 굳이 표를 그리진 않겠다. 왜냐하면 별 쓸모가 없기 때문이다. 2진수는 너무 공간을 많이 차지해서 대부분 16진수로 변환해서 사용한다. 16진수는 또 무엇일까? 후에 설명하도록 하겠다. 일단은 진법을 변환하는 개념에 대해서만 알면 된다. 이번엔 역으로 10진수를 2진수로 변환하는 방법을 알아보겠다. 방법을 직접 설명하기엔 너무 비효율적이므로 하나의 예를 들겠다. 37을 2진수로 표현해 보자.
다음은 저장 크기다. 저장크기라고? 몇 자리, 즉 몇 비트로 숫자를 표현하느냐에 따라 얼마나 큰 숫자를 저장할 수 있는지가 달라질 것이다. 당연히 많은 자릿수, 즉 많은 비트로 숫자를 표현하면 더 큰 숫자를 표현할 수 있다. 인텔 CPU에서 사용할 수 있는 부호없는 정수의 저장 크기는 다음 그림과 표에 정리해 놓았다. <그림 1 : 데이터형과 그 크기>
아까 알려주기로 했던 16진수에 대해 알아보자. 16진수는 0~9와 A~F까지의 16가지 문자를 이용하여 숫자를 표현하는 것이다. 각각 A는 10을, B는 11을, C는 12를, D는 13을, E는 14를, F는 15를 의미한다.
A6(16진수) = 1010 0110 (2진수) 2진수에서 가운데 공백을 넣은 것은 네글자씩 끊어서 보기 편하게 하려고 한 것이다. A는 10을 나타낸다고 아까 말했다. 2진수에서 상위 네 비트를 10진수로 바꿔보자. 10이 된다. 아까 A가 1010과 같다는 뜻이 된다. 뭔가 눈치를 챘을 것이다. 2진수에서 네 비트는 16진수 한 자리와 대응 된다. 마찬가지로 6은 0110과 같다. 그러면 이제 16진수를 왜 쓰는지 알 수 있을 것이다. 2진수와의 변환이 간편하다는 점이다. 그냥 네 비트씩 끊어서 16진수로 바꾸면 된다. 왜 그런지는 각자 생각해 보기 바란다. 여기서 간단한 팁 한가지를 알려 주겠다. 8421코드라는 변환 방법인데, 알고 있으면 정말 편하다. 즉 이진수 네 비트가 있다고 할 때 상위 비트부터 하위 비트까지 8421이 하나씩 대응되는 것이다. 이진수 1111은 8 + 4 + 2 + 1이다. 1001은 8 + 1이다. 8421을 언제나 머릿속에 넣어두어라. 이진수를 보고 16진수로 바꿀 때, 8421코드를 이용하여 각각의 네 비트를 10진수로 만든 후 16진수로 바꿔라. 이진수에서 16진수로 바꾸기가 편해질 것이다. 제공 : 코리아인터넷닷컴, a 2004년 11월 17일 |
[전광성의 어셈블리어 이해하기:1회] 어셈블리어를 배우기 위한 기본개념 (3) (3) : 어셈블리어를 배우기 위한 기본개념 (3) |
참고로, 최상위 비트가 1이면 음수고 0이면 양수가 된다. 즉 1111 1111은 음수고, 0111 1111은 양수이다. 2의 보수표현을 했을 때의 특징을 알아보자.
a. 4 0000 0100 b. 1 0000 0001 c. -1 1111 1111 a+c 3 0000 0011보다시피 a - b는 a + c와 같다. 마지막 단계에서 8비트를 넘어선 비트8(왼쪽에서부터 9번째 비트)에 넘어간 숫자는 어디갔을까? 컴퓨터는 지금 8비트(1바이트)형의 데이터에 대해 연산을 하고 있으므로, 이 범위를 벗어난 것은 그냥 버린다. 표현 방법이 어떻든 간에 컴퓨터는 숫자로 이루어져 있다는 사실을 명심하라. 우리 눈에 보이는 a는 눈에만 문자로 보이지 사실은 65라는 숫자값이다. 다음은 자주쓰는 문자에 대한 아스키 코드값이다.
이번 회에서는 어셈블리어를 배우는데 있어 필수적인 기본 컴퓨터 '상식'들에 대해 공부해 보았다. 상식이라고 해서 크게 부담 가질 것 없다. 모를때 자꾸자꾸 다시 보다 보면 어느새 내 것이 되어있을테니까. 다음시간에는 CPU와 관련된 내용을 알아볼 것이다. 어셈블리어가 어떻게 CPU에 직접 접근하는지, 다음 강좌를 통해 알아보도록 하자!! 제공 : 코리아인터넷닷컴, a 2004년 11월 24일 |
----->
어셈블리어란 기계어를 영문자로 치환시킨 언어이다. 예를 들어 45라는 명령이 있는데 이 명령이 숫자의 대소를 비교한다고 치자. 그렇다면 45라는 명령을 cmp와 같이 comparison의 약자로 대신 사용하는 것이다. 기본적으로 기계어는 모두 숫자이기 때문에 코드를 볼 때 이해하기도 힘들 뿐더러, 숫자로 된 그 많은 기계어들을 일일이 매뉴얼을 참고해 가며 프로그램 작성하기도 힘이 든다. 이런 불편함을 해소하고자 어셈블리어가 탄생하게 되었다. 어셈블리어와 고급언어의 구체적인 차이는 <표1>에 설명해 놓았다.
<표 1 : 어셈블리어와 고급언어의 차이점> 위의 내용이 이해가 가지 않더라도 겁먹을 필요 없다. 필자가 C언어를 배울 때 포인터에서 막혀 책을 덮은 것이 한두번이 아니었다. 나는 포인터를 왜 쓰는지 너무나 궁금해서 게시판 여기저기를 돌아다니며 질문을 해보고 당시 나우누리에서 강좌를 쓰시던 분에게도 메일을 보내 봤지만 통쾌한 대답을 얻을 수 없었다. 그러다가 포기하는 심정으로 포인터 뒷부분으로 계속 진도를 나가다 보니 왜 쓰는지는 물론 어떻게 활용해야 할지도 알 수 있었다.
공부를 하다가 중간에 모르는 것이 생기면 일단은 그곳에 물음표를 달아놓고 지나가면 된다. 더 진도를 나간 후 다시 보면 이해할 수 있는 경우가 대부분이기 때문이다.
프로그램 | 고급언어 | 어셈블리어 |
---|---|---|
한 플랫폼에서만 돌아가는 대규모의 응용프로그램
|
규모가 큰 코드를 유지 및 보수하기 좋은 구조를 갖고있다.
|
코드의 유지보수가 어려운 구조를 갖고 있으며, 개발에 많은 경험을 필요로 한다.
|
하드웨어 장치 드라이버
|
직접적인 하드웨어 접근이 힘들다.
|
하드웨어로의 접근이 직접적이고 간단하므로, 유지보수가 편하다.
|
여러 플랫폼에서 작동가능한 응용프로그램
|
보통 호환성이 뛰어나서, 약간의 코드 수정만으로 다른 플랫폼에 이식 가능하다.
|
각각의 플랫폼마다 다른 어셈블러로, 다른 문법으로 작성해야한다.
|
직접적인 하드웨어 접근이 필요한 임베디드시스템과 컴퓨터게임
|
하드웨어로의 접근이 매우 느려 수행속도에 문제가 있다.
|
하드웨어에 직접적인 접근을 하기 때문에 수행속도가 빠르다.
|
공부를 하다가 중간에 모르는 것이 생기면 일단은 그곳에 물음표를 달아놓고 지나가면 된다. 더 진도를 나간 후 다시 보면 이해할 수 있는 경우가 대부분이기 때문이다.
댓글 없음:
댓글 쓰기
국정원의 댓글 공작을 지탄합니다.