Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2666
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2263
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1318
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска: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 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 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 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное