[assembly] masm 8.0 어셈블 방법..

gyxor의 이미지

.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파일등을 봐도 방법을 못찼겠습니다.

답변부탁드립니다.

codebank의 이미지

질문내용이 프로그램관련이라 게시판을 이동시켰습니다.

asm을 오랜만에 봐서 가물거리지만 아는한도내에서 답변을 달겠습니다.
일단 /c는 Compile Only로 알고 있습니다. 즉, .com, .exe같은 실행파일을 만드는
역할을 하는게 아니라 .obj로 목적파일만을 만드는 역할을 합니다.
/coff는 기억이 잘 안나는데 아마 필요없는 정보를 삭제하는 기능이 아니였었나 생각이 드는군요.

처음에 써놓은 코드를 보니 코드는 일종의 Procedure입니다. 즉, 시작포인트가 없는
다른 프로그램에서 호출가능하게 하기 위해서 만들어놓는 일종의 서브루틴이라는 소리입니다.
그래서 ml 1.asm으로 실행파일을 만들지 못하고 에러를 출력한것이죠.
위 코드가 masm 6.1에서도 같은 에러가 발생했을거라 생각이 드는데...

------------------------------
좋은 하루 되세요.

Necromancer의 이미지

/coff는 오브젝트 파일 포맷인걸로 기억합니다. djgpp gcc와 링크걸때 쓰는걸로

/coff를 사용하면 m$ 고유의 OBJ 대신 COFF 포맷으로 만듭니다.

Written By the Black Knight of Destruction

gyxor의 이미지

codebank wrote:

위 코드가 masm 6.1에서도 같은 에러가 발생했을거라 생각이 드는데...

오늘아침에 위 소스를 가지고 6.1에서 해봤는데요 정상수행되었습니다.
또한

.MODEL SMALL 
.STACK 64 
.DATA 
FLEE    DB      'KLDP$'
.CODE 

MAIN PROC FAR 
MOV AX , @data 
MOV DS , AX 

MOV AH, 09H
LEA DX, FLEE
INT 21H

MOV AX , 4C00H 
INT 21H 
MAIN ENDP 
END MAIN 


이런식으로 내용을 추가해서 화면에 찍히는것을 직접확인 했습니다.
6.1을 사용하면 되겠지만..
8.0에선 왜 안되는것인지 궁금합니다.
codebank의 이미지

혹시나해서 받아서 같은 코드를 컴파일해봤는데 역시나더군요. 역시 어렵군요.

일단 컴파일과 링크를 동시에하는 배치파일을 이용하는게 좋습니다.
설치된 디렉토리아래 bin디렉토리에보면 build.bat와 buildc.bat 두개의 배치가
보일겁니다.
build.bat는 Windows용 프로그램을 만들때 사용하는 배치파일이고 buildc.bat는
Console용 프로그램을 만들때 사용하는 배치파일입니다.
따라서 위와 같은 코드는 buildc.bat를 이용하면 됩니다.
컴파일은 무사히 되는데 링크에서 _MAIN을 찾을 수 없다고 나오는군요.
음... 아무리 찾아봐도 원인이 불분명하군요. :oops:
더 찾아봐야겠네요.

------------------------------
좋은 하루 되세요.

gyxor의 이미지

codebank wrote:
혹시나해서 받아서 같은 코드를 컴파일해봤는데 역시나더군요. 역시 어렵군요.

일단 컴파일과 링크를 동시에하는 배치파일을 이용하는게 좋습니다.
설치된 디렉토리아래 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은 일단은.. 안쓰기로 했습니다..

douner의 이미지

MASM 8.0 이 32비트용 어셈블러라서 오류가 나는 것일 겁니다.
아마 LINK 가 16 용과 32비트용이 서로 다르게 동작하는 걸로 알고 있습니다.
16비트용(MS-DOS) 어셈블리 코드는 16비트용 어셈블러에서 어셈블리 해야만 합니다.

자세한 내용은 어셈러브를 참고하는 것이 좋겠습니다 ^^;

http://asmlove.co.kr

Quote:
컴파일은 무사히 되는데 링크에서 _MAIN을 찾을 수 없다고 나오는군요.

에서 _MAIN 은 윈도우즈용 32비트 어셈블러를 사용했으므로 WinMain 을 찾을 수 없다는 오류 같네요.

인생, 쉬운 것만은 아니네..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.