напечатать строку на двух разных строках

Я пытаюсь заставить свою программу отображать строку в двух разных строках.

Это программа .com, и я использую ассемблер A86.

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

person Michael    schedule 12.02.2010    source источник
comment
Что у вас за проблема с кодом? Он "компилируется"? Вы получаете странный вывод? Лучше всего добавить это к вопросу.   -  person glasnt    schedule 12.02.2010


Ответы (3)


Вот ваши конкретные проблемы:

  • Вы определяете msg дважды (a86 будет блевать на это).
  • Вы вызываете int21 fn9 с одним и тем же значением msg, поэтому вы не печатаете два сообщения, а только две копии первого.
  • У вас нет символа новой строки ни в одном из сообщений, поэтому они будут примыкать друг к другу, а не находиться на отдельных строках.

Решения этих точек (без предоставления фактического кода).

  • Пометьте второе сообщение как msg2.
  • Загрузите msg2 в dx перед вызовом int21 во второй раз.
  • Измените сообщения, чтобы поместить новую строку перед символом «$» (или, по крайней мере, перед первым).

Обновление: Поскольку какая-то другая полезная душа уже предоставила исходный код, вот мое решение. Я бы посоветовал вам извлечь уроки из этого и изменить свой собственный код, чтобы делать то же самое. Если вы скопируете его дословно с общедоступного сайта для работы в классе, вас почти наверняка поймают на плагиате:

         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

Это выводит:

Hello Word.
Michael J. Crawley
person paxdiablo    schedule 12.02.2010
comment
Разве вызовы DOS int21 также не возвращают код результата в AX, поэтому его нужно будет перезагружать перед вторым вызовом? Или DOS просто установил флаг переноса, чтобы указать на ошибку. - person Michael Burr; 12.02.2010
comment
@Майкл, не fn9, ничего не возвращает. - person paxdiablo; 12.02.2010
comment
Нет... Я не копипаст, я действительно хочу этому научиться. Я попробую. - person Michael; 12.02.2010
comment
0a - это размещение строки? - person Michael; 12.02.2010
comment
@Mike, 0a - это шестнадцатеричный код символа новой строки (ASCII 10). int21/fn9 интерпретирует это как запрос на переход к началу новой строки. - person paxdiablo; 12.02.2010
comment
Имейте в виду, что вам также может понадобиться 0Dh байт вместе с 0Ah байтом, чтобы сделать полную новую строку и возврат каретки. - person User.1; 12.09.2014

Два определения msg?

person Richard Pennington    schedule 12.02.2010
comment
Я не уверен, что понимаю. Должен ли я удалить один.... db Michael J. Crawley$ ; Строковая переменная со значением. - person Michael; 12.02.2010
comment
@Mike: Нет, каждому из них нужны уникальные имена. Вы можете заменить первое msg на msg1, а второе на msg2. - person Ponkadoodle; 12.02.2010

Я не знаком с a86, но с NASM и MASM вам нужна директива ассемблера «org 100h» в начале программы com. Как это сейчас, смещение msg равно 0x2, и это попытается напечатать из второго байта префикса сегмента программы (16-битное слово, которое содержит сегмент верхней части доступной вам памяти).

person Arthur Kalliokoski    schedule 12.02.2010
comment
Вот почему a86 так хорош, а Харальд так справедливо высокомерен :-) Он соберет файл без какой-либо галиматьи, требуемой другими ассемблерами - я всегда ненавидел masm, и его требование, которое я должен был предоставьте 25 строк administrivia только для того, чтобы выполнить 5-строчную программу hello world. Turbo Assembler многое убрал, но a86 идет до конца. - person paxdiablo; 12.02.2010