[assembly] masm 8.0 어셈블 방법..
글쓴이: gyxor / 작성시간: 수, 2004/02/25 - 1:10오전
.MODEL SMALL .STACK 64 .DATA .CODE MAIN PROC FAR MOV AX , @data MOV DS , AX MOV AX , 4C00H INT 21H MAIN ENDP END MAIN
위 어셈블리 소스를 가지고서 masm8.0버젼(http://www.movsd.com/masmdl.htm)
으로 어셈블하는 과정에서 오류가 납니다.
C:\Temp_data\Assem_Test>ml 1.asm Microsoft (R) Macro Assembler Version 6.14.8444 Copyright (C) Microsoft Corp 1981-1997. All rights reserved. Assembling: 1.asm Microsoft (R) Incremental Linker Version 5.12.8078 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. /z2 "1.obj" "1.exe" NUL LINK : warning LNK4044: unrecognized option "z2"; ignored LINK : error : Segment reference in fixup record 1.obj : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
----------------------------------------------------------------------------
/c /coff 옵션이 무엇인지는 잘모르지만 어떤 분이 알려주셔서 해봤습니다.
C:\Temp_data\Assem_Test>ml /c /coff 1.asm Microsoft (R) Macro Assembler Version 6.14.8444 Copyright (C) Microsoft Corp 1981-1997. All rights reserved. Assembling: 1.asm 1.asm(7) : error A2006: undefined symbol : DGROUP 1.asm(13) : warning A4023: with /coff switch, leading underscore required for st art address : MAIN C:\Temp_data\Assem_Test>
전에 6.11등으로 잘 썼었는데요..
(masm 1.asm 후에 link 1.obj등의 간단한 명령으로..)
8.0에선 뭐가 문제인지 잘 모르겠습니다.
os는 xp(pro) 입니다.
readme파일등을 봐도 방법을 못찼겠습니다.
답변부탁드립니다.
Forums:
질문내용이 프로그램관련이라 게시판을 이동시켰습니다.asm을 오랜만
질문내용이 프로그램관련이라 게시판을 이동시켰습니다.
asm을 오랜만에 봐서 가물거리지만 아는한도내에서 답변을 달겠습니다.
일단 /c는 Compile Only로 알고 있습니다. 즉, .com, .exe같은 실행파일을 만드는
역할을 하는게 아니라 .obj로 목적파일만을 만드는 역할을 합니다.
/coff는 기억이 잘 안나는데 아마 필요없는 정보를 삭제하는 기능이 아니였었나 생각이 드는군요.
처음에 써놓은 코드를 보니 코드는 일종의 Procedure입니다. 즉, 시작포인트가 없는
다른 프로그램에서 호출가능하게 하기 위해서 만들어놓는 일종의 서브루틴이라는 소리입니다.
그래서 ml 1.asm으로 실행파일을 만들지 못하고 에러를 출력한것이죠.
위 코드가 masm 6.1에서도 같은 에러가 발생했을거라 생각이 드는데...
------------------------------
좋은 하루 되세요.
/coff는 오브젝트 파일 포맷인걸로 기억합니다. djgpp gcc와 링
/coff는 오브젝트 파일 포맷인걸로 기억합니다. djgpp gcc와 링크걸때 쓰는걸로
/coff를 사용하면 m$ 고유의 OBJ 대신 COFF 포맷으로 만듭니다.
Written By the Black Knight of Destruction
어느쪽에 써야하는지 좀 헷갈렸습니다. 옮겨 주셔서 감사합니다^
오늘아침에 위 소스를 가지고 6.1에서 해봤는데요 정상수행되었습니다.
또한
이런식으로 내용을 추가해서 화면에 찍히는것을 직접확인 했습니다.
6.1을 사용하면 되겠지만..
8.0에선 왜 안되는것인지 궁금합니다.
혹시나해서 받아서 같은 코드를 컴파일해봤는데 역시나더군요. 역시 어렵군요
혹시나해서 받아서 같은 코드를 컴파일해봤는데 역시나더군요. 역시 어렵군요.
일단 컴파일과 링크를 동시에하는 배치파일을 이용하는게 좋습니다.
설치된 디렉토리아래 bin디렉토리에보면 build.bat와 buildc.bat 두개의 배치가
보일겁니다.
build.bat는 Windows용 프로그램을 만들때 사용하는 배치파일이고 buildc.bat는
Console용 프로그램을 만들때 사용하는 배치파일입니다.
따라서 위와 같은 코드는 buildc.bat를 이용하면 됩니다.
컴파일은 무사히 되는데 링크에서 _MAIN을 찾을 수 없다고 나오는군요.
음... 아무리 찾아봐도 원인이 불분명하군요. :oops:
더 찾아봐야겠네요.
------------------------------
좋은 하루 되세요.
답변감사합니다.
이 내용때문에 벌써 몇일째 고민하다가 드디어 결론에 이른것 같습니다.
알려주신내용에서 처럼 배치파일마다 link 옵션이 다릅니다.
원도용은 link /subsystem:windows 1.obj
도스용은 link /subsystem:console 1.obj
문제는 위와같이 하게되면 되는지 않되는지 확인하기 이전에....
우선은..컴파일시에 ml /c /coff 1.asm
하게 되면 /coff옵션에서 main라벨의 시작주소값을 모른다고 에러가 납니다.
...
혹시라도 이원인에 대해 아시는 분은 답변부탁드립니다.
아래의 사이트에 가보니..
http://www.asmlove.co.kr/submenu_asmfaq.htm
도스용을 만들때는 link.exe를 예전 버젼으로 쓰라고 나옵니다.
...
되더군요...
결국 masm8은 일단은.. 안쓰기로 했습니다..
MASM 8.0 이 32비트용 어셈블러라서 오류가 나는 것일 겁니다.
MASM 8.0 이 32비트용 어셈블러라서 오류가 나는 것일 겁니다.
아마 LINK 가 16 용과 32비트용이 서로 다르게 동작하는 걸로 알고 있습니다.
16비트용(MS-DOS) 어셈블리 코드는 16비트용 어셈블러에서 어셈블리 해야만 합니다.
자세한 내용은 어셈러브를 참고하는 것이 좋겠습니다 ^^;
http://asmlove.co.kr
에서 _MAIN 은 윈도우즈용 32비트 어셈블러를 사용했으므로 WinMain 을 찾을 수 없다는 오류 같네요.
인생, 쉬운 것만은 아니네..
댓글 달기