С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
 Аватар для dserp18
28 / 13 / 1
Регистрация: 20.01.2013
Сообщений: 145
Записей в блоге: 8

Вывод первого символа строки

14.09.2018, 09:40. Показов 4105. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Эта инструкция
Assembler
1
2
mov ah, 3fh 
int 21h
заносит введённую строку в начало сегмента данных (по адресу ds:[0000])
Почему эта программа
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
code segment
assume cs:code
 start:
  mov ah, 3fh    ; Функция ввода
  int 21h
  mov    ah,2
  mov    dl,ds:[0000] 
int 21h 
;Exit
 mov AX,4C00h
 int 21h 
ret
выводит не тот символ (например, вместо z выводит =), хотя в дебагере всё нормально
(для z в dl загружается 7A, т.е. в dx у меня 007A )
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.09.2018, 09:40
Ответы с готовыми решениями:

Вывод кодов ascii каждого символа строки
Вводится строка символов (буквы, цифры). Нужно вывести их коды ascii, а не сами символы (как в этом примере) .stack 100h .data ...

Ввод с клавиатуры и вывод на экран символа и строки
1. Напишите программу на языке ассемблера, которая: - вводит с клавиатуры произвольный символ; - выводит введен символ на экран; -...

Вывод 1-го символа вместо строки в видеорежиме
CSEG segment org 100h begin: mov ax,0B800h mov es,ax mov di,0 mov ah,31 mov al,byte ptr Message mov cx,11

6
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8647 / 4482 / 1669
Регистрация: 01.02.2015
Сообщений: 13,889
Записей в блоге: 12
14.09.2018, 10:57
mov dl,ds:[0000] помещает в DL значение по адресу ds:[0000]. А функция ввода требует адрес буфера в DX.
Если уж хочется разместить буфер с ячейки 0000, то mov dx, 0
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
14.09.2018, 12:16
Цитата Сообщение от dserp18 Посмотреть сообщение
Почему эта программа . . . хотя в дебагере всё нормально

Читайте мануалы.
При запуске программы регистр DS указывает на префикс программы, Вы регистр никак не перенастраиваете. Префикс программы, это системная область, которая доступна программе, только для чтения. и я не думаю, что ОСь даст Вам туда, что-то записать.
При запуске без дебагера, запись в эту область просто игнорируется и Вы выводите символ с кодом CDh = "=', если выведите следующий символ, то там будет пробел, а вместе это CDh 20h = int 20h первые два байта префикса. Если подумать, то в эту область можно таки записать, но это уже другая тема.

Под дебагером, область префикса программы воспринимается просто как некий адресуемый участок памяти, поэтому все и получается, но если попытаетесь записать в память занятую отладчиком, получите аналогичный результат(см. выше)
Миниатюры
Вывод первого символа строки  
1
 Аватар для dserp18
28 / 13 / 1
Регистрация: 20.01.2013
Сообщений: 145
Записей в блоге: 8
14.09.2018, 13:00  [ТС]
Спасибо. А сколько префикс занимает места в ds? Можно ли записать данные после префикса?
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
14.09.2018, 14:09
Лучший ответ Сообщение было отмечено dserp18 как решение

Решение

Я Вам уже говорил

На миниатюре видно, что: CS=26E0,DS=26D0, ES=26D0, SS=26E0.
При загрузке программы префикс программы(PSP) находится сразу перед сегментом кода или сегментом данных. У Вас нет сегмента данных, поэтому получается так:
Физический адрес в памяти вычисляется как xS*16+OFFSET.
CS = 26E0*1616+000016 = 26E0016
DS = 26D0*1616+000016 = 26D0016
разница и даст размер PSP, т.е. 10016=25610

Но Вы должны понимать, что есть разные модели организации программы:
TINY - код, данные и стек размещаются в одном и том же сегменте размером до 64 Кб. Эта модель памяти чаще всего используется при написании на ассемблере небольших программ;
SMALL - код размещается в одном сегменте, а данные и стек - в другом (для их описания могут применяться разные сегменты, но объединенные в одну группу). Эту модель памяти также удобно использовать для создания программ на ассемблере;
COMPACT - код размещается в одном сегменте, а для хранения данных могут использоваться несколько сегментов, так что для обращения к данным требуется указывать сегмент и смещение (данные дальнего типа);
MEDIUM - код размещается в нескольких сегментах, а все данные - в одном, поэтому для доступа к данным используется только смещение, а вызовы подпрограмм применяют команды дальнего вызова процедуры;
LARGE и HUGE — и код, и данные могут занимать несколько сегментов;
FLAT - то же, что и TINY, но используются 32-битные сегменты, так что максимальный размер сегмента, содержащего и данные, и код, и стек, - 4 Мб.
То как Вы описываете сегменты
Assembler
1
code segment
Это сокращенная форма записи полной формы:
Assembler
1
имя_сегмента segment readonly выравн. тип разряд 'класс'
Но такое определение сегментов "устарело", и при определении модели организации программы:
Assembler
1
.model модель,язык,модификатор
где модель - одно из выше перечисленных TINY . . . FLAT
Будут доступны упрощенные формы определения сегментов .code, .data, .stack и другие, которые компилятором понимаются как полная форма записи по умолчанию.

Чтобы все это понимать Вам нужно и , т.е. учится, учится и учится( слова не мои )

Как программа хранится на диске, как выделяет память системный загрузчик под программу, что куда загружает, как передает управление программе и ещё куча всячины. Это все Вы должны сами вычитывать из книжек. Чтобы всё это написать - это страниц 200-ти без "воды" минимум. А мне клавиатуру жалко.

ps:все цитаты взяты из книги Зубков С. Assembler для DOS, Windows и UNIX
2
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
15.09.2018, 00:17
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Префикс программы, это системная область, которая доступна программе, только для чтения. и я не думаю, что ОСь даст Вам туда, что-то записать.
Ну это-же мир MS-DOS. Не было там механизмов ограничения доступа к памяти. Пиши куда хошь, а если что, так кнопка сброса на морде компьютера есть.
Проблема ТС-а не в этом. А в том, что перед этим
Цитата Сообщение от dserp18 Посмотреть сообщение
mov ah, 3fh ; Функция ввода
int 21h
он не определил BX CX DX, т.е. не определил откуда читать, сколько и куда читать. Под отладчиком ему попались удачные начальные значения этих регистров и все как-то сработало, ну а при запуске программы отдельно они оказались неудачными.
1
 Аватар для dserp18
28 / 13 / 1
Регистрация: 20.01.2013
Сообщений: 145
Записей в блоге: 8
15.09.2018, 08:54  [ТС]
Определил BX, CX, Dl - заработало
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.09.2018, 08:54
Помогаю со студенческими работами здесь

Ввод и вывод в программе символа конца строки (доллара), tasm
Помогите пожалуйста отредактировать программу, чтобы она корректно работала при вводе и выводе символа доллара. Условие программы...

Поиск первого вхождения символа в строку
Процедура Str_scan производит сканирование строки для поиска первого вхождения определенного символа. Входные параметры в ES:DI содержат...

Ввод символа, очистка экрана, вывод символа в центре экрана
Вывести приглашение к вводу символа, ввести символ, вывести введенный символ в центре очищенного экрана.

[masm32] Поиск и замена первого вхождения символа в строку
Здравствуйте. Господа программисты, есть код написанный мной при помощи masm32 под windows, вот я приведу его на ваш суд: .386 ...

Ввод и вывод строки с заменой символа "a" на "A"
Добрый день, в ассемблере чайник полный Рабочий код, который заменяет в ГОТОВОЙ строке символ а на А. Но мне нужно сделать ввод...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru