[C++] Assembler 를 C나 C++로 만들때에..
글쓴이: gyxor / 작성시간: 금, 2004/04/30 - 9:53오전
어셈블리어의 명령어들은 레지스터에 직접 값을 넣어야하는 명령어 들이
대부분인데요.. 각종 인터럽트도 많이 있구요
결과적으로 원하는 출력이나 실행을 어느정도는 구현해줄수 있을거 같은데요
어셈블러로서의 기능을 내부적으로도 완전히 구현하도록 하는것이 가능한지
궁금합니다.
첫째,
예를들어
MOV DX,AX 같은 어셈블리어 소스 C,C++로 만든 어셈블러에서
처리를 하는것이 어떻게 가능한지 궁금합니다.
레지스터에 직접 값을 넣거나 읽어오는 명령어가 ..
C,C++에 없지 않나요?
둘째,
각종 인터럽트를 구현하는것이 어떻게 가능한지 궁금합니다.
답변부탁드립니다.
Forums:
Re: [C++] Assembler 를 C나 C++로 만들때에..
음, 1번은 인라인 어셈을 이용하시면 어떠실지?
2번은 디바이스 드라이버를 구현하시고, 거기서 해당 프로그램에
뭔가 데이터를 날려준다던가 그런 방법을 해야 할듯한데요. 음... 고운하루
되시길...
=========================
CharSyam ^^ --- 고운 하루
=========================
어셈블러를 만든다 함은 아마도 다음 3가지중 하나가 아닐까요?
어셈블러를 만든다 함은
아마도 다음 3가지중 하나가 아닐까요?
1) mov dx, ax
와 같은 명령어들을 기계어로 치환하여 실제 물리하드웨어에서 수행가능하게 함
2) 특정 머신 emulator를 제작하여, 에뮬레이터 상에서 구동되게 함.
3) 아니면, CPU의 Single Step을 이용하여 (마치 디버거 같은 형태로) 단순하게 시뮬레이션함
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
Re: [C++] Assembler 를 C나 C++로 만들때에..
흠... 제가 헤깔리는건지...
어셈블러를 구현한다는 것이 C/C++ 에서 "MOV DX,AX" 와 같은 일을 수행해야 하는건가요? C/C++을 사용해서 "MOV DX,AX" 와 같은 코드를 생성하는 프로그램을 만드는것이 아닌가요?
--
Life is short. damn short...
어셈블러를 구현하는것이 자체가 목적은 아니구요..C++,C 로 구현이
어셈블러를 구현하는것이 자체가 목적은 아니구요..
C++,C 로 구현이 가능한지 궁금해서 그런데요..
듣기로..
어셈블러를 만들때에
MOV DX,AX 등의 명령어에 해당하는
cpu고유의 2진명령어로만 바꾸어줄주 있는 기능을
만들어줄 수 있으면 된다고 하는데요..
C++자체의 함수들을 가지고 만들어야 하는것으로 착각했습니다.
그런데
한가지 더 궁금한것은
.exe 파일이 실행되기 까지
소스코드 -> 컴파일(어셈블) -> .obj(link) -> .exe -> 실행(로더)
이러한 과정으로 알고있습니다.
여기서 컴파일러에 의해 컴파일된 결과인
컴파일러와 obj파일과 linker는
자연히 구현된 언어에 따라서 다르게 될거 같은데요..
그렇다면 ..
.exe 파일과 loader는 소스코드에 사용된 언어와
컴파일러를 작성한 언어에 관계없이 모두 동일한것인가요?
loader는 os내부에 존재하는것인지 궁금합니다.
답변부탁드립니다.
추가:
질문하는동안 답변이 많이 올라왔네요 ^^;
이런식으로도 가능하겠네요..
그런데 그렇게 되면 결과물이 .obj가 아니라 .asm소스파일이 될텐데요..
기존의 어셈블러를 대체하는것이 아니라 어셈블
단계만 추가되는것이 아닌가요?
[quote="gyxor"]어셈블러를 구현하는것이 자체가 목적은 아니구요
당연히 가능하죠..
http://www.gnu.org/directory/binutils.html
어셈블러를 C로 짠 것을 보실 수 있습니다.
실행파일이 자체적(?)으로 실행가능한 바이너리 파일이라면, 소스코드에 사용된 언어와 컴파일러를 작성한 언어와 관계 없이, 타겟 CPU에 맞는 기계어로 작성되어 있겠죠.
로더가 OS 내부에 존재하는지 어떤지를 알기 위해서는 OS 내부가 무엇인지 알아야 하겠습니다. 로더도 보통은 실행파일입니다.
C를 쓰든 무엇을 쓰든 "MOV DX,AX"등의 어셈블리 코드를 "....0101010111100011101011...."등의 기계어로 바꾸는 프로그램을 만드는 것이 어셈블러의 구현이 아닐까 생각합니다.
덧. 제 글에서 오류나 허점을 찾으시면 지체없이(?) 말씀해주세요. ^^
기본적인 로더는 커널에 내장되어 있습니다. 그래야 실행파일의 로드가가
기본적인 로더는 커널에 내장되어 있습니다. 그래야 실행파일의 로드가
가능해지니까요. 간혹가다 별도의 로더를 쓰는 프로그램도 있는데 얘네들은
OS 로더에 의해 로드된 실행파일에서 별도 로더를 실행시켜서
로드하는 식으로 돌아갑니다.
컴파일러나 링커는 평상시에 안쓰므로 별도로 존재하고요.
어셈블러 만드는것도 어려운건 아닙니다. 어셈블리 코드를 기계어로 바꾸면
끝이고, 각자의 프로그램 돌아가는거는 각 프로그램이 어셈블러를 통해서
실행파일로 바뀌어 돌아가는겁니다. 원하는 출력이나 동작은 어셈블러가
해주는게 아니라 어셈블러를 이용해서 만들어지는 각 프로그램에서 다 해줘야죠.
I/O 제어나 IRQ 관련부분... 이것도 어셈블러가 해주는게 아니라 어셈블리나
기타 프로그래밍 언어로 프로그램을 만든 사람이 다 하도록 만듭니다. 얘네들은
CPU 외부의 칩과 연동해서 동작해야 하므로 별도의 하드웨어 I/O를 하는데,
I/O는 메모리 특정 영역을 쓰거나(memory-mapped), in/out 명령으로 특정
포트에 대한 입출력을 하는걸로 다 해결됩니다. (io-mapped)
Written By the Black Knight of Destruction
예전 볼랜드 C/C++에서 아래와 같이 하면__emit__(0xe
예전 볼랜드 C/C++에서 아래와 같이 하면
__emit__(0xea,0xF0,0xFF,0x00,0xF0);
JMP 0xFFFF0, 이란 의미입니다.
다 포인터의 원리를 이용한 것입니다.
.
좋은 답변 감사합니다. ^^
댓글 달기