язык ассемблера - PullRequest
       4

язык ассемблера

2 голосов
/ 12 февраля 2010

Я очень новичок. Я уверен, что это очень просто, но я проходил через это несколько раз. Я пытаюсь заставить мою программу отображать строку в двух разных строках. Это программа .com, и я использую компилятор A86. Это для HW, и я не пытаюсь обмануть или что-то в этом роде, потому что я действительно хочу знать, что я делаю неправильно.

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

Ответы [ 3 ]

3 голосов
/ 12 февраля 2010

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

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

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

  • Отметьте второе сообщение как 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
1 голос
/ 12 февраля 2010

Два определения сообщения?

0 голосов
/ 12 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...