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

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

14.09.2018, 09:40. Показов 4147. Ответов 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
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,931
Записей в блоге: 13
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
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru