2014-01-21 4 views
2

Windows에서 최소한의 어셈블리 프로그래밍에 관심이 있습니다. GUI가 아니며 콘솔에 몇자를 인쇄하는 보통의 오래된 .exe 프로그램입니다.어셈블리 Windows의 어셈블리

test.s :

ret 

명령 행 :

gcc test.s 

그리고 단순히 컴파일하고 Windows에서 어셈블리를 실행하는 것도 가능했다 있는지 확인하기 위해, 나는 다음과 같은 시도 다음과 같은 오류가 발생했습니다 :

In function 'main': undefined reference to 'WinMain'

그럼 궁금한 점은 간단한 어셈블리를 컴파일하는 방법입니다. Windows 실행 파일에 대한 프로그램이 없습니까? 모든 프로그램에 WinMain을 정의해야합니까? gcc에 깃발이 맞습니까?

어떤 어셈블러를 사용 하느냐는 정말로 신경 쓰지 않지만, gcc (gas), masm 및 다른 어셈블러에 대해 다른 것이 동일한지를 누군가가 알고 있다면 좋을 것입니다.

+0

을 yeilds. –

+0

이 질문을보고 시작하는 것이 좋습니다. http://stackoverflow.com/questions/1023593/how-to-write-hello-world-in-assembler-under-windows – PhiS

답변

1

순수 또는 조립품을 원한다고 말하면이 라인에 있습니까?

The Assembly Programmers Master Book
언어 masm32 어셈블러, 링커 ml,link

소스에서 가져온;

집합체 & 연결;

ML /c /coff PROG1.ASM 
LINK /SUBSYSTEM:WINDOWS PROG1.0BJ 

이 프로그램

은 문자 그대로 "동작 없음"이라고하지만, 그냥 아무것도하지 않는다 순수 MASM가되었습니다.

당신이 WIN32 API를 사용하여 프로그래밍해야합니다 C의 도움없이 프로그램을 개발하고자하는 경우 win.hlpwin32.hlp라는 그물에이 API에 대한 참조를 찾을 수 있습니다,이에있을 나타납니다 web-page

아마도 편리한 링크 ->MASM 6.1 Documentation


편집 : 사용 as (가스) & ld;

.globl _start 

_start: // ld looks for _start by default 
    movl $22, %eax // AT&T syntax 
    ret 

;

c:\Users\James\Desktop\asm\>as file.s 

c:\Users\James\Desktop\asm\>ld a.out 

c:\Users\James\Desktop\asm\>a.exe 

c:\Users\James\Desktop\asm\>echo %errorlevel% 
22 

섹션의 분해.텍스트 :

00401000 <_start>: 
    401000:  b8 16 00 00 00   mov $0x16,%eax 
    401005:  c3      ret 
    401006:  90      nop 
    401007:  90      nop 

간단히 ret이 (-masm=intel 당신에게 인텔의 구문을 제공합니다) 당신은 지금, 당신은 -S 플래그로 컴파일하여 C/C++ 프로그램의 어셈블리리스트를 얻을 수 있습니다 얻기 위하여려고하고 있지 않다 퍼팅.

당신은 또한 코드에 대한 text segment을 만들어야합니다, 코드가 시작되는 위치를 알고 링커에 대한 entry point를 지정해야했다

가 여기 1를 반환하는 정말 간단한 예이다;

.text 
    .intel_syntax noprefix 
    .globl _main 

_main: // entry point! 
    mov eax, 1 
    ret 

gcc [file].s 내가 MASM32를 받고 그 작업을 권 해드립니다 a.exe

+1

이것을 컴파일하면 나에게도 같은 오류가 발생합니다. 위와 같이. – baruch

+0

또한 -S로 컴파일하면 C 표준 라이브러리와 링크해야하는 어셈블리가 생깁니다. 깨끗한 조립을 원합니다 – baruch

+0

지금 바로 편집하십시오. – James

관련 문제