Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике Номер выпуска: | 1494 | Дата выхода: | 08.12.2011, 22:00 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 186 / 63 | Вопросов / ответов: | 1 / 2 | Консультация # 184656: Уважаемые эксперты! Требуется решить следующую задачку на Assembler (TASM): "В каждой пятерке массива а(15) найти второй по величине элемент, умножьте его на 2. Организовать массив b(3) из этих элементов". Заранее спасибо!... Консультация # 184656: Уважаемые эксперты! Требуется решить следующую задачку на Assembler (TASM): "В каждой пятерке массива а(15) найти второй по величине элемент, умножьте его на 2. Организовать массив b(3) из этих элементов". Заранее спасибо! Дата отправки: 02.12.2011, 22:30 Вопрос задал: Sanek (Посетитель) Всего ответов: 2 Страница онлайн-консультации » Консультирует Кривенко Евгений Владимирович (7-й класс): Здравствуйте, Sanek! вот решение для 32х битных элементов массива a, в диапазоне от 0 до 2^31 для без знаковых элементов и от -2^30 до 2^30-1 для знаковых: Приложение:
Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Sanek! Вот Вам полностью функциональная 16-битная программа со вводом и выводом.
Код : ;В каждой пятерке массива а(15) найти второй по величине элемент, ;умножьте его на 2. Организовать массив b(3) из этих элементов code segment 'code' ;начало сегмента кода assume cs:code,ds:data,ss:stk main proc mov ax, data mov ds, ax mov es, ax Input: call InputA ;вводим массив А jz ToFormB ;проверим размер числа lea dx, sNumError ;число превысило 32767 mov ah, 9 int 21h jmp Input ;на повтор ввода ToFormB: call FormB ;формируем В call OutputB ;выводим В PrintAny: lea dx, sAny ;press any key mov ah, 9 int 21h mov ah, 0 int 16h ;ждем any key mov ax, 4c00h int 21h ;выход в ДОС main endp InputA proc ;вводим А lea dx, sEnterA mov ah, 9 int 21h ;приглашение на ввод элементов массива A lea di, A ;адрес А lea bp, [di+15*2] ;адрес за массивом (для контроля конца) IA_ask: lea dx, sNum ;приглашаем ко вводу mov ah, 0ah int 21h lea si, sBuf ;строка с числами, разделенная разделителями cld IA_next: cmp di, bp ;массив заполнен? je IA_ok call stoi ;[si] в число jc IA_err ;ошибка разрядности? jcxz IA_newrow ;дошли до конца строки? stosw ;сохраняем jmp IA_next ;на следующее число в строке IA_newrow: mov ah, 2 mov dl, 0ah int 21h ;переход на новую строку jmp IA_ask ;на запрос новой строки IA_err: or ax, 1 ;FZ == 0 -> ошибка размерности IA_ok: ret ;FZ == 1 -> все ок InputA endp FormB proc ;формируем массив В lea si, A lea di, B mov cx, 3 ;3 пятерки GroupsLoop: push cx mov cx, 5 ;число элементов в группе xor dx, dx ;максимальное xor bx, bx ;"предмаксимальное" OneGroupLoop: lodsw cmp ax, bx ;сравним с предмаксимальным jbe OneGroupNext ;<= - идем дальше cmp ax, dx ;сравним с максимальным je OneGroupNext ;одинаковые пропускаем jb SetPrev ;меньше - сохраняем, как новый предмаксимальный mov bx, dx ;больше - старый максимальный, как предмаксимальный mov dx, ax ;новый, как новый максимальный jmp OneGroupNext SetPrev: mov bx, ax ;новый предмаксимальный OneGroupNext: loop OneGroupLoop mov ax,bx ;предмаксимальный shl ax, 1 ;умножаем на 2 stosw ;сохраняем pop cx loop GroupsLoop ret FormB endp OutputB proc ;выводим В lea dx, sResult mov ah, 9 int 21h ;вывод заголовока из dx xor cx, cx ;счетчик элементов OB_loop: lodsw ;очередное значение call itoa ;вывод числовой строки inc cx ;считаем cmp cx, 3 ;вывели 3? je OB_ret mov dl, ',' ;разделим запятой int 21h ;ah = 2 jmp OB_loop OB_ret: ret OutputB endp itoa proc ;вывод беззнакового числа из ax push cx ;сохраним счетчик колонок mov bx, 10 ;будем делить на 10 xor cx, cx ;счетчик цифр DivLoop: xor dx, dx ;готовимся к делению dx:ax / bx div bx ;ax - частное, dx - остаток=очередной младшей цифре push dx ;сохраним цифру в стеке inc cx ;посчитаем test ax, ax ;продолжим, пока не 0 jnz DivLoop mov ah, 2 ;функция вывода PrintLoop: ;будем выводить в обратном порядке, начиная со старшей шифры pop dx ;восстановим очередной разряд or dl, '0' ;превратим в символ int 21h ;выведем loop PrintLoop pop cx ;восстановим счетчик элементов ret itoa endp stoi proc ;преобразование строки [si] в число AX 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 test dx, dx pop dx ;новый jnz stoi_err test ax, ax js stoi_err and dx, 0fh ;'0'-'9' -> 0-9 add ax, dx ;добавляем новый разряд js stoi_err mov bx, ax ;сохраняем inc cx ;считаем jmp stoi_next ;продолжаем stoi_sep: ;встретили разделитель jcxz stoi_next ;были только разделители - на продолжение ; иначе - конец числа и выходим stoi_eol: ; если числа нет и встретили 0dh - конец строки mov ax, bx ;число возвращаем в ax dec si ;шаг назад, чтобы легче было проанализировать 0dh clc ret stoi_err: stc ret stoi endp code ends data segment sEnterA db 'Enter A (15 numbers): $' sResult db 0dh,0ah,'B = $' sNumError db 0dh,0ah,'Numbers must be < 32768',0dh,0ah,'$' sAny db 0dh,0ah,'Press any key$',0 sNum db 80 len db ? sBuf db 80 dup (?) A dw 15 dup (?) B dw 3 dup (?) data ends stk segment stack dw 100h dup (?) stk ends end main
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка | восстановить логин/пароль Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий