Консультация № 181735
04.01.2011, 17:28
55.00 руб.
0 18 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Помочь с решением задачи на ассемблере ( среда, ассемблер 16 битный под DOS , tasm и tlink , использовать модель памяти small) : В строке из 20 элементов в каждой четверке найти max элемент из четных элементов с нечетными индексами и выявить из них min элемент с четным индексом.
Просьба написать пояснение к операторам в программе .
Вот пример одной из програмы в данной среде.

Приложение:
.model small
.stack 48
.data
string db 10 dup (?),'$'
chet db 5 dup (?)
nech db 5 dup (?)
ic db 0
it db 0
.code
mov ax,@data
mov ds,dx
mov es,ax
mov ss,ax
lea di,string
mov cl,10
mov ah,1
c1: int 21h
and al,ofh
sosb
loop c1
mov bl,2
mov bh,3
lea si,string
lea di,chet
lea bp,nech
mov cl,10
mov dh,0
c2: xor ax,ax
lodsb
mov dl,al
div bl
cmp ah,0
je cd
xor ax,ax
mov al,dl
div bh
cmp ah,0
je nd
jmp cc
cd: xor ax,ax
mov al,dh
div bl
cmp ah,0
jne c06
mov al,dl
or al,30h
stosb
inc ic
jmp cc
c06: cmp dl,0
je n06
cmp dl,6
je n06
cmp cc
nd: xor ax,ax
mov al,dh
div bl
cmp ah,0
je cc
n06: or dl,30h
mov [bp],dl
inc bp
inc it
cc: inc dh
loop c2
mov cl,ic
lea si,chet
lea di,string
rep movsb
mov cl,it
lea si,nech
rep movsb
mov al,'$'
mov ah,'^'
sc: scasb
jz vyvod
dec di
mov [di],ah
inc di
jmp sc
vyvod: mov dl,10
mov ah,2
int 21h
lea dx,string
mov ah,9
int 21h
mov ah,4ch
int 21h
end

Обсуждение

Неизвестный
04.01.2011, 20:42
общий
какое то немного запутанное условие

"В строке из 20 элементов в каждой четверке найти max элемент из четных элементов с нечетными индексами и выявить из них min элемент с четным индексом."

"В строке из 20 элементов в каждой четверке" - то есть массив из 20 байтов разбивается на блоки по 4 байта, в результате 20/4=5 блоков
читаем дальше
"max элемент из четных элементов с нечетными индексами"
пусть a,b,c,d - одна из четверок
тогда нечетные индексы будут у элементов a и c, проверяем значения элементов a и c на четность, если a и c оба четные, то выбираем максимальный
а если a и c нечетные? что делать в этом случае?

пожалуйста проверьте правильность условия
давно
Посетитель
7438
7205
04.01.2011, 21:25
общий
Мне, например, понятно Накручено, но понятно. Понятно, что не все max и min могут быть, но, в таком случае, или игнорируем, или выдаем сообщение и никаких проблем... Сделаете? Нет, так я сам сделаю
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
04.01.2011, 23:19
общий
Условие правильное. Если оба нечетные то они игнорируются.
Неизвестный
05.01.2011, 00:19
общий
Адресаты:
дада сделаю
а то я давно здесь ничего не делал
так ведь могут и уволить
скажут, мол зарплату получаешь, а не работаешь
Неизвестный
05.01.2011, 00:37
общий
вот конкретный пример
посмотрите, правильно ли я понимаю алгоритм

Неизвестный
05.01.2011, 11:21
общий
Алгоритм верный
давно
Старший Модератор
31795
6196
05.01.2011, 13:31
общий
Цитата: 354520
Условие правильное.

Возможно, но сомневаюсь, что оно полное:
Цитата: 354520
В строке из 20 элементов

Что именно есть такое элемент: байт, слово или символ?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
05.01.2011, 18:36
общий
Адресаты:
Символ.
давно
Старший Модератор
31795
6196
05.01.2011, 18:47
общий
Цитата: 192806
дада сделаю

Вашей задачей занялся другой эксперт.
Я уточнил нужную информацию, т.к. процессору безразлично, что считать, для него это просто набор нулей и единиц.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
06.01.2011, 02:37
общий
на каком языке писать комментарии - рус или англ?
если рус., то в какой кодировке - oem или ansi?
давно
Посетитель
7438
7205
06.01.2011, 09:40
общий
Позвольте, я отвечу
Комментарии - на русском ANSI
Сообщения - на английском
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
06.01.2011, 12:01
общий
это ответ
Здравствуйте, Незлобин Сергей Александрович!

вот пожалуйста

181735.asm (3.1 кб)

Приложение:
00,01,02,03,04,05,01,07,03,09,09,0B,0C,0D,05,0F,10,11,12,13

-----------
1 2 3 4
-----------
00,01,02,03
04,05,01,07
03,09,09,0B
0C,0D,05,0F
10,11,12,13

1) 00, 02
00 - четное
02 - четное
max(00, 02) = 02

2) 04, 01
04 - четное
01 - нечетное
max(04, ?) = 04

3) 03, 09
03 - нечетное
09 - нечетное
max(?, ?) = 0

4) 0C, 05
0C - четное
05 - нечетное
max(0C, ?) = 0C

5) 10, 12
10 - четное
12 - четное
max(10, 12) = 12


результаты обработки четверок:
[02],[04],[00],[0C],[12]

находим min элемент с четным индексом
min(04, 0C) = 04
Неизвестный
06.01.2011, 13:41
общий
;преобразование двоичного значения байта в шестнадцатеричное символьное представление для вывода на экран
call uchar_to_hex
mov x_hex,al
mov x_hex+1,ah

mov ah,09h
lea dx,mess
int 21h

;завершение процесса
mov ax,4C00h
int 21h


А как представить в десятичном виде?
Неизвестный
06.01.2011, 18:34
общий
в десятичном немного проще
максимальное значение одного байта = 0FFh=255
т.е. нужно получить три символа(десятичные цифры)
делим на 10 и записываем остатки в порядке возрастания веса разряда

;-----------------------------------------------------------------------------
;получить десятичное представление беззнакового целого с разрядностью в 1 байт
;INPUT: AL
;RETURN: AL,AH,DH - 3-символьное десятичное представление
;(начиная со старшего разряда, т.е. 0F3h = 243 -> AL='2',AH='4',DH='3')
;-----------------------------------------------------------------------------
uchar_to_dec PROC

xor ah,ah
mov dl,0Ah
div dl
mov dh,ah

xor ah,ah
div dl

mov dl,'0'
or al,dl
or ah,dl
or dh,dl

ret
uchar_to_dec ENDP
Неизвестный
06.01.2011, 19:23
общий
Так, если я вас правильно понял, то готовая программа примет вид:


Код:

.MODEL small
.STACK 100h


.DATA
input DB 00h,01h,02h,03h,04h,05h,01h,07h,03h,09h,09h,0Bh,0Ch,0Dh,05h,0Fh,10h,11h,12h,13h

q DB 5 DUP (?)

x DB ?

mess DB 'x = '
x_hex DB 0,0,'h'
DB '$'

;=========================

.CODE
start:
;выбор сегмента данных
mov ax,@data
mov ds,ax

;цикл обработки входных данных
lea bx,input ; DS:BX - указатель входных данных
lea di,q ; DS:DI - указатель данных результатов выборок из четверок
mov cx,5

;два элемента с четными индексами каждой четверки заносятся в DL и DH
next_row:
mov al,ds:[bx]
call is_even
test al,al
jz odd

;четное
mov dl,ds:[bx]
jmp check_2

odd:
;если нечетное, то принять равным 0
xor dl,dl

check_2:
inc bx
inc bx

mov al,ds:[bx]
call is_even
test al,al
jz odd_2

;четное
mov dh,ds:[bx]
jmp get_max

odd_2:
;если нечетное, то принять равным 0
xor dh,dh

get_max:
inc bx
inc bx

;выбор максимального
mov al,dl
mov ah,dh
call max

mov ds:[di],al
inc di
loop next_row

;все четверки обработаны
;находим min элемент с четным индексом
lea di,q

inc di
mov al,ds:[di] ;q[index=2]

inc di
inc di
mov ah,ds:[di] ;q[index=4]

call min
mov x,al

;вывод ответа
;преобразование двоичного значения байта в шестнадцатеричное символьное представление для вывода на экран
call uchar_to_hex
mov x_hex,al
mov x_hex+1,ah

mov ah,09h
lea dx,mess
int 21h

;завершение процесса
mov ax,4C00h
int 21h



;--------------------
;проверка на четность
;INPUT: AL - беззнаковое целое значение, которое проверяется на четность
;RETURN: AL = 1 если аргумент четный, иначе AL = 0
;--------------------
is_even PROC
push dx

xor ah,ah
mov dl,2
div dl
test ah,ah
jz arg_is_even

xor al,al
jmp is_even_exit

arg_is_even:
mov al,1

is_even_exit:
pop dx
ret
is_even ENDP

;----------------------------------------------------
;выбор максимального значения из двух предоставленных
;INPUT: AL, AH - целые беззнаковые
;RETURN: AL - максимальное значение из двух входных аргументов
;----------------------------------------------------
max PROC

cmp al,ah
ja return_max

xchg ah,al

return_max:
ret
max ENDP

;---------------------------------------------------
;выбор минимального значения из двух предоставленных
;INPUT: AL, AH - целые беззнаковые
;RETURN: AL - минимальное значение из двух входных аргументов
;---------------------------------------------------
min PROC

cmp al,ah
jb return_min

xchg ah,al

return_min:
ret
min ENDP

;-----------------------------------------------------------------------------
;получить десятичное представление беззнакового целого с разрядностью в 1 байт
;INPUT: AL
;RETURN: AL,AH,DH - 3-символьное десятичное представление
;(начиная со старшего разряда, т.е. 0F3h = 243 -> AL='2',AH='4',DH='3')
;-----------------------------------------------------------------------------
uchar_to_dec PROC

xor ah,ah
mov dl,0Ah
div dl
mov dh,ah

xor ah,ah
div dl

mov dl,'0'
or al,dl
or ah,dl
or dh,dl

ret
uchar_to_dec ENDP

END start


Верно?
Неизвестный
07.01.2011, 01:51
общий
нет, неверно

если мы меняем подпрограмму получения ответа, то нужно изменить и вот эту часть кода
Код:
;вывод ответа
;преобразование двоичного значения байта в шестнадцатеричное символьное представление для вывода на экран
call uchar_to_hex
mov x_hex,al
mov x_hex+1,ah


и строку сообщения о результате также нужно подправить
Неизвестный
07.01.2011, 02:22
общий
вот:

181735_v010.asm (3.7 кб)

шестнадцатеричный + десятичный ответ
теперь будут довольны и те, кто молится шестнадцатеричным богам, и те, кто верит в десятичных богов
Неизвестный
07.01.2011, 11:26
общий
Спасибо , это то что нужно
Форма ответа