8086 Машинный язык: простая программа не работает

Пытаюсь отобразить свое имя и ввод символа через машинный язык 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

person Dillon Shotwell    schedule 24.09.2018    source источник
comment
Код не был опубликован.   -  person Scott Hunter    schedule 25.09.2018
comment
@ScottHunter отредактировано   -  person Dillon Shotwell    schedule 25.09.2018
comment
@zx485 отредактировано.   -  person Dillon Shotwell    schedule 25.09.2018
comment
Возьмите за правило включать код в виде текста в раздел кода, а не в виде изображения. Последнее совершенно бесполезно для формирования минимально воспроизводимого примера, поэтому его лучше избегать.   -  person zx485    schedule 25.09.2018
comment
Взгляните на список прерываний Ральфа Брауна, чтобы узнать, как правильно использовать INT 21h . Это должно помочь вам большое время. P.S.: Не забудьте установить сегмент данных DS сразу после Start, если вы не создаете файл .COM, как указано с помощью org 100h(.COM), а вместо этого используете разделы (.EXE).   -  person zx485    schedule 25.09.2018
comment
Также не забудьте либо отсчитать длину строки, либо включить завершающий символ.   -  person Davislor    schedule 25.09.2018
comment
есть много проблем с вашим кодом, как насчет того, чтобы сделать шаг назад и сначала проверить некоторые рабочие примеры/учебники, а затем постепенно модифицировать их шаг за шагом, наблюдая, что работает, а что нет и почему...?   -  person Ped7g    schedule 25.09.2018


Ответы (1)


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), поэтому повторять это действие бесполезно.
  • Поскольку завершающий $ для второго сообщения помещается за увеличивающимся char, все это было выведено одним вызовом функции DOS 09h.
  • Завершение вашего последнего сообщения возвратом каретки/переводом строки определенно лучше.
  • Старайтесь не писать лишних комментариев. Они усложняют чтение и понимание программы.
  • По возможности комбинируйте такие операции, как mov ah, 4Ch и mov al, 0, которые так же легко могут быть записаны как mov ax, 4C00h. Сопровождающий комментарий прояснит это достаточно.
person Fifoernik    schedule 27.09.2018