오늘은 함수에 대체 진입 점을 만들 어셈블리 코드에서 함수 포인터를 증가와 함께 놀았 :이 어셈블리 코드와 비슷한 C 언어의 연산이 있습니까?
.386
.MODEL FLAT, C
.DATA
INCLUDELIB MSVCRT
EXTRN puts:PROC
HLO DB "Hello!", 0
WLD DB "World!", 0
.CODE
dentry PROC
push offset HLO
call puts
add esp, 4
push offset WLD
call puts
add esp, 4
ret
dentry ENDP
main PROC
lea edx, offset dentry
call edx
lea edx, offset dentry
add edx, 13
call edx
ret
main ENDP
END
(I, 그것은 초기화되는 CRT없이 puts
를 호출하기 때문에 기술적으로이 코드가 잘못 알고 있지만, 적어도 MSVC 2010 SP1에서는 어셈블리 나 런타임 오류없이 작동합니다.)
dentry
에 대한 두 번째 호출에서 이전처럼 edx
레지스터의 함수 주소를 가져 왔지만 이번에는이를 증가 시켰습니다 함수를 호출하기 전에 13 바이트 씩
이 프로그램의 출력은, 그러므로 :
C:\Temp>dblentry
Hello!
World!
World!
C:\Temp>
제 2 출력에서 시작하여 호출에서 반면 "Hello!\nWorld!
"의 제 1 출력은 상기 기능의 시작에 대한 호출로부터 인 " push offset WLD
"명령.
이런 종류의 것들이 C, Pascal 또는 FORTRAN과 같은 어셈블러에서 한 단계 올라 가기위한 언어로 존재하는지 궁금합니다. 나는 C가 함수 포인터를 증가시키지 않는다는 것을 알고 있지만, 이런 종류의 일을 성취 할 다른 방법이 있습니까?
참조하십시오. 더 높은 수준의 언어 (심지어 asm에서도)를 두 개의 분리 된 함수로 나눠서 하나를 다른 함수로 호출하고 컴파일러가 최선의 구현을 선택하도록해야합니다. – Jester
이전 FORTRAN이 함수에 대한 여러 진입 점을 지원한다고 생각하고 빠른 google 검색을 통해 https://gcc.gnu.org/onlinedocs/gcc-3.4.4/g77/Alternate-Entry-Points.html 및 https :// /docs.oracle.com/cd/E19957-01/805-4939/6j4m0vn99/index.html – ninjalj
실제 질문은 ** 이유 **입니다. 이것은 유지 보수의 악몽입니다. 최적화까지 : 프로그램의 99 % 이상이 이것을 필요로하지 않습니다. 나머지는 종종 컴파일러와 70/80 년대 베이직 해킹보다 훨씬 좋은 구조로 최적화 될 수 있습니다. – Olaf