![]() |
|
Модераторы: Poseidon |
![]()
|
|
| svs888 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.11.2009 Где: Россия Репутация: нет Всего: нет |
Помогите пожалуйста написать прогу на ассемблере:
Используя процедуру поиска минимального элемента, упорядочить массив. |
|||
|
||||
| airyashov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 1 Всего: 6 |
помогу недорого, на чем писать tasm?
-------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
|||
|
||||
| svs888 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.11.2009 Где: Россия Репутация: нет Всего: нет |
А что у нас с альтруизмом?
|
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 13 Всего: 23 |
tasm/masm, windows/dos, в выводом/вводом массива или без?
|
|||
|
||||
| svs888 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.11.2009 Где: Россия Репутация: нет Всего: нет |
Если честно, я не совсем понимаю о чем вы меня спрашиваете.
У меня задание: написать программу в far, сохранить с расширением *.asm, этого будет достаточно. Ввод/вывод массива нужен, а как же без этого. И желательно описать каждую строчку, действие, а то я в ассемблере ни бум-бум. |
|||
|
||||
| svs888 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.11.2009 Где: Россия Репутация: нет Всего: нет |
Выкладываю, хватайте кому надо:
TITLE lab1 ; заголовок DATASG SEGMENT 'data' ; описание сегмента данных mas db -1,2,3,4,-5,6,7,8 ; массив байт size_mas=$-mas ; вычисление размера массива outbuf db 5 dup(?),' $' ; буфер для перевода числа в строку и вывода на экран DATASG ENDS ; конец сегмента данных STACKSG SEGMENT STACK 'stack' ; описание сегмента стека db 256 dup(0) ; резервируем память под стек STACKSG ENDS ; конец сегмента стека CODESG SEGMENT 'code' ; описание сегмента кода ASSUME cs:CODESG, ds:DATASG, ss:STACKSG ; сопоставление сегментных регистров сементам Find_min_index PROC FAR ; процедура поиска индекса минимального элемента в массиве ; передаются параметры адрес массива и размер, через стек push bp ; сохранить в стеке mov bp,sp ; доступ к переданным переменным через bp push ax ; сохранить в стеке используемые регистры push si push di push bx mov bx,[bp+8] ; адрес массива mov si,[bp+6] ; количество элементов и индекс в массиве xor di,di ; индекс в массиве start_find_min: sub si,1 ; начанаем с конца искать движемся к началу jbe end_find_min ; если дошли до первого, то окончен поиск mov al,bx[si] ; взять элемент массива cmp al,bx[di] ; сравнить с минимумом jg start_find_min ; если al>минимума, то продолжить цикл mov di,si ; иначе заменить индекс минимального jmp start_find_min ; продолжить цикл end_find_min: mov [bp+8],di ; результат вычисления вернуть через стрек pop bx ; восстановить из стека pop di pop si pop ax pop bp retf 2 ; возврат из процедуры отчистить стек Find_min_index ENDP PrintByte proc ;Вывод числа, размер числа байт, параметр в al push ax ; поместить используемые регистры в стек push bx push si push cx ;заполнить буфер пробелами mov cx,5 ; количество элементов в буфере mov si,offset outbuf; адрес буфера Space: mov byte ptr [si],' ' ; записать пробел inc si ; перейти к следующему элементу loop Space push ax ; сохранить в стеке @asb: ; взять по модулю neg al js @asb mov si, offset outbuf[4]; адрес буфера для вывода mov bx, 10 ; коэффициент для деления make_str: xor ah,ah ; ah=0 div bl ; al=ax/bl or ah,30h ; преобразовать цифру в символ dec si ; перейти к следующему символу mov [si],ah ; сохранить в строке test al, al ; проверить ax=0? jnz make_str ; если не равен, то далее выражать цифры pop ax ; извлечь из стека test al,al ; проаерить знак jns PrnScr dec si ; перейти к следующему символу mov byte ptr [si],'-' ; сохранить в строке знак числа PrnScr: mov ax, 0900h ; вывести число mov dx, offset outbuf ; адрес строки вывода int 21h ; вызов DOS pop cx ; извлечь используемые регистры из стека pop si pop bx pop ax ret ;возврат из процедуры PrintByte endp start: ; точка входа mov ax, DATASG ; инициализация сегмента данных mov ds, ax ;вывод на экран исходного массива mov cx,size_mas ; bx=размер массива xor bx,bx ; bx=0 индекс для доступа к элементам pr_s: mov al, mas[bx] ; считать элемент массива call PrintByte ; вывести на экран inc bx ; перейти к следующему элементу массива loop pr_s ; продолжить цикл mov bx,size_mas ; bx=размер массива cmp bx,2 ; проверить размер массива >2 jb exit_prog ; если меньше выйти из программы, нечего сортировать ; иначе сортируем next_c: push offset ds:[mas]; параметры для процедуры, адрес массива push bx ; количество элементов call Find_min_index ; вызов процедуры pop di ; получить результат из процедуры, индекс минимального sub bx,1 ; bx=bx-1 mov al,mas[bx] ; запомнить текущий элемент массива xchg al,mas[di] ; обменить с минимальным mov mas[bx],al cmp bx,1 ; дошли до самого первого элемента jbe enc_c ; да, завершить цикл jmp next_c ; продолжить цикл enc_c: mov al,10 ; переход на новую строку int 29h ; вывод al на экран mov al,13 int 29h ; вывод al на экран ;вывод на экран полученного массива mov cx,size_mas ; bx=размер массива xor bx,bx ; bx=0 индекс для доступа к элементам pr_d: mov al, mas[bx] ; считать элемент массива call PrintByte ; вывести на экран inc bx ; перейти к следующему элементу массива loop pr_d ; продолжить цикл mov ax,0c07h ; функция DOS ожидаем нажатие клавиши int 21h exit_prog: ;выход из программы mov ax,4c00h ; функция DOS завершение программы int 21h ; вызов DOS CODESG ENDS ; конец сегмента кода END start ; конец программы, указание точки входа |
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |