8086 Машинный язык: простая программа не работает - PullRequest
0 голосов
/ 25 сентября 2018

Попытка отобразить мое имя и ввод символа через машинный язык NASM через DOSBox.Это очень просто, но у меня проблемы с кодом.Мой код указан ниже.

Инструкции состоят в том, чтобы написать программу 8086, которая будет:

  • Вывести ваше имя в одну строку
  • В следующей строке отобразить '?'
  • Считывание символа с клавиатуры
  • Отображение второго сообщения и символа, который следует сразу в последовательности символов ASCII.

Вот мой код.По некоторым причинам, это не будет работать так же хорошо, как я пропускаю, как получить символ, который следует в последовательности символов ASCII.

Скажите, пожалуйста, что я делаю не так?
А если я на правильном пути?
А также как прочитать новый символ ASCII?

Вот мой код так далеко:

      org 100h
      section .data
      msg   DB "Name of Person"
      char  DB '?'
      char1 DB ' '
      msg2  DB 0dh, 0ah, 'The following character in sequence is:  '
      char3 DB ' ','$'
   section .text
  Start: 
      mov  dx, [msg]     ;get message
      mov  ah, 09h       ;display string function
      int  21h           ;display message
  ;input a character
      mov  ah, 1         ;read char fcn
      int  21h           ;input char into AL
      mov  [char1], al   ;store character
  ;display in same line 
      mov  dx, [char1]   ;read char1
      mov  ah, 1         ;display character
      int  21h           ;display message
   ;display on next line next character
      mov  dx, msg2      ;get last line message
      int  21h           ;display message
  Exit:
      mov  ah, 4Ch       ;DOS function: Exit program
      mov  al, 0         ;return exit code value
      int  21h           ;Call DOS. Terminate program

1 Ответ

0 голосов
/ 27 сентября 2018
org 100h

Эта директива ORG 100h указывает, что ваша цель - получить программу .COM.Поскольку задача требует простой программы, это правильный выбор.Вам не нужно беспокоиться об инициализации регистров сегментов, и вам не нужно использовать такие разделы, как .data или .text.Есть только одна вещь, о которой вам нужно знать: если вы поместите данные (сообщения, ...) перед кодом, они будут по ошибке исполнены!Поэтому лучше всего поместить их ниже кода, далеко внизу в программе.Это безопасное место.

1 .Выведите ваше имя в одну строку

mov  dx, [msg]     ;get message
mov  ah, 09h       ;display string function
int  21h           ;display message

Для этой функции вывода DOS вам необходимо указать адрес в DX.При использовании ассемблера NASM команда, подобная mov dx, [msg], извлечет 2 байта, сохраненные по адресу msg .Это не то, что вы хотите в этом случае!Правильная инструкция: mov dx, msg, поэтому без квадратных скобок .
Во-вторых, эта функция вывода DOS ожидает окончания сообщения со знаком доллара $ , который вы не указали.

2 .В следующей строке выведите «?»

. Вы можете легко комбинировать это с выводом своего имени.См. Ниже код.

3 .Прочитайте символ с клавиатуры

Вы делаете это очень хорошо.

4 .Отобразите второе сообщение и следующий за ним символ в последовательности символов ASCII.

Вы получите следующий символ ASCII, просто увеличивая число, полученное на шаге 3 .


Поскольку это действительно очень простая программа, практически невозможно не написать весь код.
Несмотря на это, вы можете многому научиться из нее.Пожалуйста, обратите внимание на дополнительные комментарии ниже.

org 100h

mov  dx, msg1
mov  ah, 09h       ;display string function
int  21h

mov  ah, 01h       ;read char function
int  21h           ;leaves char in AL
inc  al
mov  [char], al    ;store N E X T character 

mov  dx, msg2
mov  ah, 09h       ;display string function
int  21h

mov  ax, 4C00h     ;DOS function to exit program with return exit code value
int  21h

msg1  DB 'Dillon Shotwell',13,10,'?$'
msg2  DB 13,10,'The following character in sequence is: '
char  DB 0,13,10,'$'
  • Функция ввода DOS 01h уже напечатала символ на экране (это называется echo), поэтому повторять это бесполезноaction.
  • Поскольку завершающий $ для второго сообщения помещается после увеличенного char , все это было выведено с помощью одного вызова функции DOS 09h.
  • Завершение вашего последнего сообщения с помощью возврата каретки / перевода строки определенно лучше.
  • Старайтесь избегать написания лишних комментариев.Они затрудняют чтение и понимание программы.
  • По возможности комбинируйте операции, такие как mov ah, 4Ch и mov al, 0, которые можно так же легко записать, как mov ax, 4C00h.Прилагаемый комментарий прояснит это достаточно.
...