|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
FileName db “Введите имя файла:”, 13, 10, 0
Раз последний байт этой строки ноль, то это – sz-строка.
На бумаге написать цикл, который позволяет определить длину строки.
Чтобы заставить процессор бесконечно повторять какую-то последовательность команд, можно организовать безусловный (без проверки любых условий) возврат к ее началу: Povtor: Команда1 Команда2 Команда3 КомандаN JMP Povtor Здесь Povtor – метка возврата, JMP Povtor – команда безусловного перехода на метку Povtor. Разумеется, если процессор начнет выполнять такой цикл, то сам собой он не прекратится никогда, внешне это будет выглядеть как «зависание» программы. Поэтому такие циклы реально не применяются. Надо вставить в цикл команды выхода по какому-нибудь условию, тогда применять можно. Как «посетить» каждый символ строки? С помощью «бегущего указателя». Им может быть любой регистр общего назначения (eax, ebx, ecx, edx, esi, edi). Например, возьмем ecx. До входа в цикл присвоим ему адрес начала строки, то есть ее первого символа: Mov ecx, offset Filename Здесь offset – директива взятия адреса метки. Будем в каждом повторе тела цикла увеличивать есх на 1, чтобы он «сдвигался» на очередной символ. Это команда инкремента inc ecx. Но эту «сдвижку» надо прекратить, когда регистр-указатель есх укажет на ноль-байт, это конец строки. Чтобы узнать, попали ли мы на ноль-байт, надо сначала выполнить сравнение Cmp byte ptr [ecx], 0 Здесь [ecx] – это байт, на который указывает есх (скобки [] означают разадресацию). Слова byte ptr приказывают процессору считать число в есх указателем на одиночный байт (а не, предположим, слово или двойное слово). Если это сравнение (а оно по сути есть вычитание) покажет равенство этих величин, то команда JE метка_выхода отреагирует на факт выполнения этого условия и «выбросит» исполнение на метку_выхода, котрую надо разместить где-нибудь за пределами цикла. Ну, и что у нас получается на данный момент, если всю эту премудрость свести вместе? А вот что. Mov ecx, offset Filename povtor: Cmp byte ptr [ecx], 0 JE metka_vyhoda Inc ecx JMP povtor metka_vyhoda: Чтобы сосчитать число повторов этого цикла (а это и есть количество символов в строке, то есть ее длина), нужно использовать какой-нибудь счётчик, ну, к примеру, регистр edx. До входа в цикл его надо обнулить, а перед каждым переходом на следующий символ его надо увеличивать на 1. На выходе из цикла этот счетчик и будет содержать длину строки. Mov edx, 0; сброс счетчика Mov ecx, offset Filename povtor: Cmp byte ptr [ecx], 0 JE metka_vyhoda Inc ecx; на след символ Inc edx; счетчику +1 Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.) |