I am trying to create an executable and symbol file with Intel's ASM86 Assembler and Intel's LINK86.EXE linker.
This creates my program:
ASM86 program.asm SYMBOLS
LINK86 program.obj TO program.exe EXE
Without the latter EXE parameter, which unfortunately isn't mentioned anywhere in the manual "iAPX 86,88 FAMILY UTILITIES USER'S GUIDE FOR DOS SYSTEMS", the linker produces an invalid EXE file that crashes.
With the EXE parameter, the program works correctly.
But i run into two problems.
1.
I don't know how to get rid of this warning message:
WARNING 58: NO START ADDRESS SPECIFIED IN INPUT MODULES
I tried to set a
ORG 0000h ; for EXE
statement in the *.ASM file. It compiles like it did without this statement, but the warning message still didn't go away.
I also tried to name the module MAIN:
NAME MAIN
in the *.ASM file.
And in the CODE segment, it tried to use a
MAIN:
label.
But nothing solved that. The warning message is still there. Now i am running out of options. I have no further ideas how to get rid of this message.
2. The SYMBOLS that are created by the ASM86 assembler are part of the PROGRAM.LST listing file. It's not an individual *.SYM file.
Is there a way to create an individual *.SYM file with this ASM86 assembler?
Quote from: bugthis on June 12, 2023, 08:42:44 PM
I don't know how to get rid of this warning message:
WARNING 58: NO START ADDRESS SPECIFIED IN INPUT MODULES
OMG, the Intel ASM86, hasn't this software celebrated its 40. birthday this year?
But IIRC, it has strong relations to Masm. So check the END directive, the optional argument for this directive is the start label, where program execution is to begin.
I tried this before:
CODE SEGMENT
ORG 0000h
START:
.... ; ASM code
END START
CODE ENDS
END
But ASM86 complains with an error.
The error message can be read in the listing and it says:
END START
***_____^
***Error #1 IN 50, SYNTAX ERROR
----
So END START like in MASM doesn't work. Also the examples in the manual are all without an END for labels.
Try this.
CODE SEGMENT
ORG 0000h
START:
.... ; ASM code
END START
Quote from: jj2007 on June 13, 2023, 12:38:47 AM
Try this.
CODE SEGMENT
ORG 0000h
START:
.... ; ASM code
END START
Well Intel ASM86 is not MASM.
With this there are 2 errors now.
First the same as in my previous comment.
And second this one:
*** ERROR #89 IN 53, PREMATURE END OF FILE (NO END STATEMENT)
Intel ASM86 requires at least an end for every segment and a final end for the complete source file.
Quote from: bugthis on June 13, 2023, 12:52:51 AM
Intel ASM86 requires at least an end for every segment and a final end for the complete source file.
I doubt that. Why don't you proceed systematically? If I were you, I would, as a first step, generate the most simplest program:
CODE SEGMENT
START:
CODE ENDS
END START
These are four lines, nothing else. Still receiving errors?
Quote from: bugthis on June 13, 2023, 12:52:51 AMWell Intel ASM86 is not MASM.
With this there are 2 errors now.
Sorry, I don't have Asm86, so I couldn't test it. Just a wild guess.
name t1
org 0100h
CGROUP group CODE
assume CS: CGROUP
CODE segment
START proc near
START endp
CODE ENDS
END START
:thumbsup:
Quote from: _japheth on June 13, 2023, 01:08:37 AM
Quote from: bugthis on June 13, 2023, 12:52:51 AM
Intel ASM86 requires at least an end for every segment and a final end for the complete source file.
I doubt that.
Well, omitting CODE END in Intel ASM86 is like omitting the curly brace in C.
Intel ASM86 requires its syntactical sugar.
Correct:
DATA segment
DATA ENDS
CODE segment
CODE ENDS
False:
DATA segment
CODE segment // The assembler still thinks, he's inside the DATA part.
Quote
Why don't you proceed systematically?
The program is already very simple. It only prints a "Hello world!"
The pure ASM mnemonic code is itself correct, what's missing seems to be some magic mambo jambo statement the ASM86 assembler requires. Or in other words, syntactic sugar.
Quote
If I were you, I would, as a first step, generate the most simplest program:
i can remove the "Hello world!" and Data segment and just print a letter and exit to DOS. I will try that, after i have answered your questions.
Quote
CODE SEGMENT
START:
CODE ENDS
END START
These are four lines, nothing else. Still receiving errors?
Yes.
Error messages are:
***ERROR #7 IN 2, NO CS-ASSUME IN EFFECT - NEAR LABEL CANNOT BE DEFINED
***ERROR #150 IN 4, UNDEFINED SYMBOL IN INITIALIZATION
***ERROR #145 IN 4, IDENTIFIER MUST BE LABEL FOR A CS-IP INITIALIZATION
***ERROR #151 IN 4, NO NAME DIRECTIVE ENCOUNTERED, DEFAULT MODULE NAME USED
ASSEMBLY COMPLETE, 4 ERRORS FOUND
Quote from: HSE on June 13, 2023, 05:50:17 AM
name t1
org 0100h
CGROUP group CODE
assume CS: CGROUP
CODE segment
START proc near
START endp
CODE ENDS
END START
:thumbsup:
This compiles:
ASSEMBLY COMPLETE, NO ERRORS FOUND
But with this, START is not a LABEL, it's a procedure.
And org 100h means, that it is for a COM file, not an EXE.
Trying to link the Objectcode to a working EXE fails. The trying to run the EXE in FreeDOS it gives the error message:
Allocation of DOS memory failed.
Example asm
https://archive.org/details/introductiontoas00inte/page/n31/mode/2up
Quote from: TimoVJL on June 13, 2023, 04:54:34 PM
Example asm
https://archive.org/details/introductiontoas00inte/page/n31/mode/2up
Thanks.
I found the reason for the error/warning.
You must define at least one label between your CODE segment and you must end it with an END directive
outside of the CODE segment section.
NAME PROGRAM
ASSUME CS:CODE
CODE SEGMENT
GECKO:
.... ; ASM code
MOV AH, 4Ch ; Back to DOS
INT 21h
CODE ENDS
END GECKO
The label (here GECKO) can have any name. You can call it MAIN, START, BEGIN, GECKO, BLABLA or something else.
But if you define it inside your CODE section, you must end it at the END outside of the code section.
You can have multiple labels inside your code section, but at least one of them must be after the END directive outside of the code section.
It doesn't matter which one:
NAME PROGRAM
ASSUME CS:CODE
CODE SEGMENT
BLABLA:
.... ; ASM code
GECKO:
.... ; ASM code
START:
.... ; ASM code
MAIN:
.... ; ASM code
BEGIN:
.... ; ASM code
MOV AH, 4Ch
INT 21h
CODE ENDS
END GECKO
So _japheth was close with this suggestion, but the NAME and ASSUME directive was missing:
https://masm32.com/board/index.php?topic=10802.msg119988#msg119988
Thanks to all for helping.
Quote from: bugthis on June 13, 2023, 05:43:41 PM
I found the reason for the error/warning.
You must define at least one label between your CODE segment and you must end it with an END directive outside of the CODE segment section.
Congratulation!
I downloaded ASM86/LINK86 and played with them a bit. It's interesting - although ASM86 is supposed to emit object modules in OMF format, 16-bit linkers like MS Link or Borland's tlink are unable to find the start label. So you are restricted to LINK86.
A possible trap is that LINK86 doesn't warn if no stack is defined. That's usually not fatal, the program still runs, but it runs "by chance" only.