2012-12-08 4 views
0

Turbo C++ 3.1을 사용하고 있습니다.Turbo C++ : malloc 함수의 객체 코드 생성

C 표준 라이브러리의 malloc을 필요로하는 어셈블리 모듈이 있습니다. 그래서 내 .ASM 파일에 내가 가진 :

extern _malloc:proc 

내가 malloc에 ​​포함 된 오브젝트 파일을 생성 할(). 링커를 사용하고 실행 파일을 작성하려면. 예 :

tasm /zi bmlib.asm // create object file: bmlib.obj 
tasm /zi bmlibt.asm // create object (which contains main program): bmlibt.obj 
? //Generate object file for malloc: malloc.obj 
tlink /v3 bmlibt bmlib malloc // link all modules 
bmlibt.exe // Execute the program 
+1

런타임의'malloc()'을 사용하려면 런타임 라이브러리에서 링크해야합니다 (malloc()은 고유 한 종속 세트를 가지고 있기 때문에). 또한 런타임이 적절하게 초기화되는지 확인해야합니다. 어셈블리 파일을 어셈블리 언어 프로그램의 진입 점을 호출하는 것 외에 아무것도하지 않는 작은 C 프로그램에 쉽게 링크 할 수 있습니다. 아니면 간단한'malloc()'을 구현하십시오 –

+0

고마워요. C 파일 팁은 훌륭합니다. 내 자신의 malloc을 구현하려면 인터럽트를 사용하여 OS에 공간을 요청해야합니다. – blaze

+0

아마 그걸 할 수있는 방법 중 하나입니다. 프로세스가로드 될 때 메모리 풀이 있으므로 .exe 헤더를 설정하는 링커를 얻는 방법이 있다고 상상하지만 MS-DOS에서 작업 한 이후로 오랜 시간이 걸렸으므로 아무 것도 줄 수 없습니다. 그게 어떻게 작동할지에 대한 세부 정보. –

답변

2

실제로 터보 C++의 malloc을 오브젝트 파일에 넣으려면 tlib을 사용하여 표준 라이브러리에서 해당 오브젝트 파일을 추출하십시오. Offhand 나는 tlib에 깃발이나 표준 라이브러리의 파일 이름을 알려주지는 않지만 그 둘 모두를 쉽게 찾을 수 있어야합니다.

명령 줄에서 tcc을 사용하면 표준 라이브러리에서 사용한 모듈을 자동으로 컴파일하고 링크 할 수 있습니다. C에서 적어도 하나의 파일을 사용해야 할 필요가 있습니다.-malloc은 C 시작 코드에서 발생하는 초기화에 따라 달라 지므로 실제로 시작 코드가 없어도 성공적으로 연결 한 경우에도 실제로 작동하지 않습니다.

+0

그래, 나는 C 파일 팁을 사용할 것이다. 하지만, 나는 여전히 C 파일을 필요로하지 않고 모든 것을 배우고 싶다. 나중에 tlib 팁을 시도 할 것이다. – blaze

+0

@metroxylon : 순수 어셈블리에서 사용할 수있는 표준 라이브러리가 필요하면 [Spontaneous Assembly] (http://kevincrenshaw.com/spontaneous.htm)를 고려할 수 있습니다. 나는 그것이 새로운 것이었던 때 그것을 뒤로 사용했다 - 그것은 * 꽤 * 좋다. –

+0

쿨, 링크 고마워. – blaze

1

의 malloc()는 C (또는 C++) 실행 라이브러리의 일부이다. C 런타임 (종종 CRT라고도 함)을 정적으로 링크하도록 링커에 지시 할 수는 있지만 일반적으로 동적으로 링크되어 실행 파일의 크기가 더 작습니다. 어쨌든 일반적으로 런타임 오브젝트의 malloc() 구현을 별도의 오브젝트 파일에 내장 할 수있는 옵션이 없습니다. 물론 자신 만의 버전을 구현한다면, 그것은 당신의 목적 파일의 일부가 될 것입니다. 이 경우 구현은 시스템의 구현보다 우선합니다.

그래서 나는 당신이 C 런타임 라이브러리, 정적 또는 동적으로 링크하려는 링커에게 알리는 방법 중 하나를 찾아야한다고 생각합니다. 그런 다음 어셈블리 개체 파일은 최종 실행 파일에 링크되어있을 때 액세스 할 수 있어야합니다.