ASSEMBLER(16 bit):Совершенные числа
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
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 является простым
|
|
|
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-25 06:48:41.650000
|
|
|
zzsnn
Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
|
Курсак нужно сделать? прочитай правила. Здесь не помогают решать курсаки. Во всяком случае бесплатно. Помочь можно. Но для этого ты сам должен хоть что-то сделать. Напиши хоть какие-то основы, дай код. Попробуем разобраться. Нет кода - нет помощи.
|
|
|
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-25 23:09:53.760000
|
|
|
No.Ob
Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
|
Это не курсач :) Это для автомата по предмету… А по делу:вроде бы всё сделал,работает.. Если кто-то хочет проверить правильность-выложу код программы
|
|
|
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-26 18:34:07.910000
|
|
|
zzsnn
Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
|
Вот и выложи. Посмотрим, проверим, подскажем. А вообще, если работает, то какие проблемы? Что не так, или что не устраивает?
|
|
|
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 битного асм) решение соответствует условию данной задачи?
|
|
|
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 – это уже другой вопрос. Тут я не буду помогать принципиально. Могу еще пожалуй помочь с переводом чисел из десятичной системы счисления в шестнадцатеричную и обратно. Это часто вызывает проблемы для студентов. Тут можно объяснить. А ввод, вывод, размещение в памяти, циклическое деление, или деление вычитанием (а оно лучше на больших числах) – это уже ты сам.
|
|
|
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.
|
|
|
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.
|
|
|
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 проверял,всё работает. Только не могу определить, где находится результат ?(для дальнейшей подстройки под вашу программу требуется)
|
|
|
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-31 18:27:17.613333
|
|
|
zzsnn
Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
|
Результат здесь в digit. Честно говоря мне не совсем нравиться данный код. Рекурсия, тяжеловестность, запутанность. Но это моё мнение. Личное. Чем хорошо ассемблер? Скоростью. И полной свободой. Какую операцию процессор выполняет наиболее быстро? Пересылку и сложение. Вот на этом обычно и строиться оптимальная программа на асме. Я лично предпочитают делать перевод более простым и более быстрым методом. Тупым переводом, согласно математическим законам. Там простенько и понятно.
|
|
|
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-31 19:26:52.693333
|
|
|
No.Ob
Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
|
Согласен,я там мало что понял.. Да и из digit не получается выгрузить в ax а тот перевод,что попроще,можее поведать??
|
|
|
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-05-31 19:28:45.250000
|
|
|
No.Ob
Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
|
Согласен,я там мало что понял.. Да и из digit не получается выгрузить в ax а тот перевод,что попроще,можее поведать??
|
|
|
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
мозг кипит.
|
|
|
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-01 19:08:47.563333
|
|
|
zzsnn
Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
|
Счас время нет. Много писать придёться. Давай завтра попробую написать тебе как можно выполнить перевод, достаточно понятно и выложу тебе работающую прогу. Извини, но разбираться с твоей прогой не стоит сейчас.
|
|
|
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-01 19:38:23.150000
|
|
|
No.Ob
Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
|
Нет проблем. Спасибо.
|
|
|
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. Заметь, целых ДВА БАЙТА!. Смотрим у тебя. Где у тебя выделена память под вводимое число? И СКОЛЬКО БАЙТ ты выделил под это число? Думай. Запомни. Если сравнить языки программирования с машинами, то С++ - это роскошный лимузин, на хреновой туче электронике, который очень хорош и классно ездит. Но вот если остановиться - то никто не поймёт почему. Ассемблер - это даже не машина. Это просто движок. Тебе нужно из железа собрать раму, присобачить колёса, прикрутить руль, а бензин ты будешь подкачивать сам. Но!!!! Если ты сможешь это сделать - то будешь вылетать быстрей летучей мыши из ада! Придёться тебя натаскивать сначала на приём и вывод данных. И лучше это будет делать на прерываниях БИОС. Там понятней. Давай завтра постараюсь выбрать время и написать коротко и понятно.
|
|
|
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 .
|
|
|
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 процессора,чето нигде найти его не могу.
|
|
|
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, а потом сюда напиши.
|
|
|
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-03 19:41:26.133333
|
|
|
ivan123123
Сообщений: 28
Оценки: -10
Присоединился: 2011-05-31 16:14:06.026666
|
я ничего не понял
|
|
|
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 цифр переводит, если не ошибаюсь. И попробуй подобную прогу напиши на Паскале, или на С++. Посмотришь размер и скорость.
|
|
|
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-04 17:23:07.560000
|
|
|
No.Ob
Сообщений: 11
Оценки: 0
Присоединился: 2011-05-24 20:48:17.743333
|
В общем,я тут подумал пойду-ка я лучше к экзамену готовиться,так как задачу решить не по силам. Спасибо zzsnn что откликнулся.
|
|
|
RE: ASSEMBLER(16 bit):Совершенные числа - 2011-06-04 22:28:53.186666
|
|
|
zzsnn
Сообщений: 7459
Оценки: 680
Присоединился: 2007-09-25 07:17:14.240000
|
Задача явно не по твоим силам. Асм - это не тот язык, который с ходу выучивают. Тем более на эмуляторе. Из своего опыта могу сказать, что для начального изучения асма лучше купить дешёвый б/у комп, только что бы 98-а Win работала, и программировать на нём. И всё через дебаггер. По каждому регистру, по каждому байту в данных, до вхождения в состояние дзэн. До прояснения что и куда пересылается и как делается. Это только кажеться, что сложно. На самом деле асм очень простой язык. Он только внимательности требует. И слежения за мелочами. Верней так, в асме не бывает мелочей. Их там просто нет. Зато потом… потом ты вдруг понимаешь, что любой другой язык для тебя какой-то тесный и как-то не совсем совершенный.
|
|
|
|
|