Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

ASSEMBLER(16 bit):Совершенные числа

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Прочее] >> ASSEMBLER(16 bit):Совершенные числа
Имя
Сообщение << Старые топики   Новые топики >>
ASSEMBLER(16 bit):Совершенные числа - 2011-05-24 20:54:38.026666   
No.Ob

Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
Здравствуйте,помогите, пожалуйста, написать программу , которая определяет является ли введённое с клавиатуры число совершенным. Cвершенные числа - те числа у которых сумма делителей равна самому числу ( 6 = 1 + 2 + 3)

Первое совершенное число — 6 (1 + 2 + 3 = 6), следующее — 28 (1 + 2 + 4 + 7 + 14 = 28). По мере того как натуральные числа возрастают, совершенные числа встречаются всё реже. Третье совершенное число — 496, четвёртое — 8128, пятое — 33550336, шестое — 8589869056, седьмое — 137438691328
Алгоритм построения чётных совершенных чисел описан в IX книге Начал Евклида, где было доказано, что число (2^P-1)*2^(p-1) является совершенным, если число 2^P-1 является простым
Post #: 1
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-25 06:48:41.650000   
zzsnn

Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
Курсак нужно сделать?
прочитай правила. Здесь не помогают решать курсаки.
Во всяком случае бесплатно.
Помочь можно. Но для этого ты сам должен хоть что-то сделать. Напиши хоть какие-то основы, дай код. Попробуем разобраться.
Нет кода - нет помощи.
Post #: 2
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-25 23:09:53.760000   
No.Ob

Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
Это не курсач :)
Это для автомата по предмету…

А по делу:вроде бы всё сделал,работает..
Если кто-то хочет проверить правильность-выложу код программы
Post #: 3
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-26 18:34:07.910000   
zzsnn

Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
Вот и выложи. Посмотрим, проверим, подскажем.
А вообще, если работает, то какие проблемы? Что не так, или что не устраивает?
Post #: 4
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-26 21:31:32.003333   
No.Ob

Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
include 'emu8086.inc' #make_COM# ORG 100h lea SI,msg call print_string call scan_num mov AX,CX call pthis msg db 'chislo ' ,0 define_scan_num define_print_string Define_pthis CMP AX,6 JE label1 CMP AX,28 JE label1 CMP AX,496 JE label1 CMP AX,8128 JE label1 PRINT 'ne sovershennoe.' JMP exit label1: PRINT 'sovershennoe.' exit: xor ax,ax int 16h ret

У меня есть некаторые вопросы…
Получается что по этой программе обрабатываются числа от 0 до 65535(1111.1111.1111.1111 на машинном языке-это максимальное число для 16 битного асм)

решение соответствует условию данной задачи?

Post #: 5
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-27 20:58:05.380000   
zzsnn

Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
Так, просмотрел я твоё решение.
Самая большая проблема в том, что ты даже не удосужился найти в инете алгоритм вычисления совершенных чисел. А ведь он уже давно написан.
Специально, для тебя выкладываю на паскале с коментариями:

1 Program sovr;
2 var
3 Num, Sum, i :integer; //Num – найденное число, Sum – сумма для вычисления и сравнения
4 begin
5 Write('Введите число:');
6 Readln(Num);
7 Sum:=1;
8 for i:=2 to (Num div 2) do //проверяем все делители на целочисленное деление div
//это будет количество циклов
9 if (Num mod i)=0 //mod-остаток от деления
10 then Sum:=Sum+i; //если остатка нет –число делится - слаживаем
11 if Sum=Num //Сумма делителей равна исходному числу?
12 then Writeln('Число совершенное.')
13 else Writeln('Число несовершенное');
14 Readln;
15 end

Тепрь логику работы разжёвываю.
В качестве примера берём число 28.
Во всех совершенных числах есть число 1. Поэтом сумма вначале инициализируется числом 1.
Определение количества циклов сложения идёт в строке 8. По правилам, для уменьшения количества проходов нужно делить на квадратный корень от i, но можно спокойно обойтися и данным способом. Надеюсь ты понял почему перебирается только половина числа? После половины бессмысленно. Оно просто не будет делиться. 28 не делить на 15, тем более большее число.
Так как, количество циклов целое число, то используем целочисленное деление.
Теперь идём далее. Идет перебор чисел. Проверяется делит ли счётчик заданное число БЕЗ ОСТАТКА. Если остатка нет, то можно слаживаем сумму с полученной ранее суммой. Это выполняется в строках 9 -10.
В строке 11 сравнивают полученную сумму с числом. Совпало – число совершенное, нет – число не совершенное.

Надеюсь логика работы тебе понятна?
Теперь поехали на асме работать.
Для простоты работаем прямо по данном алгоритму. Считаем по максимальном положителном числу типа word. Как получить числа и как перевести из десятичной системы счисления в шестнадцатеричную и обратно я писать не буду. Не буду так же описывать вывод результата. Ты должен это уметь делать, и у тебя для этого должны быть заготовлены стандартные, для тебя способы. Пойдём чисто по вычислениям.
Работаем чисто в асме 16-ти, без использования сопроцессора.

….
num dw 0000h
sum dw 0001h
delitel db 00h ;число на которое будем делить
scet db 00h ;это счётчик
…..

;здесь делаем ввод и приём


xor dx,dx ;обнуляем регистры на всякий случай, здесь не обязательно
xor ax,ax
mov ax,num ; загоняем полученное число
mov delitel,02h ;тут лучше не сдвигом а тупым делением
div delitel ;поделили ah – остаток, al – частное
mov scet,al ;загоняем количество циклов (частное) в счётчик

metka2:
mov ax,num ;положили в ax число для денния. см строка 9 выше в проге
xor dx,dx ;обнуляем dx, на всяк случай, можно и не делать
mov dl,scet
mov delitel,dl ;положили в delitel число для деления
div delitel ;делим ax (num) ah- остаток al -частное
cmp ah,00h ;проверяем остаток
je metka1 ;если остатка нет (равен нулю), то переходим на metka1
metka4:
dec scet ; иначе уменьшаем счётчик
cmp scet,01h ;проверили конец счётчика или нет (счётчик уменьшаем)
jg metka2 ;если счётчик больше еденицы переходим на metka2
jmp metka 3 ;если закончили, то прыгаем для выхода

metka1:
add sum,ax ;в ah – остаток ноль, а в al частное деления, слаживаем
jmp metka4 ;зацикливаем на новый счётчик

metka3:
;теперь в sum забита сумма при делении, а num без измения
mov ax,num ;ложим для сравнения
cmp sum,ax ;сравниваем
je metka5 ;числа равны – переход на metka5 – число совершенное
;действия если число не совершенно

metaka5:
;действия если число совершенное


можешь выводить что-то другое. Это дело твоё. Я дал тебе алгоритм определения. Алгоритм абсолютно не оптимизирован, делался на скорую руку, основным считалось сделать его понятным, а не оптимальным.
Как сделать для числа более word – это уже другой вопрос. Тут я не буду помогать принципиально. Могу еще пожалуй помочь с переводом чисел из десятичной системы счисления в шестнадцатеричную и обратно. Это часто вызывает проблемы для студентов. Тут можно объяснить. А ввод, вывод, размещение в памяти, циклическое деление, или деление вычитанием (а оно лучше на больших числах) – это уже ты сам.
Post #: 6
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-28 00:07:06.306666   
No.Ob

Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
Принцип ясен!!!Спасибо!

есть вопросы по
num dw 0000h (тут по умолчанию 0000h? или свое что-то надо вводить?)
sum dw 0001h (это ясно)
delitel db 00h (вот это не понял)
scet db 00h (00h откуда брать)

"""Считаем по максимальном положителном числу типа word(это тоже не ясно)
Как получить числа и как перевести из десятичной системы счисления в шестнадцатеричную и обратно(вроде бы калькулятор есть в асм?)

при выполнении проги пишет:
divide error - overflow.
to manually process this error,
change address of INT 0 in interrupt vector table.
Post #: 7
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-28 20:11:12.376666   
zzsnn

Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
num dw 0000h - это инициализация переменной num, лучше и намного лучше сразу инициаллизировать.
delitel db 00h - переменка для операции div. прочитай по этой команде мануал для ассма.
scet db 00h - тоже переменка, это счётчик, инициализирую его сразу. легче работать потом.
divide error - overflow - ошибка переполнения. Ошибка вызвана ошибкой переполнения. Знаешь, что это такое?
change address of INT 0 in interrupt vector table. - изменение адреса вектора прерывания. Это уже ошибки в самой программе. Это ассм, тут можно напрямую менять любые адреса. Ты в программе пытаешься крутить в таблице векторов прерывания напрямую. Это конечно можно делать, но очень не рекомендуется. Да и зачем это тебе в данной проге?
У тебя не ассмовский компилятор, чистый ассм даже не заметил бы этого. Он считает, что о подобном должен думать программист. А твой компилятор более интелектуален и более зажат. Он вообще не расчитан на ассм. Паскаль что ли?
"Считаем по максимальном положителном числу типа word" - максимальное число, которое можно ввести и проверить в данной программе в шестнадцатеричном виде будет 0FFFFh.
Post #: 8
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-31 16:01:07.600000   
No.Ob

Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
У меня emu8086 4.08(не зарегестрированная:) ) компилятор встроенный
Нашел код перевода из ДСС в ШСС.
Вот он:
include 'emu8086.inc' #make_COM# org 100h mov ax,17 ;chislo mov cx,16 lea di,digit call wto ;vyzov rekursii mov [di],byte ptr 0dh ;sjuda vernjotsja uzhe s peredelannym chislom! inc di mov [di],byte ptr 0ah inc di mov [di],byte ptr "$" lea dx,digit mov ah,9 int 21h ret wto proc ;rekursijaя xor dx,dx div cx ;delim tekuwee chislo i ostatok iz dx sohr-em v steke dlja я or ax,ax ;ego preobrazovanija v 16-ju sistemu jz done ;jeto kogda vse chista obrabotany push dx call wto ; pop dx ;vot idjot vyborka iz steka chisel snachalo v dx dlja peredelyvanija v 16-ju s. done: mov al,dl cmp al,10 jae label1 or al,"0" ;dopisyvaetsja 30h dlja otobrazhenija na jekrane jmp nx label1: xor ah,ah mov cx,10 div cl ;snova delim esli chislo bol'she 10 mov al,ah label@@: add al,"A" ;dlja korrektnogo otobrazhenija bukv nx: mov [di],al inc di ret wto endp digit db 10 dup(?) end проверял,всё работает.
Только не могу определить, где находится результат ?(для дальнейшей подстройки под вашу программу требуется)




Post #: 9
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-31 18:27:17.613333   
zzsnn

Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
Результат здесь в digit.
Честно говоря мне не совсем нравиться данный код. Рекурсия, тяжеловестность, запутанность. Но это моё мнение. Личное.
Чем хорошо ассемблер? Скоростью. И полной свободой. Какую операцию процессор выполняет наиболее быстро? Пересылку и сложение. Вот на этом обычно и строиться оптимальная программа на асме. Я лично предпочитают делать перевод более простым и более быстрым методом. Тупым переводом, согласно математическим законам. Там простенько и понятно.
Post #: 10
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-31 19:26:52.693333   
No.Ob

Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
Согласен,я там мало что понял..
Да и из digit не получается выгрузить в ax

а тот перевод,что попроще,можее поведать??
Post #: 11
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-31 19:28:45.250000   
No.Ob

Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
Согласен,я там мало что понял..
Да и из digit не получается выгрузить в ax

а тот перевод,что попроще,можее поведать??
Post #: 12
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-31 22:47:19.530000   
No.Ob

Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
вот код,обрабатывает введенные с клавы числа до 511 включительно…
6 и 28 -пишет совершенные,а вот 496 -пишет не совершенное ((
мб это из-за того что надо переводить d 16-ную…

include 'emu8086.inc' #make_COM# org 100h lea SI,msg call print_string call scan_num mov AX,CX call pthis db 13,10, 'chislo ',0 xor dx,dx mov ax,cx mov delitel,02h div delitel mov scet,al metka2: mov ax,cx xor dx,dx mov dl,scet mov delitel,dl div delitel cmp ah,00h je metka1 metka4: dec scet cmp scet,01h jg metka2 jmp metka3 metka1: add sum,ax jmp metka4 metka3: mov ax,cx cmp sum,ax je metka5 PRINT 'ne sovershennoe' JMP exit metka5: PRINT 'sovershennoe.' exit: xor ax,ax int 16h ret msg db 'chislo ' ,0 define_scan_num define_print_string Define_pthis num dw 0000h sum dw 0001h delitel db 00h scet db 00h end
мозг кипит.
Post #: 13
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-01 19:08:47.563333   
zzsnn

Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
Счас время нет. Много писать придёться. Давай завтра попробую написать тебе как можно выполнить перевод, достаточно понятно и выложу тебе работающую прогу. Извини, но разбираться с твоей прогой не стоит сейчас.
Post #: 14
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-01 19:38:23.150000   
No.Ob

Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
Нет проблем.
Спасибо.
Post #: 15
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-01 22:46:24.713333   
zzsnn

Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
Так просмотрел программу. Для того, что бы она нормално работала нужно самому написать приём чисел и самому как-то из разместить в памяти.
Сколько байт занимает число 6 и число 28?
Возьми калькулятор, который может переводить из десятичной в шестнадцатеричную систему счисления, а лучше сам попробуй в уме.
6 - понятно, а 28? Переводим: смотри 16, 32, 48, 64, 80, 96… ничего не напоминает?
16х1. 16х2, 16х3, 16х4, 16х5, 16х6….
28=16х1+12. Правильно я посчитал? Идём дальше. Тогда имеем 12 - это в шестнадцатеричной Сh, 16- просто 10h. отсюда имеем 28 в шестнадцатеричной будет 1Ch.
Попробуй логику понять. Число 100. Ближайшее 96! Это будет 16х6. 100-96=4. Имеем число 100 в шестнадцатеричной 64h.
Нас дрочили в уме до 512 переводить. Нормально переводишь. Нужно только немного ряд запомнить. Это несложно. Названия пива запоминаешь, а тут полтора десятков цифр.
Итак, смотри 6 и 28 в шестнадатеричной будет 06h и 1Ch. Занимает по ОДНОМУ БАЙТУ.
Смотрим на число 496. Это в шестнадцатеричной 1F0h. Заметь, целых ДВА БАЙТА!.
Смотрим у тебя.
Где у тебя выделена память под вводимое число? И СКОЛЬКО БАЙТ ты выделил под это число?
Думай.
Запомни. Если сравнить языки программирования с машинами, то С++ - это роскошный лимузин, на хреновой туче электронике, который очень хорош и классно ездит. Но вот если остановиться - то никто не поймёт почему.
Ассемблер - это даже не машина. Это просто движок. Тебе нужно из железа собрать раму, присобачить колёса, прикрутить руль, а бензин ты будешь подкачивать сам. Но!!!! Если ты сможешь это сделать - то будешь вылетать быстрей летучей мыши из ада!
Придёться тебя натаскивать сначала на приём и вывод данных. И лучше это будет делать на прерываниях БИОС. Там понятней.
Давай завтра постараюсь выбрать время и написать коротко и понятно.
Post #: 16
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-02 21:29:33.410000   
zzsnn

Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
Даю логику программы по переводу из десятичного счисления в шестнадцатеричный.
Основой десятичной системы счисления являетс число 10.
Это выглядит как 10, 100, 1000, 10000 и т.д.
Шестнадцатеричная аналогично. Только там основа число 16.
16, 256, 4096, 65536 и т.д.
Теперь смотрим на этот ряд
10 – 0ah
100 – 64h
1000 – 03e8h
10000 - 2710h
100000 – 0186a0h
и т.д. Подумай над рядом.
Теперь пример
Имеем число 2345 в десятичном виде.
Запишем его в виде (сложение идёт справа на лево, а не как ты привык):
5+4*10+3*100+2*1000=2345
А теперь тоже самое в шестнадцатеричном виде, но только вместо 10, 100 и 1000 используем 0ah, 64h, 03e8h.
5+4*0ah+3*64h+2*03e8h=0929h (можешь проверить)
Логика понятна? Ещё упростим для программирования.
Так как умножение в ассме без использования сопроцессора сложнова то, да и долгий процесс, то проще сделать всё сложением
5+(0ah+0ah+0ah+0ah)+(64h+64h+64h)+(03e8h+03e8h)=0929h
Вот этот процесс и можно запрограммировать.
То же и для числа 35478 (например)
8+(0ah+0ah+0ah+0ah+0ah+0ah+0ah)+(64h+64h+64h+64h)+(03e8h+03e8h+03e8h+03e8h+03e8h)+(2710h+2710h+2710h)=8a96h
Я не буду описывать всю программу, просто внизу ссылка на работающий экземпляр программы, работающей именно по этому принципу. Откроешь в дебаггере и будешь разбираться. Там же есть листинг программы. Коментарии есть, хотя и мало, но тебе если захочешь разобраться – сможешь. Да, 70% проги - это ввод чисел, вывод, создание интерфейса. Само преобразование идёт в preob proc. Остальное просто фантики.
Прога делалась для объяснинения, с целью что бы была понятна логика ввода и вывода и работа с введёнными данными. Перевод уже вторичное. Если захочешь - разберёшься.
Из шестнадцатеричного вида в десятичный объясниния и прогу дам позже.
Ссылка http://rghost.ru/9116091 .
Post #: 17
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-03 14:45:49.330000   
No.Ob

Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333

quote:

ORIGINAL: zzsnn
Теперь пример
Имеем число 2345 в десятичном виде.
5+4*0ah+3*64h+2*03e8h=0929h (можешь проверить)
Логика понятна? Ещё упростим для программирования.
Так как умножение в ассме без использования сопроцессора сложнова то, да и долгий процесс, то проще сделать всё сложением
5+(0ah+0ah+0ah+0ah)+(64h+64h+64h)+(03e8h+03e8h)=0929h
Вот этот процесс и можно запрограммировать.

Чисто математически,письменно я понял как переводить(Допустим есть число 892=2*1h+9*0ah+8*03e8h=37С )но вот КАК запрограммировать на асме не могу понять..
quote:


Да, 70% проги - это ввод чисел, вывод, создание интерфейса. Само преобразование идёт в preob proc. Остальное просто фантики.

В preob proc идет обьявление последующих процедур (для 0ah,64h,03e8h и тд)
А вот потом уже получаем наше число шестнадцатиричное.Вот только с >500 строчками разобраться не по силам,да,там 70% ввод\вывод\интерфейс
они то и путают.Рекурсия тоже запутана,но там только 1 процедура.

Мы вот пытаемся перевести введенное число в ШСС,а я до сих пор не могу понять зачем???
Ведь ассемблер автоматически переводит в 16-ную(или двоичную) и работает с ними,по крайней мере в эмуляции пишет 16-ные числа.
или я ошибаюсь

Нашел код только он использует команды .286 процессора,чето нигде найти его не могу.

Post #: 18
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-03 19:08:01.730000   
zzsnn

Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
Разве там более 500 строчек? Не помню, но по-моему намного меньше. Строк 200 - это да, но никак не 500.
"В preob proc идет обьявление последующих процедур (для 0ah,64h,03e8h и тд)"
Угу. И в каждой из этих процедур идёт сложение по 0ah, или по 64h, или по 03e8h и т.д. Смотри ряд:
10 – 0ah
100 – 64h
1000 – 03e8h
и т.д.
На кой хрен бить всё в одной процедуре. Легче каждое сложение сделать в отдельной процедуре, а потом, при необходимости или добавлять или просто удалить. Все зависит от размерности десятичного числа. Прога расчитана, если не ошибаюсь на перевод десятичного размером в 8 знаков, можно и больше. Добавь только еще одну процедуру и пропиши её в preob proc. Ну еще размер принимаемых чисел увелич в сегменте данных.
Проц вообще не считает в десятичных числах. И не принимает десятичные числа. Он, как ты правильно заметил, считает в двоичных. НО шестнадцатеричные числа - это те же двоичные, просто записаны для человека в более удобной форме.
А насчёт того, что автоматически принимает десятичные… напиши прогу по приёму 2-х чисел, десятичных, прими их, сложи их и выдай результат. Можешь даже не выдавать результат. Просто посмотреть в дебаггере резльтат. И на калькуляторе сложи. Например числа 90 и 75, а потом сюда напиши.
Post #: 19
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-03 19:41:26.133333   
ivan123123

Сообщений: 28
Оценки: -10
Присоединился: 2011-05-31 16:14:06.026666
я ничего не понял
Post #: 20
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-03 22:54:39.320000   
zzsnn

Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
Ну раз не понял придёться разжевать.
В компьютере вообще не работают с десятичными числами. Вся работа идёт с сигналами. Представь 8 проводков. С одной строны проводков 8 лампочек, с другой строны переключатели. Ты включил переключатель - лампочка загорелась. Горящая лампочка - это еденичка. Не горящая - это нолик.
Включая и выключая лампочки в определенной последовательности можно получить в двоичной системе числа. Пример:
11001100b - это двоичное число. В десятичном счислении это будет 314. А в шестнацатеричном это будет 0ССh.
Теперь почему в шестнадатричном виде удобней для человека. 1100 - это 0Сh, 1100 1100 - получаем 0CCh. Другое число 0011 1011 - это 3Bh (0011 - 03h, а 1011 - 0Bh). Фактически запись в шестнадцатеричном виде - просто удобная запись двоичных чисел. Более компактная. Это кажеться, что неудобно, всё дело привычки. Немного практики и начинаешь автоматом считать.
Теперь почему именно 8 лампочек и как они относятся к компам.
С одной стороны это исторически. Раньше процессор имел шину данных (это проводки по которым поступали данные). Шина имела размерность 8 (8 проводков). Таким образом процессор мог в любой момент считать ТОЛЬКО данные размером в 8 бит (8 проводков - 8 нулей и едениц). Другое дело, что эти данные поступали по тактам.
Просто для примера цифры. Пусть проц каждую секунду снимает данные с шины. Соотвественно эти данные синхронно будут меняться каждую секунду. И проц не ошибёться, и данные будут те, что надо.
На самом деле сейчас к процу поступают данные по шине в 32 разряда (32 провода), но 32 это те же 4 раза по 8. Ничего не меняется. И идут эти данные с куда как большей скоростью. Какая там скорость сейчас у процов персоналок? 3 Гига. Это значит, что в секунду меняются данные на шине данных 3 000 000 000 раз, если я не ошибаюсь в количестве нулей. Примерно так.
Но вернёмся к десятичным числам.
По шине данных идёт сигналы - это двоичные числа. Десятичные не катят. Их нужно сначал перевести в двоичные. Но как выше сказано, шестнадатеричные числа - это просто упрощённая форма двоичных. Поэтом, что бы проц прожевал твои введённые десятичные числа их нужно перевести или в двоичные или в шестнадцатеричные.
В современных, так называемых "высоких" языках програмирования это за тебя делает компилятор. Автоматически. На основании того, как ты обявишь данные. Тип данных - это как воспринимать вводимые числа (буквы) и их размер (сколько памяти выделять под число). Тип целый (int) - это число, выделять 4 байта. Тип текст (char) - это буквы (размер 1 байт).
Это нужно для того, что бы понять еще что введенно. Ты вводишь букву - а на самом деле в комп вводятся цифры. Например латинская буква A - эти цифра 41h, а а- 61h, O-4Fh и т.д. Просмотри таблицу ASCII-кодов. Даже верней будет сказать так A - это 01000001, а О - это 01001111.
Даже циры вводяться не так. 1 - это 31h (00110001), а 3 - это 33h (0011011) и т.д.
В языках высокого уровня весь перевод берут на себя компиляторы. А вот в асме нужно это делать самому.
Но зато выигрываешь в скорости и нет ограничения по размерам, по типам, и по остальной ерунде. Ну и размер. Прмер? Ну хоть та прога, которую я выложил. Там, кажеться размер что-то чуть более 2 кб, а спокойно переводит до 8-ми значных чисел. Можно и до десятизначных чисел спокойно поднять. Размер… ну может до 3,5 кб подниметься. И скорость даже не заметишь что изменилась. А у тебя калькулятор в Win не более 8 цифр переводит, если не ошибаюсь. И попробуй подобную прогу напиши на Паскале, или на С++. Посмотришь размер и скорость.
Post #: 21
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-04 17:23:07.560000   
No.Ob

Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
В общем,я тут подумал пойду-ка я лучше к экзамену готовиться,так как задачу решить не по силам.
Спасибо zzsnn что откликнулся.
Post #: 22
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-04 22:28:53.186666   
zzsnn

Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
Задача явно не по твоим силам. Асм - это не тот язык, который с ходу выучивают. Тем более на эмуляторе. Из своего опыта могу сказать, что для начального изучения асма лучше купить дешёвый б/у комп, только что бы 98-а Win работала, и программировать на нём. И всё через дебаггер. По каждому регистру, по каждому байту в данных, до вхождения в состояние дзэн. До прояснения что и куда пересылается и как делается.
Это только кажеться, что сложно. На самом деле асм очень простой язык. Он только внимательности требует. И слежения за мелочами. Верней так, в асме не бывает мелочей. Их там просто нет. Зато потом… потом ты вдруг понимаешь, что любой другой язык для тебя какой-то тесный и как-то не совсем совершенный.
Post #: 23
Страниц:  [1]
Все форумы >> [Прочее] >> ASSEMBLER(16 bit):Совершенные числа







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.