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
.Прилагаемый комментарий прояснит это достаточно.