Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/229: Рейтинг темы: голосов - 229, средняя оценка - 4.72
4 / 3 / 0
Регистрация: 03.05.2009
Сообщений: 82

До слез Хочу научится Ассемблеру!!!

03.05.2009, 19:25. Показов 48664. Ответов 112
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу научится Ассемблеру!!! С чего начать? Пока читаю Калашникова но не умею работать на МАСМе там всё на английском. Есть ли русская версия или руссификатор?
Английский у меня не очень... у калашникова говорится что надо умет шарит на DOS
и на Нортоне а где взять их Я все учебники самоучители скачала со всех библиотек в интернете но пока о нортоне ничего не нашла кроме как на Википедии Прошу помоч
разобратся.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.05.2009, 19:25
Ответы с готовыми решениями:

Хочу научится программированию
Хочу научится программированию .NET Может ктото подскажет с чего начать, обучаюсь очень быстро, знаю PHP, MySQL, Visual C++ 6.0, Pascal, ...

Хочу научится программировать
Здравствуйте! Не знал в какую тему написать, но в данном случае мне нужно что-то на подобии алгоритма. Я хочу самостоятельно научиться...

Хочу научится веб дизайну
Хочу научится веб дизайну. Но я не знаю своих ошибок в работе, а книги и курсы ответов уже не дают. Главный вопрос... Наверное,...

112
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.07.2009, 14:00
Лучший ответ Сообщение было отмечено как решение

Решение

Студворк — интернет-сервис помощи студентам
Ёрик, у тебя, как и у многих других на форуме, закомых с ассемблером,
какое-то неправильное мнение о нём. В вашем понятии ассемблер - это
нечто божественное, владея которым мужно управлять миром

Ассемблер - это некое средство, позволяющее писать машинные команды
на более понятном для человека языке. И не более того. Многие считают,
что "знают ассемблер" или "выучили ассемблер". Но эти понятия можно
ставить наравне с "выучил словарь английского языка". Ты можешь наизусть
знать все слова, но это не даёт тебе того, что ты можешь свободно
переводить в обе стороны. Может быть какие-то примитивные фразы, но
не более того

В качестве подтверждения могу привести свой пост - до сих пор на него
никто даже ответить не попытался https://www.cyberforum.ru/post213232.html
Потому как "выучить ассемблер" тут точно недостаточно, надо знать,
как машина работает

Как изучишь ассемблер,будешь:
" - понимать устpойство персонального компьютера;
Умение писать "hello world" через стандартные interrupt'ы MS-DOS
это ещё не знание компьютера

- понимать коды машинного языка и шестнадцатиричный формат;
Пониматькоды одно. А понимать, что эти коды делают - совсем другое.
Шестнадцатиричный формат можно понимать и без знаний ассемблера

- понимать назначение отдельных шагов при ассемблировании,
компановке и выполнении;
Каких отдельных шагов? И что мешает тебе понимать процесс компоновки,
работая из-под компилятора? Хотя на этот вопрос я сам отвечу - в билдерах
это всё слишком скрыто от пользователя, хотя народ утверждает,
что работая на MSVS нужно в этом что-то понимать.

- писать программы на языке ассемблера для управления экраном,
арифметических действий, преобразования ASCII кодов в двоичные
форматы, табличного поиска и сортировки, дисковых операций
ввода/вывода;
Опять-таки, всё это, условно говоря, только в MS-DOS. При этом ты пользуешься
стандартными interrupt'ами (что по сути не отличается от использования
библиотечных процедур при работе на языках программирования высокогого уровня)

- выполнять трассировку при выполнении программы, как средство
отладки;
На моей памяти при работе с обычным приложением (т.е. не ядро, не драйвер,
не динамический загрзчик и т.п.) ни разу не пришлось копаться в ассемблерном
коде. Опять-таки может это потому, что работаю под юниксами, а не под виндами

- писать собственные макрокоманды;
- компановать вместе отдельные программы".
Всё это можно делать и на языке высокого уровня

======================================== ========================

По поводу всяких слов, что мол типа программа на ассемблере занимает мало
места. Когда слышу эти слова, то мне кажется, что люди считают, что
программа занимает мало места, потому что на ассемблере написана. Но это не так.
Просто в этом случае обращения к системе идут напрямую в коде, а не через
библиотечные прокладки, как это делается на языках высокого уровня.
При этом современная библиотечная поддержка имеет тенденцию очень сильно
распухать. В последних версиях линуха, например, glibc вдоль и поперёк
прошита поддержкой многопоточности. Следствием этого является
распухание кода, но бонусом такого подхода является более быстрая
работа в многопточных режимах (меньше накладных расходов).

Когда знаешь, как работает вся система, когда понимаешь, как работает
компилятор и всё, что от него растёт (ассемблер, линкер, бибилиотеки),
то можно точно так же писать маленький код и на Си

Попробую показать на конкретном примере. Те примеры, что я привожу в начале -
я экспериментировал на linux'ах несколькилетней давности, потому как
знаю их получше, и glibc там не такая домороченная. Мы ставим себе условную цель
написать прграмму, которая бы занимала мало места (а соотвественно,
работала быстро и эффективно). Для начала возьмём обычный пример hello world

Что мы имеем, работая целиком на языке:

C
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int
main (void)
{
  printf ("Hello world\n");
  return 10;
}
Code
1
2
3
 $ gcc t.c
$ ls -l a.out
... 14659 ... a.out*
Т.е. мы имеем вроде бы как небольшой файл (14 килобайт), но он динамически слинкован,
что нас не устраивает, ибо зависит от внешних библиотек

Code
1
2
3
 $ gcc t.c -static
$ ls -l a.out
... 1583364 ... a.out*
Статический код занимает невероятно много места - полтора мегабайта

И следствием этого является универсальность библиотек. Принципы, по которым работает
статическая линковка, рассказывать сейчас не хочется (много времени займёт, да и
не все поймут). Реально из этих полутора мегабайт в процессе работы мы пройдёмся
по очень оганиченному куску кода, т.е. в коде мы имеем слишком много балласта
(мёртвого кода)

Что есть программирование на ассемблере под MS-DOS для данного примера. Это написание
кода, который по очереди дёрнет несколько стандартных interrupt'ов (печать текста
на экран и завершение задачи). Всё то же самое можно сделать и на языке, оформив
эти примитивы в виде отдельных блоков. А в linux'е реализация всего этого
есть даже в стандартной поставке. Но начнём с процедур-прокладок, реализующих
системные вызовы (так называется в линуксе то, что для MS-DOS я назваол interrupt'ами)

C
1
2
3
4
5
6
7
8
#include <unistd.h>
 
int
main (void)
{
  write (1, "Hello world\n", 12);
  _exit (10);
}
Code
1
2
3
4
5
$ gcc t.c -static
$ ls -l a.out
... 1581157 ... a.out*
$ ./a.out
Hello world
В этом примере мы уже НЕ работаем через высокоуровневый интерфейс print, а используем
низкоуровневые процедуры-прокладки, которые обращаются непосредственно к системным вызовам.
При этом код пока переносимый на разные платформы. Код стал меньше, но незначительно.
Потому как очень многорастёт из кода инициализации glibc.

Обойдём это дело, путём ручного запуска линкера. С этого момента код на современных
линуксах компилиться не будет из-за причины, которую указал выше: из-за поддержки
многопточности они очень сильно прошили системную библиотеку. После неких
манипуляций я сведу код к тому состоянию, когда он будет запускаться на современных
линуксах

C
1
2
3
4
5
6
7
#include <unistd.h>
 
void _start (void)
{
  write (1, "Hello world\n", 12);
  _exit (10);
}
Здесь мы уже не используем main, а исползуем процедуру с именем _start, которая в
большинстве современных систем является точкой входа для приложения. Если это не так,
то это имя всегда можно задавать через опцию линкера. На текущий момент код
всё ещё переносимый: я проверял на i386-linux и sparc-linux.

Code
1
2
3
4
5
6
$ gcc t.c -c
$ ld t.o -dn -lc -o a.out
$ ls -l a.out
... 3781 ... a.out*
$ ./a.out
Hello world
Видим, что развер файла уже сократился до 3 килобайт (с полутора мегабайт, полученного
при "честной" работе с компиляторм)

Но в данном случае мы всё равно дёргаем некие функции, находящиеся в glibc, а потому
к нам подцепился всякий мусорный код по отработке ошибок системного вызова. Плюс сами
коды по осуществлению вызова функции, которую компилятор просто не может про'inline'ить

Теперь делаем финт ушами, который есть только в linux'е и работает только из-под
компилятора gcc. Далее опять-таки покажу, что можно это сделать и для других систем

C
1
2
3
4
5
6
7
8
9
10
#include <linux/unistd.h>
 
static __inline__ _syscall1(int,exit,int,exitcode)
static __inline__ _syscall3(int,write,int,fd,__const__ char *,buf,long,count)
 
void _start (void)
{
  write (1, "Hello world\n", 12);
  exit (10);
}
Макросы _syscall* определяют в виде процедуры код по вызову syscall'а. Ниже
я вставлю непосредственно потроха этих макросов. В станадртном варианте
эти макросы устанавливают значение errno, которая находится в glibc,
а потому библиотеку пока ещё нужно линковать. Что важно, что этот код
по прежнему работает и на sparc-linux и на i386-linux. gcc выдаёт warning
по поводу exit'а, на который можно не обращать внимания, потому как мы делаем
собственную static реализацию exit'а, чтобы компилятор весь этот код мог
про'inline'ить:

Code
1
2
3
4
5
6
7
$ gcc t.c -c
t.c:57: warning: `exit' was declared `extern' and later `static'
$ ld t.o -dn -lc -o a.out
$ ls -l a.out
... 1537 ... a.out*
$ ./a.out
Hello world
Бинарник уже сократился до полутора килобайт

Теперь тот момент, о ктором я говорил. В линуксе как-то реализация макросов _syscal*
немного плавает, а поэтому затащим её к себе, чтобы уже не зависеть от инклюдов,
установленных на системе. Плюс выкинем код по отработке кода ошибки (а в дальнейшей
реализации его нужно обрабатывать только там, где надо и как надо).

В итоге теперь мы имеем исходник плюс набор *.h файлов, которые отличаются для i386
и sparc. Но это различие нужно отписать только один раз. Дальнейшее развитие программы
будет архитектурно-независимым (насколько это возможно)

C
1
2
3
4
5
6
7
8
/* Файл t.c */
#include "syscall.h"
 
void _start (void)
{
  write (1, "Hello world\n", 12);
  exit (10);
}
C
1
2
3
4
5
6
7
8
9
10
11
/* Файл syscall.h */
#if defined __i386__
#include "i386.h"
#elif defined __sparc__
#include "sparc.h"
#else
#error "unknown arch"
#endif
 
static __inline__ _syscall1(int,exit,int,exitcode)
static __inline__ _syscall3(int,write,int,fd,__const__ char *,buf,long,count)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* Файл i386.h */
#define __NR_exit                 1
#define __NR_write                4
 
#define _syscall1(type,name,type1,arg1) \
type name(type1 arg1) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
        : "=a" (__res) \
        : "0" (__NR_##name),"b" ((long)(arg1))); \
return (type) (__res); \
}
 
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
type name(type1 arg1,type2 arg2,type3 arg3) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
        : "=a" (__res) \
        : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
                  "d" ((long)(arg3))); \
return (type) (__res); \
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/* Файл sparc.h */
#define __NR_exit                 1
#define __NR_write                4
 
#define _syscall1(type,name,type1,arg1) \
type name(type1 arg1) \
{ \
long __res; \
register long __g1 __asm__ ("g1") = __NR_##name; \
register long __o0 __asm__ ("o0") = (long)(arg1); \
__asm__ __volatile__ ("t 0x10\n\t" \
                      "bcc 1f\n\t" \
                      "mov %%o0, %0\n\t" \
                      "sub %%g0, %%o0, %0\n\t" \
                      "1:\n\t" \
                      : "=r" (__res), "=&r" (__o0) \
                      : "1" (__o0), "r" (__g1) \
                      : "cc"); \
return (type) __res; \
}
 
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
type name(type1 arg1,type2 arg2,type3 arg3) \
{ \
long __res; \
register long __g1 __asm__ ("g1") = __NR_##name; \
register long __o0 __asm__ ("o0") = (long)(arg1); \
register long __o1 __asm__ ("o1") = (long)(arg2); \
register long __o2 __asm__ ("o2") = (long)(arg3); \
__asm__ __volatile__ ("t 0x10\n\t" \
                      "bcc 1f\n\t" \
                      "mov %%o0, %0\n\t" \
                      "sub %%g0, %%o0, %0\n\t" \
                      "1:\n\t" \
                      : "=r" (__res), "=&r" (__o0) \
                      : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1) \
                      : "cc"); \
return (type) __res; \
}
С этого момента использование glibc нам больше не нужно. Символьные таблицы
и прочие воспомогательные секции в бинарном файле тоже не нужны, поэтому
их удалим утилитой strip. Ещё подадим в компилятор опцию -fno-builtin,
чтобы не возникал по поводу exit'а (компилятор считает, что exit должен
быть в библиотеке)

Code
1
2
3
4
5
6
7
$ gcc -O2 t.c -c
$ ld t.o -o a.out
$ strip a.out
$ ls -l a.out
... 696 ... a.out*
$ ./a.out
Hello world
Ну и для эксперимента проверим, сколько занимает пустой файл - т.е. теоретический
минимум, меньше которого исполняемый файл не может быть в принципе, потому
как в файле есть некое описание формата, которое никуда не денется. Формат
elf в современных unix'ах условно соответствует формату .exe под DOS/Windows
(не не .com)

C
1
2
3
void _start (void)
{
}
Code
1
2
3
4
5
$ gcc -O2 t.c -c -fno-builtin
$ ld t.o -o a.out
$ strip a.out
$ ls -l a.out
... 564 ... a.out*
В таком виде программа уже будет работать и на современных линуксах, т.к. мы полностью
исключили системные инклюды и библиотеки

Таким образом можно работать на низком уровне, но использовать при этом компилятор.
Конечно это не панацея, т.к. вручную зачастую удастся получше сделать распределение
регистров или ещё чего-то, но на языке писать гораздо удобнее. Не говоря уж о том,
что здесь можно сделать переносимую версию. Но при этом нужно реализовать системные
функции. И если реализацию накрыть стандартным интерфейсом через файл syscall.h,
то эту программу можно заставить работать и под дркгими ОС, а не только под
линуксом
8
Матроскин
17.07.2009, 14:00
короче всё понятно! Спасибо всем!
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
17.07.2009, 19:48
Ассемблер - это некое средство, позволяющее писать машинные команды
на более понятном для человека языке. И не более того.
Вы только что дали определение для любого языка програмирования (или скриптового)
Цитата Сообщение от Evg Посмотреть сообщение
Умение писать "hello world" через стандартные interrupt'ы MS-DOS
это ещё не знание компьютера
Не нравится дос, пиши через биос, не хочешь через биос, пиши напрямую в видео память.
По поводу всяких слов, что мол типа программа на ассемблере занимает мало
места. Когда слышу эти слова, то мне кажется, что люди считают, что
программа занимает мало места, потому что на ассемблере написана. Но это не так.
Просто в этом случае обращения к системе идут напрямую в коде, а не через
библиотечные прокладки, как это делается на языках высокого уровня.
Программы на асме получаются более мелкими и быстрыми из-за того, что при программировании, подходишь к конкретной задаче отдельно, а не лепя универсальные библиотеки в код. Причем это достигается без особо сильного гемора, ведь если оптимизация не требуется, то довольно часто эти же самые библиотеки можно и подключить и использовать.
Я не очень хорошо знаю С, но даже мне заметно, что для получения простого результата, нужно было приложить не так и мало усилий, хотя это и язык более высокого уровня.

Вот код программы на асме, который выведет hello, world в любой ос(не зависит от нее) реального режима, будучи загруженым и выполненым по любому аддресу. Сочинил только что, так что извини, если что не так работает, хотел показать принцип.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mov ax,3
int 10h ; перевод в текстовый режим
mov ax, 0b800h
mov es,ax
call @f
@@:
pop di
add di,msg-$+1
xor si,si
@@:
mov al,[di]
test al,al
jz exit
mov es:[si],al
inc si
inc di
inc si
jmp @b
exit:
 
ret
msg db 'Hello, world',0
А вообще хочется сказать избитую фразу, что не существует универсальных языков. Есть задачи для которых применение асма может сильно увеличить быстродействие программы(драйвера), а есть те, для которых такого же быстродействия можно добиться просто грамотным подходом и автоматической оптимизацией(сортировки какие-нибудь), ну и наконец конечно есть такие, которые впринципе не требуют практически никакой оптимизации, но делать их на асме достаточно даже тяжело( интерфейс, работа с базами данных)
2
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.07.2009, 00:54
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Вы только что дали определение для любого языка програмирования (или скриптового)
Ничего подобного. Написав код на языке, ты не знаешь, какой конкретно код получится (где какой регистр или может быть участок в стеке и т.п.)

Цитата Сообщение от Goodwin98 Посмотреть сообщение
Не нравится дос, пиши через биос, не хочешь через биос, пиши напрямую в видео память.
Не в том дело. Просто многие почему-то считают, что "выучив ассемблер" можно сделать всё что угодно. Хотелось показать, что для того, чтобы сделать всё, что угодно, одних знаний ассемблера недостаточно. Нужно понимать, как устроена машина, как работает на нём ОС и т.п. И неадо ассемблер превращать в крайность, что "до луны и всё". Ассемблер хорош лишь в умелых руках и там, где он нужен по делу - либо нужно выжать максимум производительности, либо написать то, что не выражается средствами языка, либо написать свой компактный код, не зависящий от каких-либо библиотек и т.п. На чистом ассемблере писать большую программу замучаешься, а ещё больше замучаешься её поддерживать или развивать. Ты это, судя по всему, понимаешь, но понимают это не все. Я не пытался тут сказать что "вы мол лохи ничего не шарите", просто пытался на конкретном примере показать, как можно получить достаточно компактный и производительный код (да ещё и переносимый), но на языке Си, что снимает большое количество геморроя при написание кода по сравнению с чистым ассемблером

Цитата Сообщение от Goodwin98 Посмотреть сообщение
Я не очень хорошо знаю С, но даже мне заметно, что для получения простого результата, нужно было приложить не так и мало усилий, хотя это и язык более высокого уровня.
Усилия нужно было прилагать, чтобы написать переносимый код. Ничего не мешало напрямую в коде налепить ассембелрных вставок и не заморачиваться. На Си это удобнее писать именно тем, что, например, удобно сделать кучу переменных, использовать их как надо, и пусть задача распределения регистров станет заботой компилятора, а не программиста.

Цитата Сообщение от Goodwin98 Посмотреть сообщение
Вот код программы на асме, который выведет hello, world в любой ос(не зависит от нее) реального режима, будучи загруженым и выполненым по любому аддресу.
Да вот проблема в том, что "любая ОС реального режима" - это MS-DOS, который уже канул в лету. Хотя это всё должно работать из-под виндов, благо разработчики прикладывают усилия и тащут совместимость

Цитата Сообщение от Goodwin98 Посмотреть сообщение
Сочинил только что, так что извини, если что не так работает, хотел показать принцип.
Не суть, главное принцип. Который я, кстати, знаю, да и те, кто знаком с ассемблером - тоже знают. Правда глобальным понятием "ассемблер" большинство называют всё-таки "ассемблер x86 для real mode"

Цитата Сообщение от Goodwin98 Посмотреть сообщение
А вообще хочется сказать избитую фразу, что не существует универсальных языков. Есть задачи для которых применение асма может сильно увеличить быстродействие программы(драйвера), а есть те, для которых такого же быстродействия можно добиться просто грамотным подходом и автоматической оптимизацией(сортировки какие-нибудь), ну и наконец конечно есть такие, которые впринципе не требуют практически никакой оптимизации, но делать их на асме достаточно даже тяжело( интерфейс, работа с базами данных)
Вот именно. Но почему-то не все об этом задумываются. Просто я смотрю на это как на уже пройденный мною этап. Когда-то мне тоже казалось, что ассемблер это круто, потому что на нём можно всё. Точно так же казалось, что линукс это круто, потому что там можно всё настроить.
0
47 / 47 / 3
Регистрация: 07.01.2009
Сообщений: 297
18.07.2009, 10:01
Добавлено через 21 минуту 51 секунду
Evg,если кто-то не ответил на твою задачу,это не значит,что никто не знает ассемблер,просто многим неохота это делать,потому что занимает очень много времени написание программы.А твоя программа не так уж и сложна.Программа несложная,только муторная,гораздо сложнее векторы отлавлива
Цитата Сообщение от Evg Посмотреть сообщение
Я не пытался тут сказать что "вы мол лохи ничего не шарите", просто пытался на конкретном примере показать, как можно получить достаточно компактный и производительный код (да ещё и переносимый), но на языке Си, что снимает большое количество геморроя при написание кода по сравнению с чистым ассемблером
Выглядит очень геморройно, если ты эту фигню будешь писать в больших проектах,когда сотни людей разрабатывают какую-н. новые свойства у эмулируемого прибора,то тебя пошлют куда подальше с таким кодом, намного легче написать на ассемблере. Код должен быть понятен для всех,а если ты извращаешься таким способом,на тебя косо будут глядеть,или вообще скажут переписать все заново. У тебя пример очень маленький,вообще такая программа никому не нужна,ты попробуй возьми не вывод строки,а поиск подстроки,напр., побольше програмку напиши на ассемблере. И потом напиши на С,сравни и получишь результат.Или что-н., связанное с блокированием какого-л. устройства,замена каких-л. стандартных действий,а потом выполненение стандартных действий этого устройства. Тоже сравни результат.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.07.2009, 10:46
Цитата Сообщение от Ёрик Посмотреть сообщение
Evg,если кто-то не ответил на твою задачу,это не значит,что никто не знает ассемблер,просто многим неохота это делать,потому что занимает очень много времени написание программы.А твоя программа не так уж и сложна.Программа несложная,только муторная,гораздо сложнее векторы отлавлива
В общем, ты так и не понял, о чём я писал. Да я уверен, что те, кто это читал - "знают ассемблер", только ничерта им это не помогает, потому что одного "знания ассемблера" мало, нужно знать устройство машины и принципы её работы. Моя задча - предельно простая. И времени требует немного. Но она требует некоторых знаний, которыми болшинство тех, кто "знает ассемблер" попросту не обладает. И тот мой пример - вполне конкретная реальная задача, которую нельзя написать на языке прграммирования (по крайней мере без ассемблерных вставок)

Цитата Сообщение от Ёрик Посмотреть сообщение
Выглядит очень геморройно, если ты эту фигню будешь писать в больших проектах
Если ты что-то не понимаешь - это не значит геморройно. В больших проектах скорее пошлют код, целиком написанный на ассемблере, потому что для его постоянной модификации бедет требоваться гораздо больше времени, чем для кода на ассемблере

Цитата Сообщение от Ёрик Посмотреть сообщение
намного легче написать на ассемблере
Если ты не понял (а скорее всего так оно и есть) - в этом годе на ассемблере написано то, что нельзя написать на языке. Остальное написано на языке. И ещё раз хочу подчеркнуть - мой вариант работает на разных платформах

Цитата Сообщение от Ёрик Посмотреть сообщение
Код должен быть понятен для всех,а если ты извращаешься таким способом,на тебя косо будут глядеть,или вообще скажут переписать все заново
Ещё раз. Если ты этого не понимаешь, то оттого, что дальше примитивного программирования под MS-DOS пока ещё ничем не занимался. Да, я этого наверняка знать не могу, но я делаю такой вывод из твоих слов. И не ставлю себе целью обидеть тебя или лпустить

Цитата Сообщение от Ёрик Посмотреть сообщение
а поиск подстроки,напр.,
Я это поиск подстроки написшу на Си. Если этот код получется на 10 байтов длиннее, чем вручную наисанный на ассемблере, то займёт он в 10 раз меньше времени на написание

Цитата Сообщение от Ёрик Посмотреть сообщение
Или что-н., связанное с блокированием какого-л. устройства,замена каких-л. стандартных действий,а потом выполненение стандартных действий этого устройства. Тоже сравни результат.
Для этого я попросту сделаю ассемблерную вставку, потому как напрямую в зыке такие вещи скорее всего не реализуются

Добавлено через 10 минут 23 секунды
Вот ещё. В мире много людей, которые хорошо понимают аппаратуру, приницпы её работы, принципы работы ОС, но при этом являются очень плохими программистами. Потому что мышление у них аппаратное, а не программное. Такие люди как правило не в состоянии писать код на ассемблере. Но вот в таком варианте на Си они "хоть как-то" код смогут написать. Т.е. они будут как конструктор собирать код из отдельных макро-блоков (в моём случае макроблоками являются write и exit)
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
18.07.2009, 12:19
Собственно говорить в одном контексте об переносимости и об ассемблере, как минимум просто не стоит, он не для этого используется.
Да вот проблема в том, что "любая ОС реального режима" - это MS-DOS, который уже канул в лету.
Конечно сейчас нет большой необходимости в реальном режиме, но, например, если ты будешь писать свой загрузчик, то без программирования в реальном режиме не обойдешься и сейчас.
Хорошо. Вот такой вариант, как я понял, должен работать из под любого i386 linux'a.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    call @f
@@:
    pop ecx
    add ecx,msg-$+1
    mov eax,4
    mov ebx,1
    mov edx,msglen
    int 80h
 
    mov eax,1 
    mov ebx,0 
    int 80h
msg db 'Hello, world',0ah
msglen equ $-msg
Помоему это вполне разумный копромис в большой программе - использовать, ф-ции, написаные на асме, там где это нужно, а в остальных случаях пользоваться удобными средствами языка.
Да я уверен, что те, кто это читал - "знают ассемблер", только ничерта им это не помогает, потому что одного "знания ассемблера" мало, нужно знать устройство машины и принципы её работы.
Скажи, а делая на Си программу посложнее hello.c не нужно знать, напр., особенности ОС? Я сомневаюсь, что до того "финта ушими" может дойти простой смертный, только что узнавший о прорграмировании. Вообще подобные знания приходят с опытом. Вполне очевидно, что когда учишь асм, то даже не думаешь, о том как работать с отладочными регистрами, тем более, что пользоваться ими напрямую из ring 3 затруднительно, а ищешь необходимую информацию, когда она нужна.
0
47 / 47 / 3
Регистрация: 07.01.2009
Сообщений: 297
18.07.2009, 12:33
Понимаешь,программа должна быть такой,чтобы в ней видно,что ты пытаешься сделать,и речь не о том,что кто-то не понимает,а втом,чтобы тратить время на чтение программы и понятие,как она работает. Когда напишем на ассемблере(сделаем вставку),то понятно что откуда и куда,а когда такой код из-за того,чтобы исключить системные инклюды и библиотеки. Программист, который пишет дополнения к твоей программе,посмотрит на жуть,и скажет,я-то разберусь 100%,но мне на это тратить огромное время?
Еще один момент: мы хотим сделать парсер,напр,есть какой-н. файл большой текстовый в компании,не буду фантазировать,что мы хотим найти(информацию о email-,телефонные номера и т.п.), и он весит порядка 100-300 мб, и если ты потратишь 15 сек на написание программы на С,программма будет выполняться довольно долго,а на ассемблере мало того,что com файл будет весить меньше 500 байт,так еще и выполняться быстре,чем программа,код которой написан на Perl. Evg,понимаю ,что разговарию с профи,поэтому не хочу долго спорить. На этом дискуссию хотелось бы закончить.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.07.2009, 18:46
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Собственно говорить в одном контексте об переносимости и об ассемблере, как минимум просто не стоит, он не для этого используется.
Возможно, но пересносимость - вещь тем не менее нужная. Возможно, что для DOS/Windows эта проблема остро не стоИт. А для многоплатформенного линуха - стоИт и ещё как. Ведь X'ы и куча всяких драйверов, сильно завязанных на конкретный процессор, конкретное устройство и т.п. - они все на си написаны, а архитектурно-зависимая часть выделена вот в такие короткеи блоки, которые затем используются в большом общем коде. Тем более мой пример был приведён в первую очередь для того, чтобы продемаонстрировать, что все те же самые манипуляции можно делать и из-под языка, вынося соотвествующие макроблоки в макросы, которые дёргают системные вызовы. Переносимый код при этом мы получаем практически бесплатно

Цитата Сообщение от Goodwin98 Посмотреть сообщение
Конечно сейчас нет большой необходимости в реальном режиме, но, например, если ты будешь писать свой загрузчик, то без программирования в реальном режиме не обойдешься и сейчас.
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Помоему это вполне разумный копромис в большой программе - использовать, ф-ции, написаные на асме, там где это нужно, а в остальных случаях пользоваться удобными средствами языка.
В этом вопросе мы с тобой мыслим одинаково: ассемблер нужен там, где он нужен. Использовать его абсолютно везде выходит боком.

Цитата Сообщение от Goodwin98 Посмотреть сообщение
Хорошо. Вот такой вариант, как я понял, должен работать из под любого i386 linux'a.
Мой вариант делает то же самое, только первый блок реализуется через write, а второй - через exit. Только из-под нынешней версии компилятора на i386 остаётся дополнительный мусор. Sparc'вский вариант написан более грамотно, к нему в идеале и стОит привести intel'овский вариант

Цитата Сообщение от Goodwin98 Посмотреть сообщение
Скажи, а делая на Си программу посложнее hello.c не нужно знать, напр., особенности ОС?
В большинстве случаев нет. Попробую ещё раз объъяснить, для чего я всё это написал. Для того, чтобы показать, что и работая с компилятором можно получать короткий код (ибо короткий код для многих является аргументом), которыё делает практически то же самое, что и код на ассемблере. "Практически", потому что из-под компилятора всё равно временами будут вылезать лишние операции по пересылке данных - это плата за удобство

Хотелось показать, что не надо зацикливаться на "знании ассемблера". Особенно там, где это на практике не нужно. Оптимальный результат нужно получать комбинируя язык и ассемблер

Цитата Сообщение от Goodwin98 Посмотреть сообщение
Я сомневаюсь, что до того "финта ушими" может дойти простой смертный, только что узнавший о прорграмировании.
Давай начинающих трогать не будем

Цитата Сообщение от Goodwin98 Посмотреть сообщение
Вообще подобные знания приходят с опытом. Вполне очевидно, что когда учишь асм, то даже не думаешь, о том как работать с отладочными регистрами, тем более, что пользоваться ими напрямую из ring 3 затруднительно, а ищешь необходимую информацию, когда она нужна.
Естественно, что всё приходит с опытом. Если после моих слов кто-то увидел для себя ту же самую проблему, но под другим углом, или просто подумал о том, о чём раньше не задумывался - значит я не зря всё это расписывал.

Добавлено через 7 минут 18 секунд
Цитата Сообщение от Ёрик Посмотреть сообщение
Понимаешь,программа должна быть такой,чтобы в ней видно,что ты пытаешься сделать,и речь не о том,что кто-то не понимает,а втом,чтобы тратить время на чтение программы и понятие,как она работает. Когда напишем на ассемблере(сделаем вставку),то понятно что откуда и куда,а когда такой код из-за того,чтобы исключить системные инклюды и библиотеки. Программист, который пишет дополнения к твоей программе,посмотрит на жуть,и скажет,я-то разберусь 100%,но мне на это тратить огромное время?
Еще один момент: мы хотим сделать парсер,напр,есть какой-н. файл большой текстовый в компании,не буду фантазировать,что мы хотим найти(информацию о email-,телефонные номера и т.п.), и он весит порядка 100-300 мб, и если ты потратишь 15 сек на написание программы на С,программма будет выполняться довольно долго,а на ассемблере мало того,что com файл будет весить меньше 500 байт,так еще и выполняться быстре,чем программа,код которой написан на Perl. Evg,понимаю ,что разговарию с профи,поэтому не хочу долго спорить. На этом дискуссию хотелось бы закончить.
Как бы это объяснить тебе получше. Почему родители запрещают детям делать что-либо, что по мнению детей является нормальным? Потому что родители с высоты своих знаий понимают о последствия, а дети нет.

Вот так же и мне хочется начинающим показать вид на эту проблему под другим углом. Поскольку ты всё равно не понял, о чём я говорю, значит я плохо объяснил. Или повторяю стандартную ошибку преподавателей - не могу (или не пытаюсь) понять, а что же именно ты не понял (или не захотел понять). Я не ставлю себе цель во что бы то ни было тебя переспорить. Цель моя - объяснить тебе. Если ты считаешь, что дискуссию пора сворачивать (потому как ты в ней уже не видишь для себя ничего интересного) - давай свернём. Без обид и нареканий. При этом буду надеяться, что когда-нибудь ты всё-таки осознаешь, о чём я пытался втолковать. Даже если к тому времени ты уже 10 раз забудешь, о чём мы тут говорили. Ибо вот так устроен мозг: информация где-то в глубинах мозга откладывается, а потом начинает осваиваться
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
18.07.2009, 19:12
Evg, извиняюсь, а как, собственно, связь между "я хочу научиться ассемблеру до слез" и никому ненужным копипастом кода сискола в хеадер? Я смысла и связи проследить не могу...

Добавлено через 2 минуты 52 секунды
Ааа...вижу это ты про "мало места" писал. Вопрос отпал. Хых. Забавно. После этого кто-нибудь точно подумает, что ассемблер - бог Скажет: йопти, как он "сишный" код "ужал".
0
47 / 47 / 3
Регистрация: 07.01.2009
Сообщений: 297
18.07.2009, 19:18
Evg,я вижу что с профи разговариваю,поэтому не хочу тупо быть настырным и упертым козлом,поэтому и решил прервать дикуссию,а не потому,что не итнтересно
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.07.2009, 19:22
По крайней мере я увидел свою собственную проблему - не смог доступным языком объяснить сложную вещь. Проблему та же, что и у преподавателей - я попытался объяснить так, как удобно мне, а не так, как понятно людям. А людям было бы понятно, если бы они это самое смогли повторить под DOS/Windows, но я в этих системах не разбираюсь, а разобраться на уровне данных примеров было лениво (да и на работе виндов нету)

По поводу никому не нужного копипаста. Грубо говоря, если взять оригинальный системный, т.е. без выхеривания ernno, то получится плохо. errno это как правило "#define errno *(__errno_location())", который тянет за собой целый паравоз ненужных вещей, в какой-то момент это цепляет потоковую часть, котороая реализуется на механизмах unwind'а, который в свою очередь со стороны компилятора требует поддержки personality. В итоге получается бесконечная кишка. Копипаст совсем маленький, так что считаю, что в данном случае он был оправдан.

Добавлено через 3 минуты 9 секунд
Цитата Сообщение от Ёрик Посмотреть сообщение
Evg,я вижу что с профи разговариваю,поэтому не хочу тупо быть настырным и упертым козлом,поэтому и решил прервать дикуссию,а не потому,что не итнтересно
Я не вижу в тебе упёртого козла. Я вижу в тебе себя N лет назад. А потому пытаюсь использовать методы объяснения, которые были бы понятны мне в твойм возрасте. Но сам понимаешь, разным людям надо объяснять по разному, и ты моё объяснение не понял. Если всё-таки есть интерес к дискуссии, попробуй более развёрнуто пояснить, с чем ты не согласен. В идеале - чего ты не понял в моих объяснениях, но это, как мне кажется, сложнее, ибо там писанины было много и за раз переварить новичку сложно
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
18.07.2009, 19:26
А каком еррно ты говоришь?

Добавлено через 1 минуту 9 секунд
Ты имел ввиду, что __сискол_ретурн убрал?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.07.2009, 19:30
Да и по поводу "профи" и "новичков" вообще. Во мне нет такого, что с новичками надо общаться с позиции "я начальник, ты дурак". Тем более у молодых более свежий взгляд на вещи и более широкое мышление.

Недавно у нас студент предложил решение проблемы, которую мы волынили уже несколько лет: вроде бы оно нужно, но решения настолько геморойные, что выходило, что затраты и усилия не соотвествовали результату. Так вот предложение студента диктовалось недостатком опыта работы и было настолько бредовым, что решили его проверить, потому как реализовывалось это просто. Когда заработало сразу же, без какой-либо дополнительной отладки, то мы сразу же начали искать ошибки в реализации, ибо казалось, что развалиться должно было почти сразу. Но этот бред работает и работает хорошо.

Добавлено через 2 минуты 13 секунд
Цитата Сообщение от Vourhey Посмотреть сообщение
А каком еррно ты говоришь?
Ты имел ввиду, что сикол_ретурн убрал?
Ога. Во всяком случае на той системе, что у меня на работе, весь этот паравоз всплыл. У нас какая-то gentoo, изнасилованная и адаптированная нашим админом. gcc вроде бы 4.1.3, glibc где-то в районе 2.6 или 2.7 (исключения и потоки реализуются на unwind'е)
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
18.07.2009, 19:41
Evg, да, у int 80h оверхед немалый.
Можно еще вызывать без использования самого прерывания. У нас по систем.мапу вызывали ядерный vsyscall, чтоб поближе к точке sysenter. Тоже оптимизнуть нужно было прогу.
Для 99% прог это, конечно, лишнее.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.07.2009, 20:01
Цитата Сообщение от Vourhey Посмотреть сообщение
Evg, да, у int 80h оверхед немалый.
Можно еще вызывать без использования самого прерывания. У нас по систем.мапу вызывали ядерный vsyscall, чтоб поближе к точке sysenter. Тоже оптимизнуть нужно было прогу.
Для 99% прог это, конечно, лишнее.
Я просто попытался объяснить, что код на ассемблере под DOS (например, в посте #83) построен по тому же самому принципу. В моём примере просто это сделано в виде некоей херни, которую можно использовать внутри программы на Си. Понтяно, что write можно было бы переписать так, чтобы оно работало ещё быстрее (и переписать, дрпустим, только для intel'а). При этом программа осталась бы в неизменном виде
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
18.07.2009, 21:40
Evg, в итоге, ты бы, все равно, не ушел ниже драйвера. Даже не одного. Минимум файловой системы и физического устройства. Тут только тту.

Добавлено через 1 минуту 15 секунд
Это я к тому, что смысла в этом всем особого нет.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
19.07.2009, 00:42
Цитата Сообщение от Vourhey Посмотреть сообщение
Это я к тому, что смысла в этом всем особого нет.
В итоге даже ты не понял, чего я хотел... В следующий раз надо будет, видимо, по пунктом расписать: что, зачем, а главное, на кой хрен
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
19.07.2009, 00:48
Evg, по вопросу в теме - вообще ни на кой.

Добавлено через 4 минуты 33 секунды
Я просто попытался объяснить, что код на ассемблере под DOS (например, в посте #83) построен по тому же самому принципу.
Да. это так, как ни странно . Я просто не могу уследить, как нить привела к тому, что пришлось это объяснять. Да, и если человек поработает с прерываниями дос, потом попрерывает линукс, поймет, что в общем-то все похоже. Как я понимаю, автор темы еще этим не занимается.
И по моему скромному мнению, это уже больше относится не к самому ассемблеру, сколько к архитектуре платформы.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
19.07.2009, 01:20
Цитата Сообщение от Vourhey Посмотреть сообщение
Как я понимаю, автор темы еще этим не занимается.
Автор давно уже тему не читает. Просто так получилось, что эта тема вылилась в дальнейшие обсуждения работы ассемблере

Цитата Сообщение от Vourhey Посмотреть сообщение
И по моему скромному мнению, это уже больше относится не к самому ассемблеру, сколько к архитектуре платформы.
Именно это я и пытаюсь объяснить людям, считающим, что "выучили ассемблер". Но не могу подобрать внятные слова
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.07.2009, 01:20

Хочу научится писать парсеры. С чего начать?
Хочу освоить написание парсеров. Посоветуйте какие функции стоит изучить! Также буду благодарен, если подскажите где почитать про...

Хочу научится программировать но не знаю с чего начать
Всем привет! Меня зовут Александр. Хочу научиться программировать на языке . Опыта в этой сфере нету, но есть желание подскажите с чего...

Хочу научится программировать микроконтроллеры, но не знаю с чего начать
здравствуете, я хочу научится программировать микроконтроллеров, но не знаю с чего начать, в гугле очень много книг по этой теме и я не...

Помогите научится!!!!
Здравствуйте добрые люди, я начал заниматься ремонтом стиральных машинок, но проблема в том, что модули(микросхемы), я сам не могу...

Как научится ООПэшить?
Как научится &quot;ООПэшить&quot;? Я самоучка, &quot;фрилансю&quot; на пхп и яваскрипте уже пару лет, но когда я пытаюсь написать что-нибудь на ООП (если можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Закрытая тема Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru