Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(Ura20007)
Дан файл f, компоненты которого являются целыми числами: a) найти количество четных чисел среди компонент; b) найти количество удвоенных нечетных чисел среди компонент; c) найти количество квадратов нечетных чисел среди компонент.
...а какой нужно использовать файл бинарный или текстовый

Кстати, видимо, тенденция на этом сайте "Напишите программу на ассемблере..." 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 квадрат_нечетного_числа)
А теперь, когда все разжовано -- пиши программу  smile 

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)