안녕하세요 월드 코드 Gas, NASM 및 YASM에 멀티 플랫폼 작업이 진행 중입니다. 해당 실행 파일을 76KB에서 기본 Hello World C 프로그램으로 간주되는 Hello World 어셈블리 프로그램에 더 적합한 것으로 축소하고 싶습니다. 80KB의 실행 파일로 이어지고 어셈블리는 훨씬 더 작아야합니다. 실행 파일의 대부분은 링커 옵션의 정크로 가득 차 있다고 생각합니다.어셈블러 실행 파일을 어떻게 잘라내나요?
추적 :
LIBS=c:/strawberry/c/i686-w64-mingw32/lib/crt2.o -Lc:/strawberry/c/i686-w64-mingw32/lib -lmingw32 -lmingwex -lmsvcrt
ld ld -o $(EXECUTABLE) hello.o $(LIBS)
hello.exe
Hello World!
코드 :
.data
msg: .ascii "Hello World!\0"
.text
.global _main
_main:
pushl $msg
call _puts
leave
movl $0, %eax
ret
나는, LIBS에있는 옵션 중 하나를 제거 링크 프로세스가 실패하거나 실행시 생성 된 실행 파일이 윈도우 오류가 발생하거나합니다. 따라서 논리적 인 작업은 puts
호출을 sys_write, 과 같은 간단한 것으로 바꾸는 것입니다. 그러나이 멀티 플랫폼을 수행하는 방법을 모르겠습니다.. 온라인에있는 작은 문서에서 int 0x80
을 사용하여 커널 호출을 수행한다고 나와 있지만이 방법은 Windows가 아닌 Linux에서만 작동하며 내 어셈블리 코드를 멀티 플랫폼으로 만들 수 있습니다.
조건부 어셈블리를 사용할 수 있습니다. NASM에서 그런 식으로 사용하십시오. 'int 80h'을 리눅스 용으로, Windows 용으로는 Windows API 호출을 사용할 수 있습니다 (Windows API에 대해서는 잘 모릅니다). 아주 작은'ELF' 실행 파일을 만들기 위해서 [Really Teensy ELF 실행 파일을 리눅스에서 만들기위한 회오리 바람 튜토리얼] (http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html)이 흥미로울 것입니다. 멀티 플랫폼 어셈블리 프로그래밍에서는별로 도움이되지 않을 것입니다.) – nrz
C의 Hello World 프로그램이 일반적으로 80K를 사용하는 이유는 코드 크기가 아닌 C 런타임 라이브러리 때문입니다. CRT에 연결하지 않으면 EXE가 5-10K 여야합니다. – BitBank
@BitBank, 감사합니다! C 런타임에 의존하지 않도록 코드를 다시 작성하도록 도와 주시겠습니까? – mcandre