기계 명령어 및 프로그램에 대한 책을 읽는 동안 어셈블러가 전체 소스 프로그램을 두 번 스캔한다는 특정 지점을 발견했습니다. 첫 번째 통과/스캔 중에 기호 테이블을 작성하고 두 번째 스캔 중에 전체 프로그램을 파일 테이블과 연관시킵니다. 어셈블러는 함수에 대해 비슷한 방식으로 주소를 제공해야합니다.
이제 어셈블러가 프로그램을 두 번 통과하기 때문에 함수를 사용하기 전에 함수를 선언해야하는 이유는 무엇입니까? 어셈블러가 1 차 통과에서 함수에 대한 주소를 제공 한 다음 2 차 통과 중에 프로그램과 상호 연관시키지 않겠습니까? 이 경우 C 프로그래밍을 고려하고 있습니다.프로그램의 작성 및 실행 - 2 단계 어셈블러
0
A
답변
1
간단히 대답하면 C 프로그램은 컴파일러가 단일 단계에서 처리하도록 설계 되었기 때문에 C 프로그램을 사용하기 전에 함수를 선언해야합니다. 어셈블러 및 함수 주소와 관련이 없습니다. 컴파일러는 함수를 사용하기 전에 심볼의 유형, 함수 또는 변수가 무엇인지 여부를 알아야합니다.
이 간단한 예제를 생각해 봅시다 : 컴파일러가 bar
함수 아니라는 것을 알 필요가 올바른 코드,하지만 함수에 대한 포인터를 생성하기 위해
int foo() { return bar(); }
int (*bar)();
. 이 코드는 foo
의 정의 앞에 extern int (*bar)();
을 넣으면 컴파일러가 어떤 형식을 알아야 작동합니다. bar
입니다.
언어가 이론적으로 컴파일러에서 두 번 통과하도록 요구할 수는 있었지만 언어 디자인에서 몇 가지 중요한 변경이 필요했습니다. 패스 두 번을 요구하면 컴파일러가 복잡해 지므로 C 컴파일러를 호스트 할 수있는 플랫폼 수가 줄어 듭니다. 이것은 64K (65,536) 바이트의 RAM이 많은 메모리였던 C가 처음 개발되었을 때 매우 중요한 고려 사항이었습니다. 오늘날에도 대형 프로그램의 컴파일 시간에 눈에 띄는 영향을 미칩니다.
C 언어는 암시 적 함수 선언을 지원하여 사용자가 원하는 것을 허용합니다. (위 예제에서 bar
이 선언되지 않은 경우 foo
에서 발생합니다.) 그러나이 기능은 더 이상 사용되지 않으며 제한적이며 위험한 것으로 간주됩니다.
어떤 어셈블러에서 함수를 사용하기 전에 선언해야합니까? –
C 컴파일러는 어셈블러가 아닙니다. 어셈블러의 작동 방식과 무관 한 C 언어의 규칙. –
내가 의미하는 바는, "어셈블 된"컴파일 된 프로그램은 프로그램에 포함 된 각각의 모든 함수, 변수 등에 대한 적절한 정의가 필요하다는 것입니다. 어셈블러가 프로그램을 두 번 실행해야한다면, 선언 기능은 불필요한가? –