Консультация № 181748
05.01.2011, 11:47
54.33 руб.
0 4 1
Здравствуйте, уважаемые эксперты! Прошу Вас переделать программу под байты, массив должен выглядить в виде строки из 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 ds,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

Обсуждение

давно
Старший Модератор
31795
6196
05.01.2011, 16:59
общий
это ответ
Здравствуйте, Игорь Викторович!

Смотрите приложение.
Стандартные функции не комментировал.
Реализован ленивый алгоритм сортировки.
Вопросы задавайте в минифорум.
Удачи!

Приложение:
model small
.stack 200h
.data
len_a equ 10
a db len_a dup(?)
dbEnter db 10,13,'Enter a(10):$'
dbResult db 10,13,'Result :$'
dbPress db 10,13,'press any key$'
.code
;настраиваем сегментные регистры
begin: mov ax,@data
mov ds,ax
mov es,ax
;Просим ввести массив
mov ah,9
lea dx,dbEnter
int 21h
;
mov cx,len_a;кол-во элементов
lea di,a;адрес массива
mov ah,1;с помощью первой функции
@@01: int 21h;ДОСа вводим
and al,0fh;преводим в цифру
stosb;записываем в массив
loop @@01;в цикле
;сортировка
lea di,a;адрес массива
mov bx,len_a;кол-во элементов
shr bx,1;делим на 2
dec bx;один элемент лишний
mov dx,-1;направление движения
call sort;сортируем
add di,len_a-1;в конец массива
mov dx,1;направление движения
std;тоже
call sort;сортируем
;выводим сообщение ополученом результате
mov ah,9
lea dx,dbResult
int 21h
cld
;вывод массива
lea si,a;адрес массива
mov cx,len_a;кол-во элементов
@@02: lodsb;считываем
or al,30h;переводим в символ
int 29h;выводим
loop @@02;в цикле
;просим нажать любую клавишу
mov ah,9
lea dx,dbPress
int 21h
;ждем любую клавишу
xor ax,ax
int 16h
;выход в ДОС
mov ah,4ch
int 21h
;сортировка
sort: mov si,di;адрес массива
mov cx,bx;количество элементов
@@03: lodsb;считываем текущий элемент
cmp al,[si];проверяем с соседним элементом
ja @@04;меньше переходим
xchg al,[si];меняем элементы
add si,dx;считаем адрес соседнего элемента
mov [si],al;записываем
jmp sort;начинаем сначала
@@04: loop @@03;в цикле
ret
end begin
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
05.01.2011, 17:29
общий
программа не работает когда в одной половине массива ввожу одинаковые числа
давно
Старший Модератор
31795
6196
05.01.2011, 17:34
общий
Эту строку измените, таким образом:
Код:
jae @@04;меньше переходим

добавьте условие равно.
При равных элементах, программа зависает и постоянно меняет их местами.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
05.01.2011, 17:47
общий
благодарю
Форма ответа