Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 1414 | Дата выхода: | 10.01.2011, 18:30 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 219 / 67 | Вопросов / ответов: | 2 / 2 | Вопрос № 181737: Здравствуйте, уважаемые эксперты! Прошу Вас переделать программу под байты... Код: Вопрос № 181748: Здравствуйте, уважаемые эксперты! Прошу Вас переделать программу под байты, массив должен выглядить в виде строки из 10 цифр или написать новую с коментариями к каждой строчке. Условие задачи: В массиве а (10) первую половину массива отсортировать... Вопрос № 181737: Здравствуйте, уважаемые эксперты! Прошу Вас переделать программу под байты...
Код: ;В массиве а(10) отсортировать все элементы по возростанию до первого кратного 7 .model small .data sEnter db 'Enter 10 numbers: ','$' sTitle db 'Sorted array: $' a dw 10 dup (?) len_a equ 10 ;число элементов sNum db 80 ;максимальный размер буфера sBuf db 80 dup (?) ;сама строка
.code
mov ax, @DATA mov ds, ax mov es, ax
push offset a ;параметром - адрес массива call GetArray ;вводим массив
;найдем число элементов до первого кратного 7 lea si, a ;адрес массива mov cx, len_a ;всего эл ементов xor bx, bx ;искомый счетчик mov di, 7 ;делим на 7 search_div7: lodsw ;очередной элемент cwd ;подготовим dx:ax к делению idiv di ;ds:ax / 7 cmp dx, 0 ;остаток есть? jz sort ;нет - разделилось нацело, идем на сортировку inc bx ;считаем loop search_div7
;отсортируем bx элементов методом пузырька sort: mov cx, bx ;число сортируемых элементов dec cx ;число сравнений lea si, a ;адрес элемента в массиве SortLoop: ;цикл по поиску очередного минимального lea di, [si+2] ;начинаем со следующего push cx ;сохраним счетчик mov ax, [si] ;текущий минимальный по адресу [si] SearchMinLoop: ;цикл по всем последующим ;сравниваем текущий со всеми последующими cmp ax, [di] ;если текущий минимальный <= последующего, jle SortNext ; то обходим обмен ;меняем местами элементы xchg ax, [di] mov [si], ax ;по адресу [si] и в ax новый минимальный SortNext: inc di i nc di ;на следующий последующий loop SearchMinLoop inc si inc si ;на следующий текущий pop cx ;восстановим счетчик сравнений loop SortLoop
print: ;выведем все элементы lea dx, sTitle mov ah, 9 int 21h ;заголовок
mov cx, len_a ;число всех lea si, a ;адрес PutLoop: lodsw ;элемент call PutNumber ;выводим loop PutLoop
mov ah, 0 int 16h ;ждем нажатие на клавишу
mov ax, 4c00h ;выход в ДОС int 21h
PutNumber proc ;преобразование числа из ax в строку и вывод на экран push cx bx ;сохраним использованые регистры xor cx, cx ;счетчик разрядов mov bx, 10 ;делим на 10 DivLoop: ;цикл преобразования в разряды cwd ;подготавливаем dx:ax к делению idiv bx ;dx = очередному младшему разряду push dx ;сохраним в стеке inc cx ;считаем cmp ax, 0 ;продолжаем, пока не дойдем до 0 jnz DivLoop PrLoop: ;цикл вывода в обратном порядке pop a x ;берем число 0-9 из стека or al, '0' ;преобразовываем в символ '0'-'9' int 29h ;выводим loop PrLoop mov al, ' ' int 29h ;отделим пробелом pop bx cx ret PutNumber endp
GetArray proc pArray:word ;ввод массива local pLast:word ;переменная для сравнения на конец
push bp mov bp, sp ;адресуем параметр через [bp+4] sub sp, 2 ;2 байта под локальную переменную pLast
lea dx, sEnter mov ah, 9 int 21h ;приглашение на ввод элементов массива
mov di, pArray ;адрес массива
mov ax, len_a ;адрес за массивом (для контроля конца) shl ax, 1 add ax, pArray mov pLast, ax ;сохраним GA_ask: mov ah, 2 mov dl, 0ah int 21h ;переход на новую строку
lea dx, sNum mov ah, 0ah int 21h lea si, sBuf ;строка с числами, разделенная разделителями
GA_next: cmp di, pLast ;массив заполнен? je GA_ret
call stoi ;[si] -> ax jcxz GA_ask ;дошли до конца строки? stosw ;сохраняем jmp GA_next ;на следующее число в строке GA_ret: mov sp, bp ;восстановим вершину стека pop bp ;восстановим старое значение bp ret GetArray endp
;функция преобразовывает числовую строку в число ;преобразование заканчивается по любому разделителю или концу строки (0dh) ;признаком конца строки является cx = 0 stoi proc ;преобразование строки [si] в беззнаковое число AX push dx xor bx, bx ;здесь будем стоить число xor cx, cx ;счетчик разрядов stoi_next: lodsb ;очередной символ cmp al, 0dh ;конец стоки? je stoi_eol cmp al, '0' jb stoi_sep ;любая нецифра - разделитель cmp al, '9' ja stoi_sep push ax ;сохраним новый разряд mov ax, 10 mul bx ;умножим старшие на 10 pop dx ;новый and dx, 0fh ;'0'-'9' -> 0-9 add ax, dx ;добавляем новый разряд mov bx, ax ;сохраняем inc cx ;считаем jmp stoi_next ;продолжаем stoi_sep: ;встретили разделитель jcxz stoi_next ;были только разде лители - на продолжение ; иначе - конец числа и выходим stoi_eol: ; если числа нет и встретили 0dh - конец строки mov ax, bx ;число возвращаем в ax dec si ;шаг назад, чтобы легче было проанализировать 0dh pop dx ret stoi endp
end Отправлен: 04.01.2011, 18:43 Вопрос задал: Евтеев Алексей Николаевич (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, Евтеев Алексей Николаевич! Вот Вам пограмма. Если что непонятно, обращайтесь в мини-форум. Код: ;В массиве а(10) отсортировать все элементы по возрастанию до первого, кратного 7
.model small .stack 512 .data strA db 'Enter 10 numbers: $' sTitle db 0dh,0ah,'Sorted array: $' strAny db 0dh,0ah,'Press any key$' lenA equ 10 ;длина строки A db lenA dup (?) ;строка
.code start: mov ax, @data mov ds, ax mov es, ax
lea dx, strA mov ah, 9 int 21h ;строка приглашения для ввода А
lea di, A ;адрес массива А mov cx, lenA ;длина массива А c1: mov ah, 8 ;функц ия ввода кода без отображения c2: int 21h cmp al, '0' ;проверка на цифру jb c2 ;нецифру игнорируем cmp al, '9' ja c2 mov dl, al ;сохраним для вывода and al, 0fh ;превратим в число stosb ;сохраним mov ah, 2 ;функция вывода символа из dl int 21h loop c1 ;по всем
;найдем число элементов до первого кратного 7 lea si, A ;адрес массива mov cx, lenA ;всего элементов xor bx, bx ;искомый счетчик mov dl, 7 ;делим на 7 search_div7: lodsb ;очередной элемент cbw ;подготовим ax к делению idiv dl ;ax / 7 cmp ah, 0 ;остаток есть? jz sort ;нет - разделилось нацело, идем на сортировку inc bx ;считаем loop search_div7
;отсортируем bx элементов методом пузырька sort: mov cx, bx ;число сортируемых элементов dec cx ;число сравнений lea si, a ;адрес элемента в массиве SortLoop: ;цикл по поиску очередного минимального lea di, [si+1] ;начинаем со следующего push cx ;сохраним счетчик mov al, [si] ;текущий минимальный по адресу [si] SearchMinLoop: ;цикл по всем последующим ;сравниваем текущий со всеми последующими cmp al, [di] ;если текущий минимальный <= последующего, jle SortNext ; то обходим обмен ;меняем местами элементы xchg al, [di] mov [si], al ;по адресу [si] и в al новый минимальный SortNext: inc di ;на следующий последующий loop SearchMinLoop inc si ;на следующий текущий pop cx ;восстановим счетчик сравнений loop SortLoop
print: ;выведем все элементы lea dx, sTitle mov ah, 9 int 21h ;заголовок
mov cx, lenA ;число всех lea si, a ;адрес mov ah, 2 PutLoop: lodsb ;элемент or al, '0' mov dl, al int 21h ;выводим loop PutLoop
lea dx, strAny mov ah, 9 int 21h ;строка приглашения нажатия на любую клавишу
mov ah, 8 int 21h ;ждем нажатие на клавишу
mov ax, 4c00h ;выход в ДОС int 21h
end start
----- Люби своего ближнего, как самого себя Ответ отправил: Лысков Игорь Витальевич (Старший модератор) Ответ отправлен: 05.01.2011, 02:37 Номер ответа: 265239 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Оценка ответа: 5 Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 265239 на номер 1151 (Россия) | Еще номера » | Вопрос № 181748: Здравствуйте, уважаемые эксперты! Прошу Вас переделать программу под байты, массив должен выглядить в виде строки из 10 цифр или написать новую с коментариями к каждой строчке. Условие задачи: В массиве а (10) первую половину массива отсортировать по убыванию, вторую по возрастанию. Массив вводим с консоли, вывод на экран делаем. ( среда, ассемблер 16 битный под DOS , tasm и tlink , использовать модель памяти small). Сама программа: Код: model small n equ 10 stack 100h .data a dw n dup(?) dbEnter db 10,13,'Enter a(' numb db '0):$' dbResult db 10,13,'Result:$' .code ;настраиваем сегментные регистры begin: mov ax,@data mov d s,ax mov es,ax ;устанавливаем количество элементов и адрес массива mov cx,n lea di,a ;в цикле вводим один элемент @@01: call InputNumber stosw;записываем введенное число в память ;изменяем индекс массива inc byte ptr[numb]увеличиваем выводимый индекс массива loop @@01 ;устанавливаем исходные данные ;для сортировки убыванию lea bx,a+n-2;устанавливаем базовый адрес mov di,-n;устанавливаем индекс mov dx,2;устанавливаем напрвление движения call sort ;устанавливаем исходные данные ;для сортировки возрастанию lea bx,a+n;устанавливаем базовый адрес mov di,n;устанавливаем индекс mov dx,-2;устанавливаем напрвление движения call Sort ;выводдим сообщение о выполненой работе mov ah,9 lea dx,dbResult int 21h ;устанавливаем количество элементов и адрес массива mov cx,n lea si,a ;выводим в цикле весь массив @@04: lodsw call OutputNumber loop @@04 ;ждем любую клавишу и выходим xor ax,ax int 16h mov ax,4c00h int 21h ;подпрограмма сортировки ;проверяем первый индекс массива Sort: add di,dx;добавляем шаг jz S_2;ноль сортировка закончилась ;загружаем значение текущего элемента mov ax,[bx+di];провряемое значение mov si,di;текущий указатель ;проверяем второй индекс массива S_1: or si,si;ноль - заканчиваем проверку jz Sort add si,dx;следующее значение ;проверяем с текущим элементом cmp ax,[bx+si];проверяем с очередным значением ja S_1 ;производим замену элементов xchg ax,[bx+si] mov [bx+di],ax jmp short S_1 S_2: ret ; ;вывод одного числа OutputNumber: push cx mov bx,10;система счисления xor cx,cx;счетчик цифр в числе ;делим на 10 и остаток помещаем в стек O_N: xor dx,dx div bx;получаем остаток от деления push dx;запоминаем в стеке inc cx;считаем число запомненый цифр or ax,ax;п родолжаем пока АХ не равно нулю jnz O_N ;30h-10h=20h, код символа пробел mov ax,-10h ;добавляем в стек символы разделители O_N_1: push ax;запомнаем в стеке служебный код пробела inc cx;увеличиваем счетчик cmp cx,5;выравниваем счетчик до 5-ти цифр jb O_N_1 ;извлекаем из стека в нужном порядке цифры @@O_N: pop ax;извдекаем из стека цифру add ax,'0';добавляем код символа "ноль" int 29h;выводим на экран loop @@O_N;в цикле пока СХ больше нуля pop cx ret ; ;подрограмма ввода одного числа ;приглашаем ввести одно число InputNumber: lea dx,dbEnter mov ah,9 int 21h ;устанавливаем введеное число в ноль и систему счисления xor si,si;тут будет суммироватся вводимое число mov bx,10;система счисления ;считываем один символ без отображения на экране I_N: xor ax,ax int 16h ;проверяем клавишу ВВОД и цифровые, остальные игнорируем cmp al,13;клавиша ввод jz @@i_N cmp al,'0';меньше 0 игнорируем jb I_N cmp al,'9';больше 9 игнорируем ja I_N ;цивровая к лавиша - выводим символ int 29h ;умножаем ранее веденное значение на 10-ть and ax,0fh;АХ=0-:-9 xchg ax,si;si:=0-:-9, AX=ранее веденное число xor dx,dx mul bx;АХ умножаем на ВХ, т.е. АХ=АХ*10 ;суммируем с последней введенной цифрой add si,ax;;si:=(0-:-9) + АХ*10 jmp short I_N;продолжаем ввод текущего числа ;выход результат в АХ @@I_N: mov ax,si;ввод закончен, в АХ- текущее число ret end begin Отправлен: 05.01.2011, 11:47 Вопрос задал: Игорь Викторович (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Зенченко Константин Николаевич (Модератор) : Здравствуйте, Игорь Викторович! Смотрите приложение. Стандартные функции не комментировал. Реализован ленивый алгоритм сортировки. Вопросы задавайте в минифорум. Удачи! Приложение: ----- Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч Ответ отправил: Зенченко Константин Николаевич (Модератор) Ответ отправлен: 05.01.2011, 16:59 Номер ответа: 265247 Украина, Киев Тел.: +38-097-238-60-03 Адрес: Украина, Киев Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 265247 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий