2

I am trying to get my program to display a string on two different lines.

This is a .com program and I am using A86 assembler.

jmp start               ; This will start the program

;============================

  msg   db  "Hello Word.$"      ; A string variable 
  msg   db  "Michael J. Crawley$"   ; A string variable with a value.

;============================

start:

  mov ah,09             ; subfunction 9 output a string

  mov dx,offset msg         ; DX for the string

  int 21h               ; Output the message

  int 21h               ; Output the message

exit:

  mov ah,4ch
  mov al,00             ; Exit code 

  int 21h               ; End program
Peter Cordes
  • 328,167
  • 45
  • 605
  • 847
Michael
  • 315
  • 4
  • 6
  • 17
  • 1
    What's the issue you are having with the code? Does it 'compile'? Are you getting weird output? Best to add this to the question. – glasnt Feb 12 '10 at 04:16

3 Answers3

3

Here are your specific problems:

  • You define msg twice (a86 will barf on that).
  • You call int21 fn9 with the same value of msg so you're not printing the two messages out, just two copies of the first.
  • You don't have a newline character in either message so they'll abut each other rather than be on separate lines.

The solutions to those points (without providing the actual code).

  • Label the second message as msg2.
  • Load msg2 into dx before calling int21 for the second time.
  • Change the messages to put a newline before the '$' symbol (or at least the first one).

Update: Since some other helpful soul has already provided source, here's my solution. I would suggest you learn from this and modify your own code to do a similar thing. If you copy it verbatim from a public site for classwork, you'll almost certainly be caught out for plagiarism:

         jmp start                   ; This will start the program

msg      db  "Hello Word.",0a,"$"    ; A string variable .
msg2     db  "Michael J. Crawley$"   ; A string variable with a value.

start:   mov ah,09                   ; subfunction 9 output a string
         mov dx,offset msg           ; DX for the string
         int 21h                     ; Output the message
         mov dx,offset msg2          ; DX for the string
         int 21h                     ; Output the message
exit:
         mov ah,4ch
         mov al,00                   ; Exit code 
         int 21h                     ; End program

This outputs:

Hello Word.
Michael J. Crawley
paxdiablo
  • 854,327
  • 234
  • 1,573
  • 1,953
1

Two definitions of msg?

Richard Pennington
  • 19,673
  • 4
  • 43
  • 72
  • I am not sure I understand. Should I remove one.... db "Michael J. Crawley$" ; A string variable with a value. – Michael Feb 12 '10 at 04:25
  • @Mike: No, they each need unique names. You could replace the first "msg" with "msg1", and the second with "msg2". – Ponkadoodle Feb 12 '10 at 04:55
0

I'm not familiar with a86, but with NASM & MASM you need an "org 100h" assembler directive at the beginning of a com program. The way it is now, offset msg is 0x2, and that'll try to print from the second byte of the program segment prefix (a 16 bit word that holds the segment of the top of memory available to you).

Arthur Kalliokoski
  • 1,627
  • 12
  • 12
  • This is why a86 is so good and why Harald is so rightly arrogant :-) It will assemble a file without _any_ of the gumpff required by other assemblers - I always hated masm and it's requirement that I had to provide 25 lines of administrivia just to do a 5-line hello world program. Turbo Assembler took away a lot of that but a86 goes all the way. – paxdiablo Feb 12 '10 at 06:25