2 не очень сложных задачи |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
2 не очень сложных задачи |
brut_ |
20.12.2004 21:24
Сообщение
#1
|
Гость |
Помогите пожалуйста с двумя задачками:
1) Дан массив из 10 элементов. Вычислить разность между максимальным и минимальным элементами (используйте адресацию по базе). 2) Дан массив P[0..k]. Определить сколько элементов удовлетворяют неравенству A<P[i]<B (используйте косвенную регистровую адресацию). Я ее частчно сделал: stac segment stack 'stack'осталось самое сложное: Ввода с клавиатуры исходных данных и вывода на экран исходных и конечных данных. Очистить экран и вывести результат в рамке красного цвета Поменять цвет рамки через 5 сек. Помогите, пожалуйста... |
Dark |
21.12.2004 4:18
Сообщение
#2
|
Знаток Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: 3 |
Извини, но начну я с комертария =)
Я разбил задачи на два модуля [похоже ты хотел все сделать в одном] Код mass db 24,41,27,38,64,65,7,21,47,3 - Это для втророй задачки, насколько я понял =) A db 8,42 - Поскольку, как я понял, эти 2 числа вводяться с клавы, лучше их разбить на 2 переменные, т.е. A db 8 B db 42 nmass db 10 dup(?) - необходимость этого я так и не увидел, тока как для первой задачи. Добавил строки вывода в начале и в самом конце String1 db "Введите массив $" String2 db "Введите диапазон [минимум и максимум] $" String3 db "Внутри диапазона лежит $" String4 db "чисел$" sub ax,ax push ax Что делают эти три строчки??? Для чего они push ds Почему push использутся БЕЗ pop ???!!! Есть такое правило сколько push стока pop! [если дело не касается вызова функций в форме C] mov ah, 0 Лучше использовать xor ax,ax - быстрее и изящнее mov di, offset nmass Это нам уже не надо... mov si, offset a Это нам уже не надо... cmp al, [si] Здесь мы заменяем на конкретные переменные т.е. cmp al, [A] cxz: cmp al, [si+1] Здесь тоже cxz: cmp al, [B] mov [di],ah - Заменю на вывод на экран. ret - ЧТО ТЫ ЭТИМ ДЕЛАЕШЬ? ЭТО ДЛЯ ЭТОГО У ТЕБЯ БЫЛИ СТРОКИ push ds sub ax,ax push ax ? Объясни логику и где ты это взял =) -------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
brut_ |
21.12.2004 11:38
Сообщение
#3
|
Гость |
Вообщем такое дело, я привел решение только второй задачи, возможно там
есть что то лишнее . По поводу вопроса: такое дело: лекции нам по ассемблеру не читали, дали только методички и поставили лабы, типа на практике все и поймете... Отвечаю на вопрос (я буду цитировать из методы): push ds - При запуске exe-программы регистр DS указывает на ее заголовок, считанной в память. Поэтому если тело программы описывается как процедура, то первой командой программы должна быть PUSH DS, которая сохраняет в стеке начальное значение DS. ret - Выход из программы, описанной как дальняя процедура, осуществляется с помощью команды RETN или RET (типа конец процедуры). push ax - поместить в стек нулевое смещение адреса возврата. sub ax,ax - возможно - это то же лишнее. |
Dark |
22.12.2004 7:51
Сообщение
#4
|
Знаток Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: 3 |
Имхо поизучай асм понастоящему =) по книгам
Это нестандартный способ, программа завершается так mov ah, 4Ch -------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
Dark |
22.12.2004 7:55
Сообщение
#5
|
Знаток Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: 3 |
При этом в начале ничего не пушиться [я про push ;) ]
-------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
Dark |
22.12.2004 16:51
Сообщение
#6
|
Знаток Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: 3 |
Итак, решенная [без наворотов типа рамки] задача
Код Мне пришлось сделать кое какое преобразование, для вводимых строк =) так как нам нужны числа [байт!], то 1. Читаем до нажатия Enter в буфер 2. Если счетчик символов в буфере больше трех - неправильный ввод 3. Если какой из символов не от 0 до 9 - неправильный ввод 4. Переводим в число, в байт. Возможный баг - ввод числа непомещающегося в байт. Эту проверку я писать не буду =) 1. Читаем до нажатия Enter в буфер - буфер на 3 символа [Этим решается проблема 2] - используется функция MSDOS 0A Формат буфера: 1й байт - сколько максимум символов читать [с учетом Enter] 2й байт - сколько символов введено [Без учета Enter] от 3го байта - строка символов не больше 254 байт, с завершающим 0D [Enter] buf struc lenbuf db 4 len db 0 buf_in db 4 dup(?) ends В Data объявляем: simv bufs <> В программе считываем символ: lea dx,simv mov ah,0Ah int 21h Все =) 2. Проблема решена на стадии планирования 1. 3. Если какой из символов не от 0 до 9 - неправильный ввод lea si,simv+2 xor cx,cx mov cl,[bx-1] Check: cmp byte ptr [si],30h jl @break cmp byte ptr [si],39h jq @break inc si loop Check 4. Переводим в число, в байт. lea si,simv+2 xor cx,cx mov cl,[si-1] mov ax,[si] ;домножаем на 100 shl ax,1 ;ax=ax*4 mov [bx],ax shl ax,4 ;ax=ax*16 add [bx],ax shl ax,1 ;ax=ax*2 add [bx],ax inc si mov ax,[si] ;домножаем на 10 shl ax,1 ;ax=ax*2 add [bx],ax shl ax,2 ;ax=ax*8 add [bx],ax mov ax,[si+1] ;прибавляем остаток add [bx],ax -------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
Dark |
22.12.2004 16:56
Сообщение
#7
|
Знаток Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: 3 |
Сама программа №2,
stac segment stack 'stack'Вопросы? задавай -------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
Текстовая версия | 29.04.2024 5:54 |