![]() |
одномерный массив в ассемблере
Добрый день, кто-то может решить задачку по ассемблеру (для 086):
- в одномерном массиве из 16 байт найти минимальное значение и вывести его на индикатор. - описать работу программы в комментариях. Ибо мои познания исчерпались составлением алгоритма: 1 – вводим массив – последовательность из 16 байт произвольных данных в ds 2 – перемещаем первый элемент массива в АХ а второй в ВХ 3 – сравниваем их между собой 4 – меньший оставляем в регистре, больший замещаем следующим элементом массива 5 – повторяем цикл 15 раз 6 – после последнего сравнения содержимое регистра с минимальным элементом выводим на экран. 7 – конец программы. 8 - конец моих знаний. |
igor7
Давно я уже не кодил на асме (особенно под DOS), но попытаюсь помочь тебе. Ты не совсем четко определил условия задачи, по этому я сделаю следующие допущения: 1) Программа должна быть написана с помощью MASM; 2) Программа будет работать в среде MS DOS; 3) Все значения в массиве беззнаковые (т.е. отрицательных значений в нем нет); 4) Итоговое минимальное значение будет выводиться в шестнадцатеричном виде. 5) В итоге ты желаешь получить исполняемый COM-файл. Код:
model tiny З.Ы: Я не проверял этот код на работоспособность...;) |
Oleg_SK, спасибо тебе большое за помощь!
Я только начал изучать но языка ещё не знаю. Поработал только с Debug. Скажи а ты не мог бы дать краткие комментарии по выполняемым действиям? Очень хочу понимать что происходит при командах :) В любом случае ещё раз Спасибо тебе! |
igor7
Цитата:
Комментарий к приведенному коду: Между метками start и lo производится подготовка к циклу, в котором производится поиск минимального значения в массиве Arrey. В процессе этой подготовки делается следующее: 1) В регистр EBX заносится адрес первого элемента массива Arrey. Этот регистр будет служить для обращения к массиву. 2) Регистр ECX будет содержать счетчик цикла; в него заносится значение 0Fh (это 15 в шестнадцатеричном виде). В принципе можно вместо 0Fh использовать 15, но лучше сразу начинать привыкать пользоваться шестнадцатеричными значениями. 3) В регистр al помещается значение из первого элемента массива Arrey, а адрес в регистре EBX увеличивается на 1, чтобы указывать на следующий элемент массива. Между меткой lo и моим комментарием находится тело цикла, в котором на каждой его итерации значение очередного элемента массива сравнивается со значением в регистре al (который содержит самое маленькое из найденных на данный момент значений массива). Если новое значение оказывается меньше сохраненного в регистре al, то оно заносится в этот регистр, в противном случае происходит переход к метке cont для завершения текущей итерации цикла. При завершении итерации цикла адрес в регистре EBX увеличивается на 1, чтобы указывать на следующий элемент массива (причем на последней итерации цикла на этом этапе адрес уже выходит за пределы массива). Счетчик цикла в регистре ECX уменьшается на единицу, после чего, если он еще не достиг нулевого значения, происходит переход на метку lo для следующей итерации. В общем-то, все это в целом соответствует указанному тобой алгоритму (с п.2 по п.5); правда я вместо указанных тобой 16-ти битных регистров AX и BX использовал более соответствующие моменту 8-ми битные al и ah (которые являются составными частями регистра AX(EAX)). Конечно для оптимизации этого алгоритма по времени работы для выборки значений из массива лучше использовать 16-ти битный регистр (или 32-ух битный, что еще лучше), но тогда кол-во необходимого кода увеличится и он будет сложнее для понимания, да и особого смысла в этом в данном случае нет. Далее, между моим комметарием и последней инструкцией программы (ret) находится код печатающий найденное значение (оно находится в регистре al) на экране монитора. Тут нужно сделать небольшое отступление: массив состоит из элементов размером 1 байт (8 бит). Такой же размер имеет и регистр al, хранящий найденное мин. значение. С учетом сделанного мной допуска о беззнаковости числовых значений в элементах массива, в одном байте может храниться любое числовое значение из диапазона 0...255 (00...FF в шестнадцатеричном виде). Как можно увидеть, для отображения значения одного байта достаточно двухразрядного шестнадцатеричного числа. Теперь смотри внимательно: у шестнадцатеричного числа первый разряд является старшим, а последний младшим. Например, возьмем число 5F. Тут 5 является старшим разрядом, а F - младшим. Применительно к 8-ми битному значению (1 байтному) старший разряд шестнадцатеричного числа представлен значением старших 4 бит 8-ми битного значения (эти биты имеют номера с 7 по 4), а младший разряд соответственно представлен младшими четырьмя битами (эти биты имеют номера с 3 по 0). Обрати внимание на то, что биты в байте считаются с права на лево начиная с 0. Это я рассказал для того, чтобы ты смог понять код печатающий числовое значение на экране монитора. Теперь перейду к объяснению самого кода. Раз однобайтное число может быть представлено двухразрядным шестнадцатеричным значением, то печать выполняется в два прохода: сперва печатается старший разряд числа, а затем младший. Так как этот код печати довольно сложен для начинающего, прокомментирую его более подробно: Код:
; Следующие три инструкции предназначены для выделения из 8-ми битного значения двух 4-ех битных, которые отвечают за соответствующие разряды в шестнадцатеричном числе. Код:
model tiny ; Объявляем модель работы с памятью, необходимую для программы. Для COM-программы необходимой является модель tiny. З.Ы: Надеюсь я объяснил достаточно понятно... |
Вполне понятно :) Спасибо ещё раз!
С меня килограмм мороженого! Или варенья, на выбор :) Будешь в Киеве - заходи в гости, попьём чаю с мороженым :)) (А ассемблер я освою. Дело принципа.) |
igor7, я вот только уже очень давно не кодил на асме под MS-DOS, и по этому уже не помню: можно ли там пользоваться 32-ух битными регистрами (типа EBX, ECX т.д.)... По этому возможно тебе нужно будет заменить 32-ух битные регистры на их 16-ти битные варианты (EBX -> BX, ECX -> CX).
|
я так и сделаю.
а пока въезжаю в содержание :) Успехов тебе! |
Тебе тоже успехов в освоении асма, сайт www.wasm.ru и его форум тебе в помощь; это одна из основных тусовок ассемблерщиков в рунете...;)
|
Время: 06:52. |
Время: 06:52.
© OSzone.net 2001-