| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > програмка |
| Автор: Ura20007 22.9.2008, 16:38 |
| Всем привет! Вот задачка:1. Дан файл f, компоненты которого являются целыми числами: a) найти количество четных чисел среди компонент; b) найти количество удвоенных нечетных чисел среди компонент; c) найти количество квадратов нечетных чисел среди компонент. С ассемблером (под DOS) плохо знаком.Есть реализация задачи на C++. Прошу помощи в реализации на ассемблере. Может есть у кого уже прога на асме.Файл прикрепил! Заранее большое спасибо за любую помощь! |
| Автор: Ura20007 23.9.2008, 11:39 |
| Помогите пожалуйста чем сможете |
| Автор: Ura20007 27.9.2008, 13:23 |
| Ребята помогите хотя бы с частью a |
| Автор: Diabolus 2.10.2008, 06:07 |
| gcc -S source.c asm.txt или как-то так. Выдаст тебе код на асме, который делает компилятор из С. Ну а дальше уже будет проще. Почистить мусор, оптимизировать... Либо просто ключевые моменты перенести в свою программу. |
| Автор: Ura20007 21.10.2008, 11:01 |
| Ребята а какой нужно использовать файл бинарный или текстовый подскажите пожалуйста! |
| Автор: Mikl_ 21.10.2008, 11:31 | ||
Ura20007, за месяц ассемблер под DOS можно было и выучить,
|
| Автор: Ura20007 21.10.2008, 13:25 |
| На сайте откопал! |
| Автор: Mikl_ 22.10.2008, 08:19 | ||
Кстати, видимо, тенденция на этом сайте "Напишите программу на ассемблере..." 1) на каком из ассемблеров? tasm, masm, fasm, nasm или еще какой-то ассемблер. 2) Для какой операционной системы? DOS, Windows, Unix или какую-то другую? Как всегда начинаем писать программу с рассуждений. 1) файл нужно открыть (если таковой существует, а если файла нет, то выдать сообщение), получить handle файла. Прочитать файл (или часть файла) в буфер, который расположен в памяти. Если файл очень большой (больше, чем буфер, который мы можем ему отвести), тогда файл читается в буфер за несколько раз. Закрыть файл. Если файл бинарный - хорошо. Если файл текстовый, придется текст переделывать в число, для нас это дополнительная головная боль. Функции открытия/чтения/закрытия файлов зависят от операционной системы под которую пишется программа (для DOS -функции 21h прерывания, для Windows -- функции API) 2) содержимое файла находится в памяти. a) найти количество четных чисел среди компонент. Нужно знать с каким размером чисел мы столкнемся (байты, слова, двойные слова) и формат числа (знаковое/беззнаковое, целое/вещественное). Допустим у нас целые числа. Тогда в цикле читаем по одному числу, делаем сдвиг этого числа вправо на 1 бит -- если произошла установка бита CF в регистре флагов - значит число нечетное. Увеличиваем счетчик нечетных чисел (mov ax,X / shr ax,1 / jnc четное_число ) Числа на четное/нечетное можно проверить еще так (test X,1 / jz четное_число). А еще четность/нечетность проверяется вот так (mov ax,X/test ax,ax /jp четное_число) b) найти количество удвоенных нечетных чисел. Нечетное число это 2*N+1 удвоенное нечетное число 2*(2*N+1)=4*N+2 значит мы должны сделать сдвиг этого числа вправо на 1 бит и убедится, что оно четное, затем сделать еще один сдвиг вправо на 1 бит и убедится, что оно нечетное или как вариант (mov ax,X / sub ax,2 / test ax,11b / je удвоенное_нечетное_число) c) найти количество квадратов нечетных чисел (2*N+1)*(2*N+1)=4*N*N + 4*N + 1=4*N*(N+1) + 1 мы должны убедится что число нечетное, затем отняв у него единицу -- убедится, что оставшееся число делится без остатка на 8 (если N нечетное, тогда четное N+1 иначе, если N четное, тогда N+1 нечетное) (mov ax,X / dec ax / test ax,111b / jz квадрат_нечетного_числа) А теперь, когда все разжовано -- пиши программу |