Форум программистов, компьютерный форум, киберфорум
FASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12

Что есть "макрос"? (разделение темы "Можно ли FASM сделать высокоуровневым?")

02.08.2017, 00:13. Показов 3893. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от flamehowk Посмотреть сообщение
В корне с Вами не согласен, почему-то создается ощущение, что Вы не совсем понимаете что такое макрос и зачем он нужен. Конечно, не спорю, макрос можно написать так, что он будет увеличивать длину кода и даже уничтожать оптимизацию на корню - но зачем же его так писать, если такой цели не стоит?
Макрос – это текстовый код, обрабатываемый препроцессором (к тому же, его функционал весьма и весьма ограничен, как уже сказано). Если делать макрос, оптимизирующий код, представьте насколько вся эта система будет тормозить. И какой смысл делать это таким образом, когда можно написать нормальный компилятор? Ну или транслятор. Получается, что каждая строка кода будет превращаться в сотню других строк, и прога из 100 строк превратится в прогу из 10 000 строк, грубо говоря. Это полный бред. Такой подход реализован в fasmg, но это специфический компилятор, попытка сделать универсальный ассемблер подо все платформы, но никак не ЯВУ. Я не пробовал компилировать им обычную прогу на ассемблере в 1000 строк и сравнивать скорость с обычным fasm, но очевидно, что fasmg будет работать значительно медленнее.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.08.2017, 00:13
Ответы с готовыми решениями:

Можно ли FASM сделать высокоуровневым?
Приветствую всех. Вопрос к специалистам: можно ли с Вашей позиции FASM, с учетом наличия в нем макросов, превратить в язык высокого...

Fasm 1.69.39 что нового. И как сделать макрос без запятых типа IF eax => 10
Все кто программирует в Fasm-e знают что если макрос принимает более 1-го параметра, то надо писать запятую (к примеру MyMacr x,y). А вот...

Продолжение темы с файлом, как можно сделать так что если нет фала
Продолжение темы с файлом, как можно сделать так что если нет фала то запись новых данных в таблицу не возможна

15
0 / 0 / 0
Регистрация: 22.02.2016
Сообщений: 27
02.08.2017, 11:27
Цитата Сообщение от Jin X Посмотреть сообщение
Макрос – это текстовый код, обрабатываемый препроцессором
Вы, похоже, тоже не знаете - что такое макрос.
На сегодняшний день практически все виды кода - текстовые, а то, что макросы обрабатываются предпроцессором еще не определяет их суть.
Макрос - это небольшой стандартный набор команд для выполнения рутинной задачи, по сути - некоторая универсальная подпрограмма. Ну, если грубо, то это выглядит так:
Допустим, процессор не имеет встроенной аппаратной поддержки для умножения двух чисел, а потому реализация умножения на нем будет представлять собой серию сложений и сдвигов, меняющихся поочередно.
Допустим, нам нужно умножить в начале программы 2*3, а в конце 5*7.
Мы пишем два отдельных кода:
............
a := 10
b := 10 << 1
c := a + b
............
и второй
............
a := 100
b := 100 << 1
c := a + b
b := b << 1
c := c + b
b := b << 1
c := c + b
b := b << 1
c := c + b
b := b << 1
c := c + b
b := b << 1
c := c + b
................
И каждый раз, когда нам нужно что-то умножить, нужно повторять эту чехарду столько раз, сколько единиц в множителе.
Выход из этой ситуации прост - пишем универсальную подпрограмму (макрос), в которой вставляем неопределенный цикл и стандартный набор сдвигов и сложений:
..............
in z (число единиц в множителе)
in x (умножаемое)
a := x
b := x << 1
c := a + b
for i = 0 to i = z
b := b << 1
c := c + b
end for
out c
.......
Все, наша универсальная подпрограмма готова, теперь в нее можно загружать любые два числа и она их перемножит путем многоразового чередования сложений и сдвигов.
Как можно видеть, мы НЕ увеличиваем код, а СОКРАЩАЕМ - вместо тысяч строк кода при попытке перемножить два числа, одно из которых находится в районе десятичной тысячи, мы имеем код в десяток-другой строк на ассемблере, который с одинаковой легкостью перемножить хоть тысячи, хоть миллионы, хоть миллиарды. И это я еще не говорю о том, что показанный выше код мы получим на выходе ассемблерного предпроцесса, а сам код будет выглядеть еще проще, ибо там весь набор вышеизложенных команд будет заменен всего на одну строку:
........
run macros umnoj (z,x)
........
Вообще одна строка вместо тысяч.
По сути, именно это и является предметом всех известных базовых библиотек на языках программирования - универсальные подпрограммы, которые заменяют многокомандные рутинные операции. Просто в ЯВУ есть специальные методы их подключения и соответствующие им команды вроде #include, а в fasm-е они заменены макросами, которые по сути выполняют функцию того же #define.

В общем - не туда я советоваться пришел...
Ну да ладно, решение все-равно уже принято, чему быть - того не миновать.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
02.08.2017, 13:42  [ТС]
Цитата Сообщение от flamehowk Посмотреть сообщение
Как можно видеть, мы НЕ увеличиваем код, а СОКРАЩАЕМ
Мы его сокращаем лишь в исходнике, но после обработки его препроцессором этот код значительно увеличится.
Т.е. этот run macros umnoj (z,x) превратится в
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
a := 100
b := 100 << 1
c := a + b
b := b << 1
c := c + b
b := b << 1
c := c + b
b := b << 1
c := c + b
b := b << 1
c := c + b
b := b << 1
c := c + b
который и будет компилироваться в итоге. Это раз.
А второе – перед тем, как run macros umnoj (z,x) превратится в этот код препроцессор должен будет пройтись по определению этого макроса и сгенерировать такой код (т.е. он должен будет обработать и отбросить все ненужные if-ы, выполнить все циклы for, while и т.д.).

Для иллюстрации.
fasm скомпилировал код
Assembler
1
2
3
4
use32
rept 1000000 {
  mov eax,edx
}
за 0.7 секунды

fasmg (в котором mov описан макросом, а не встроен в компилятор) на код
Assembler
1
2
3
4
5
include '80386.inc'
use32
rept 1000000
  mov eax,edx
end rept
примерно через минуту выдал ошибку "not enough memory to complete the assembly"
Пришлось уменьшать счётчик в 10 раз (до 100000), результат был готов через 12 секунд!!!

Разница в скорости в 170 раз!
Вот и весь разговор про макросы...
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
02.08.2017, 14:14
Цитата Сообщение от flamehowk Посмотреть сообщение
Вы, похоже, тоже не знаете - что такое макрос.


Похоже Вы не представляете, что такое макрос в ассемблере.
Макроопределением (или макросом) называется участок программы, которому присвоено имя и который ассемблируется всякий раз, когда ассемблер встречает это имя в тексте программы.
Поиск по форуму MACRO дал одним из первым вопрос с использованием макроса. после компиляции и создания листинга:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
      2                  scale   macro   p1
      3                      fld max_&p1
      4                      fsub    min_&p1
      5                      fild    p1&_res
      6                      fdivp   st(1), st(0)
      7                      fstp    scale_&p1
      8                  endm
 
 
     53                      scale   x
1    54     000D  DD 06 0008r            fld max_x
1    55     0011  DC 26 0000r            fsub    min_x
1    56     0015  DF 06 0010r            fild    x_res
1    57     0019  DE F9              fdivp   st(1), st(0)
1    58     001B  DD 1E 0014r            fstp    scale_x
     59                      scale   y
1    60     001F  DD 06 0024r            fld max_y
1    61     0023  DC 26 001Cr            fsub    min_y
1    62     0027  DF 06 002Cr            fild    y_res
1    63     002B  DE F9              fdivp   st(1), st(0)
1    64     002D  DD 1E 0030r            fstp    scale_y
Видно, что всякий раз когда встретился макрос, его код подставляется в исходный код ассемблера и компилируется, на листинге эти участки отмечены 1 в начале строки.

Цитата Сообщение от flamehowk Посмотреть сообщение
Допустим, нам нужно умножить в начале программы 2*3, а в конце 5*7.
предложенный Вами вариант процедуры(подпрограммы), не макроса написан с ошибкой, т.к. он будет правильно работать когда в бинарном представлении все единицы идут подряд.
Если умножать 5Х7=
000101
001010
010100
=====
100011=35
но если делать 7Х5, получается
000111
001110
=====
010101=21


Вот код, под фасм, который реализует правильный алгоритм умножения, сложением:
Assembler
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
org     100h
mov     ax,5
mov     bx,7
call    Multi
mov     bx,10
xor     cx,cx
@@:
xor     dx,dx
div     bx
push    dx
inc     cx
or      ax,ax
jnz     @b
@@:
pop     ax
or      al,'0'
int     29h
loop    @b
ret
Multi:
xor     cx,cx
m1:
shr     ax,1
jnc     @f
add     cx,bx
@@:
shl     bx,1
or      ax,ax
jnz     m1
mov     ax,cx
ret
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
02.08.2017, 15:33
Цитата Сообщение от flamehowk Посмотреть сообщение
Макрос - это небольшой стандартный набор команд для выполнения рутинной задачи, по сути - некоторая универсальная подпрограмма
В ассемблере макрос - это просто текстовая подстановка. Не подпрограмма. А замена всюду в исходном тексте программы имени макроса на тело макроса, ну может с какими-то параметрами, условиями или повторениями. Но макрос - это ТЕКСТОВАЯ ЗАМЕНА (ПОДСТАНОВКА) В ИСХОДНИКЕ. Это средство предварительной обработки текста исходника и ничего более.
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
02.08.2017, 16:04
Цитата Сообщение от flamehowk Посмотреть сообщение
В корне с Вами не согласен, почему-то создается ощущение, что Вы не совсем понимаете что такое макрос и зачем он нужен
Похоже на этом форуме все опытные ассемблерщики не понимают. И даже я, что начинал с MACRO-11 (кажется с первого макроассемблера в мире) и то засомневался понимаю ли. Похоже Вы пришли сюда всем нам объяснить.
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
02.08.2017, 16:08
Цитата Сообщение от flamehowk Посмотреть сообщение
И каждый раз, когда нам нужно что-то умножить, нужно повторять эту чехарду столько раз, сколько единиц в множителе.
Ну кто так делает ? Пишется подпрограмма умножения в столбик. К макросам отношения не имеющая. После чего можно использовать и макрос, оформив им вызовы этой подпрограммы с параметрами. В итоге получается так - если в тексте программы встречается
mul a, b
то макроподстановка раскрывает эту строчку до
push a
push b
call _mul_
и вызываемая здесь универсальная подпрограмма
_mul_:
код умножения столбиком
ret
производит умножение a на b

Добавлено через 17 минут
В макроподстановку можно добавить условную трансляцию и в случае если один из операндов константа и степень двойки раскрывать макрос не вызовом подпрограммы, а прямой вставкой в код сдвигов влево. Но это уже косметические улучшения.
0
0 / 0 / 0
Регистрация: 22.02.2016
Сообщений: 27
03.08.2017, 00:13
Цитата Сообщение от Jin X Посмотреть сообщение
но после обработки его препроцессором этот код значительно увеличится.
А я что - не тоже самое сказал?

Цитата Сообщение от Jin X Посмотреть сообщение
fasmg (в котором mov описан макросом, а не встроен в компилятор) на код
Я не об этом спрашивал...

Цитата Сообщение от Constantin Cat Посмотреть сообщение
Макроопределением (или макросом) называется участок программы, которому присвоено имя и который ассемблируется всякий раз, когда ассемблер встречает это имя в тексте программы.
А я что - не то же самое написал? Мне нужно было именно Вашими словами написать, чтобы это стало для Вас понятно?

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

Цитата Сообщение от Ethereal Посмотреть сообщение
В ассемблере макрос - это просто текстовая подстановка. Не подпрограмма.
Да? Может тогда просветите нас, чем же таким отличается "подпрограмма" от "текстовой подстановки"? Особенно на уровне низких языков программирования, как-то ассемблер?

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

Цитата Сообщение от Ethereal Посмотреть сообщение
Ну кто так делает ?
Скажите - какая разница кто так делает? Я что, пришел здесь Вас ассемблеру учить? Были высказаны нелепые идеи по поводу сути макросов, я наиболее предельно простым и доступным способом описал суть дела с учетом того, что я знаю о молодых программистах, делающих подобные высказывания... все. Напиши я хоть строчку ассемблерного кода - вообще не факт, что кто-то что-то понял бы.
Есть три явления в природе:
Профессионал, который знает суть вещей и понимает, как они работают, а потому может эффективно решать задачи, манипулируя предметом профессии.
Специалист, который ничего не понимает в происходящем, но который заучивает стандартные манипуляции и наборы операций, а потому в неизменных условиях может решать поставленные задачи.
Халтурщик, не только не понимающий сути вещей, но и не владеющий темой вообще, не умеющий ничего делать ни на каком уровне, но зато имеющий диплом и полтора года непонятного пребывания на непонятных должностях.
Так вот - первых в любой профессии единицы. Вторых - несколько процентов, а вот третьих - это все остальные. Когда сталкиваешься с таковыми и данные господа начинают "объяснять" вещи, которых не понимают вообще, то пред ними лучше срывать покровы максимально простым и доступным для их неокрепшего сознания образом.
Если Вы опытный программист, то не мне, а господам, отвечавшим мне, напишите что к чему с макросами и с чем их едят, может чему и научатся полезному, а то Вы себе не ту цель выбираете.
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
03.08.2017, 02:06
Цитата Сообщение от flamehowk Посмотреть сообщение
Да? Может тогда просветите нас, чем же таким отличается "подпрограмма" от "текстовой подстановки"?
Кого вас ?
Подпрограмма и текстовая подстановка - это куплеты из разных песен.

Подпрограмма это кусок кода, который многократно вызывается из разных мест программы. Подпрограмма вызывается назначенной на то инструкцией процессора и завершается назначенной на то инструкцией. То есть подпрограмма - это код.

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

Добавлено через 15 минут
Вот примеры использования макроподстановок из одной моей версии Форта :
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        _LINK = 0           ;Force NULL link
        _NAME = $N0
 
$CODE       MACRO   LEX, NAME, LABEL
LABEL:      _CODE = $
        _NAME = _NAME - (LEX AND 1Fh) - 5
    ORG _NAME
        DW  _CODE           ;Поле кода
        DW  _LINK           ;Поле связи
        _LINK = $
        DB  LEX, NAME       ;Поле имени
    ORG _CODE
        ENDM
 
$COLON      MACRO   LEX, NAME, LABEL
        $CODE   LEX, NAME, LABEL
        CALL    ENTER_
        ENDM
Благодаря таким макросам по мере компиляции исходника я еще создаю и словарь,
т.е. односвязный список записей с именами сущностей Форта и указателями.
Использую я эти макросы в тексте программы вот так
Code
1
2
3
4
5
6
        $CODE   3, 'DUP', DUPE
тут нативный код
        $CODE   4, 'SWAP', SWAP
тут нативный код
        $COLON  11, 'DEFINITIONS', DEFINITIONS
тут шитый код
и с каждым таким использованием добавляется новая запись в список
имен. Причем список имен создается не там где ассемблируется код, а
в хвосте программы. Для этого в макросе текущая позиция трансляции
перекидывается туда-сюда с помощью ORG. В итоге код COM-программы
наращивается начиная от смещения 100h и растет вверх, а список имен
наращивается начиная со смещения 8000h и растет вниз.

Это пример использования макросов на всю катушку их возможностей.
Ими я заставляют TASM делать то, что он не умеет. Он не умеет
ассемблировать по адресам сверху вниз, а я его заставляю.
Мне нужно, чтобы он не просто скомпилировал программу, а породил
двоичный образ для загрузки в память со специальной структурой.
И я его заставляю.

Но вот каким образом вот все это можно обозвать подпрограммами ? Да никаким !

Добавлено через 27 минут
З.Ы.
Цитата Сообщение от flamehowk Посмотреть сообщение
На сегодняшний день практически все виды кода - текстовые
Вот эта фраза мне вообще не понятна. Ставит в тупик.
Но кажется я догадываюсь.
Вот, к примеру, в сетевой игрушке World of Warcraft макрос на снятие дебаффов паладином выглядит так
/cast Божественный щит
/cancelaura Божественный щит

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

Добавлено через 35 минут
З.З.Ы
Короче говоря понял. Вы используете понятие макрос так, как будь-то ничего кроме интерпретаторов не видели.
Поэтому у Вас "код текстовый", "макрос = подпрограмма в виде куска текста для исполнения интерпретатором".
Но АССЕМБРЕР НЕ ЕСТЬ ИНТЕРПРЕТАТОР ! Он компилятор !
Он имеет на входе исходный текст, а на выход выдает двоичный код.
А макросы выполняют текстовые подстановки даже не на входе, а еще до входа.
Т.е. это те-же текстовые подстановки, что и у интерпретатора, да только того смысла, что у интерпретатора они не имеют.

Добавлено через 7 минут
Цитата Сообщение от flamehowk Посмотреть сообщение
Как можно видеть, мы НЕ увеличиваем код, а СОКРАЩАЕМ
Цитата Сообщение от Jin X Посмотреть сообщение
Мы его сокращаем лишь в исходнике
Ну конечно. Это разговор ассемблерщика с интерпретаторщиком.
Для TC код, это то, что для JinX исходник. А того, что для JinX код, для ТС просто не существует.
0
0 / 0 / 0
Регистрация: 22.02.2016
Сообщений: 27
03.08.2017, 02:30
Цитата Сообщение от Ethereal Посмотреть сообщение
Подпрограмма это кусок кода, который многократно вызывается из разных мест программы. Подпрограмма вызывается назначенной на то инструкцией процессора и завершается назначенной на то инструкцией. То есть подпрограмма - это код.
Иногда, когда я ем картофельный суп, я зачерпываю картошку ложкой, поэтому - это называется картошкой, а иногда я ложкой картошку загребаю, и это уже называется гуща, а потому - картошка и картофельная гуща в картофельном супе - это как небо и земля, как черное и белое, как стол и грабли.
Даже не знаю, что Вам и сказать, милейший. Видимо склонность придумывать новые языки программирования повлияла на Ваше понимание того, что такое языки общения. Понимаете, язык общения призван доносить информацию от одного интеллекта к другому. Для этой цели принято одно понятие обозначать одним и тем же набором звуков. Всякий же, кто для одного и того же понятия сначала использует несколько различных наборов звуков, а потом на основе того, что существуют разные наборы звуков начинает утверждать, что это есть разные понятия - вносит сумятицу и непонимание.
А потому, когда Вы пытаетесь убедить меня, что код - это не подпрограмма, а подпрограмма - это не код, а код - это не макрос, а макрос - это не подстановка, а подстановка - это вообще никакого отношения к языкам программирования не имеет, Вы порождаете тех, кто потом пишет такие программы, из-за которых у обычный пользователей волосы на голове дыбом встают.
И подпрограмма, и макрос - это суть одно и то же явление, и оба эти явления - суть код. Точка.
Они имеют один и то же вид, они выполняют одни и те же задачи, и они одинаково применяются. И вся разница только в том, что такие как Вы одному и тому же явлению дают два разных названия, а потом вдруг оказывается, что это разные вещи. Зачем столько лет быть программистом, чтобы самому себя запутывать и других тоже? Ну я бы еще понял преподавателей из институтов, которым нужно как-то перед студентами делать вид, что они умнее студентов, что бы студенты им бабло в мешках носили, а потому - чем надежнее студента запутаешь, тем лучше... но здесь же не университет и сюда Вам бабло не принесут, чтобы поклониться Вашей мудрости - здесь то зачем эти петли нарезать? А потом бедные дипломированные программисты, уверены, что системный блок - это черный ящик, внутри которого волшебная мана в зависимости от вида организует им то функциональное метакриптирование, а то абстрактно-ориентированное субпроцедурирование. И невдомек им, что там внутри просто квадратики да проводки на подложке.
Не путайте никого, пожалуйста.
Программа - это законченный кусок кода, который выполняет всю поставленную задачу.
Подпрограмма - это часть программы в любом виде.
Макрос - это подпрограмма, и он то же код.
Технология вызова того или иного по факту никакого значения не имеет и ничего не меняет, тем более, что в машинных кодах она везде и всегда одинакова - это просто оператор безусловного перехода. ВСЕ. И чем больше в ЯВУ создают терминологических наслоений одного на другое, тем больше себя же сами и запутывают. А потом не понятно почему в железяке элементарная штука постоянно вылетает в лютый блэк-аут. А все потому, что бедному программисту мозг промыли и он потерялся во всех этих псевдо-определениях и парадигмах.

Цитата Сообщение от Ethereal Посмотреть сообщение
Но вот каким образом вот все это можно обозвать подпрограммами ? Да никаким !
Ну вот зачем мама рожала? Из принципа? И буквы уже не буквы, и код уже не код. Вы вообще в состоянии отделить процесс проектирования алгоритма, от терминов, применяемых при его составлении? Мышление как процесс, от мыслей, как отдельных его элементов? Вопросы от ответов?
Если Вы разработали некий метод, который позволяет решать некоторую задачу, то это именно метод. Никакого отношения к определению сути остальных вещей, которые Вы используете в своем методе, это не имеет. Какая разница каким образом у Вас выполняется некоторая часть кода - то ли Вы ее вставляете в код основной программы, а то ли Вы ее "вызываете"? Суть одна и та же - в нужном месте будет выполнен заданный кусок кода. КОДА! И этот кусок кода будет лишь частью общей последовательности всех кодов основной программы. Эти куски и есть - подпрограммы. Опять таки - не важно в каком виде они существуют - записаны они в отдельных файлах или влеплены в основной. Макрос, подпрограмма, функция - все это одно и то же явление! И работает оно одинаково. Различия, которыми Вы пытаетесь их наделить существуют лишь в Вашем воображении на том уровне абстракции, который Вы избрали для проектирования своих алгоритмов.
Вот уж воистину - и смешал Бог Яхве их языки, и перестали понимать друг друга.

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

Добавлено через 5 минут
Цитата Сообщение от Ethereal Посмотреть сообщение
Ну конечно. Это разговор ассемблерщика с интерпретаторщиком.
Ага, Вы меня еще в джава-пейсатели запишите.
Я занимаюсь разработкой архитектуры вычислительных устройств и созданием команд для ее использования в машинных кодах - какие в баню "интерпретаторщики"?
Я вижу великая Тьма опустилась на очи наших программистов. Оттого то у них все программное обеспечение написано такими кривыми руками, что они понятия про элементарные вещи не имеют.
Ладно, щас я Вам заделаю "интерпретацию"...
...а скажите ка бетенька - сколько в алгоритмической логике существует базовых логических элементов?
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
03.08.2017, 04:49
Цитата Сообщение от flamehowk Посмотреть сообщение
Подпрограмма - это часть программы в любом виде.
И что ей даже не надо завершаться по ret и вызываться по call ?
Или иметь любой другой механизм возврата управления именно туда откуда ее вызвали ?

А что же тогда сопрограмма ?

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

Цитата Сообщение от flamehowk Посмотреть сообщение
А потом бедные дипломированные программисты, уверены, что системный блок - это черный ящик, внутри которого волшебная мана в зависимости от вида организует им то функциональное метакриптирование, а то абстрактно-ориентированное субпроцедурирование.
Это о каких-то сферических программистах в вакууме ? Моя вторая профессия электронщик.

Добавлено через 8 минут
Цитата Сообщение от flamehowk Посмотреть сообщение
Технология вызова того или иного по факту никакого значения не имеет и ничего не меняет, тем более, что в машинных кодах она везде и всегда одинакова - это просто оператор безусловного перехода. ВСЕ.
Ни хрена не все. В системе команд Intel 8080 подпрограммы вызываются также и инструкциями условного перехода вызова CZ CNZ CC CNC CM CP CPO CPE. Их никак не назвать безусловными

Добавлено через 3 минуты
Цитата Сообщение от flamehowk Посмотреть сообщение
...а скажите ка бетенька - сколько в алгоритмической логике существует базовых логических элементов?
Да любую логику можно вылепить на одних вентилях 2И-НЕ. И на 2ИЛИ-НЕ можно. Но базовыми привычно называют И ИЛИ НЕ.

Добавлено через 3 минуты
Цитата Сообщение от flamehowk Посмотреть сообщение
в котором текстовый вид будет иметь исключительно оттранслированный машинный код
Это просто треш и угар какой-то.

Добавлено через 5 минут
З.Ы,
Короче, предлагаю создать подраздел Клиника и свалить этот топик туда.
0
0 / 0 / 0
Регистрация: 22.02.2016
Сообщений: 27
03.08.2017, 09:33
Цитата Сообщение от Ethereal Посмотреть сообщение
Или иметь любой другой механизм возврата управления именно туда откуда ее вызвали ?
А Вы что, хотите сказать, что когда Вы употребляете макрос или функцию происходит не то же самое - переход в начало данного кода, его выполнение и возврат управления обратно в то место, где все это было закончено? Вы "электронщик", хоть понимаете, что на физическом уровне все это происходит абсолютно одинаков и, как я уже упомянул, каким именно образом происходит операция вызова не имеет значения. Это из оперы "что в лоб, что по лбу". Все равно что масло маслянное, а что оно - маслянистое. Разницы - ноль. Понимаете?

Цитата Сообщение от Ethereal Посмотреть сообщение
инструкциями условного перехода вызова CZ CNZ CC CNC CM CP CPO CPE. Их никак не назвать безусловными
Существует условный и безусловный переход. Условный - это по условию, безусловный - это без условий. Условный if, безусловный goto. В логике соответственно - "Если-То" и "Перейти". И этого не изменить. И при чем тут условные вызовы 80-го процессора? Блудим, батенька, в трех соснах?

Цитата Сообщение от Ethereal Посмотреть сообщение
Но базовыми привычно называют И ИЛИ НЕ.
Понимаю, оно как в голове с самого начала все перепуталось, так до сих пор все на куче и лежит, верно?
Я у Вас спросил не про схемотехнику, а про алгоритмическую логику и в оной существует всего 2 базовых логических элемента - операция и условный переход. Все. Больше ничего. Даже безусловный переход является абстракцией первого уровня над физическим уровнем логики. И все именно так печально потому, что такова природа вещей в нашем трех-мерном мире - любая последовательная связь состоит из двух типов элементов: прямая связь и развилка связей, то есть - веточка и узел, в котором веточка разделяется на несколько веточек. Тоже самое и в электронике - проводник и элемент, позволяющий разделить сигнал на разные потоки. Все. Ничего более в природе нашей вселенной не существует.

Соответственно, любая законченная программа (полный ее алгоритм) - это набор двух типов связей, указанных выше. Он подобен дереву - ствол, разветвление, дальше веточки, на каждой свои разветвления и так далее, до физического предела. И все это дерево - есть программа. А любая его меньшая часть (под-уровень программы) называется подпрограммой. Веточку с одной стороны желтой краской пометил, а с другой красной - и все, что между этими двумя маркерами - это отдельный кусок кода (алгоритма), и он - есть подпрограмма. Как бы Вы не хотели, но на физическом уровне он будет работать одинаково в не зависимости от того как Вы его обозвете - макросом, функцией, структурой, библиотекой, классом, объектом, субъектом, элементом, системой, да хоть хрено-темой, суть от этого не меняется. Даже если Вы эту веточку положите в отдельный файл, она будет считана из файла и в области памяти присоединена к основному коду программы и в конечном итоге Вы получите полный алгоритм этой самой программы. Через какие команды, операторы, инструкции и вызовы Вы будете обращаться к этому куску кода не имеет никакого значения, потому что на самом деле Вы просто перенесете центр внимания процессора на определенную область памяти, в самое начало этой области - и все, больше там ничего не происходит.

Ну и вот, этому всему Вы придумываете десятки и сотни названий. И, заметьте, это еще на уровне абстракций ЯНУ - ассемблера. А что творится в мозгах тех, кто работают с джавами и шарпами Вы хоть представляете? Там тысячи определений одного и того же явления и у каждого из них, в виду того, что это операторы языка программирования, может быть целый список обязательных и необязательных определений и прочего мусора... как эти люди вообще могут писать хоть что-то, что в результате можно будет назвать программой? И ведь они реально не представляют что происходит на самом деле. В их головах такие абстракции бродят, что иной раз даже трудно представить, что это физически можно выполнить на существующем в природе железе. А именно эти люди, по идее, должны писать простые и надежные программы. И у них - не получается. У них все ПО в мире - это заплатки, нашитые на костыли, подставленные под прокладки, положенные на замазку в тех местах, где ВНЕЗАПНО "почему-то" все дало трещины и никто не понимает откуда оно повылезло.
Вы сейчас поняли о чем я вообще говорю или как об стенку горохом?

Здравый смысл нам подсказывает, что эффективной может быть только работа с доступным нашему пониманию по уровню простоты, понятности и объема видом интеллектуального материала. Отсюда, в любом деле, а особенно в таком сложном с интеллектуальной точки зрения как Информационные Технологии, любой объект должен проектироваться с точки зрения максимальной унификации, упрощения и очевидности. А если Вы на корню вырубаете эти простые правила еще на уровне ЯНУ, то где же потом этому здравому смыслу взяться в конечном продукте - ПО и железе сегодняшнего дня?

Цитата Сообщение от Ethereal Посмотреть сообщение
Это просто треш и угар какой-то.
Это ж в какой день машинный код стал "трешем" и "угаром"? Или Вы, может, дошли до такого, что хотите сказать, что нолики и единички машинного кода - не есть текст, а есть звук или картинка?

Цитата Сообщение от Ethereal Посмотреть сообщение
Короче, предлагаю создать подраздел Клиника и свалить этот топик туда.
А это не я его породил и здесь самую большую активность проявляете именно Вы! Я еще в корневой теме четко сказал, что тема закрыта по причине решенности вопроса и никого не просил уже по окончании темы начинать мне рассказывать, что макрос - не является частью кода программы, а суть бананы на ветках березовой рощи.
С другой стороны, современные программисты в большинстве своем даже элементарных основ логики не знают, не понимают - что такое алгоритм, как он устроен и зачем существует. Недавно на одном форуме нарвался на парня, который ринулся создавать СВЕРХ-язык программирования, язык всех языков, который бы мог описывать и переводить друг в друга абсолютно любые парадигмы программирования, в том числе и такие, которые еще не существуют в природе. И вот этот то парень, при том, что он знает такое слово, как "алгоритм" - ни малейшего представления о его сути не имеет. Смешно было так, что я чуть живот не надорвал... хоть в одно и то же время - весьма грустно.

Так вот, если до того дошло, что базовые элементы мира информационных технологий, которые программисты и схемотехники должны еще в детском саду изучать, ибо на них, как на фундаменте, стоит весь этот хрупкий мирок, для Вас являются "Клиникой" - то можете сваливать, может хоть в Клинике отдельные разумные люди смогут познать то, что такие профессионалы как Вы их не в состоянии научить даже в институтах. А Вы продолжайте писать словари СИНОНИМОВ технических терминов - это и действительно, как я погляжу, весьма полезно если нужно взорвать себе мозг окончательно.
0
 Аватар для Ol44
197 / 89 / 15
Регистрация: 10.07.2016
Сообщений: 146
03.08.2017, 11:09
Цитата Сообщение от flamehowk Посмотреть сообщение
А Вы что, хотите сказать, что когда Вы употребляете макрос или функцию происходит не то же самое - переход в начало данного кода, его выполнение и возврат управления обратно в то место, где все это было закончено?
Да вам уже много раз говорили об этом, а получалось
Цитата Сообщение от flamehowk Посмотреть сообщение
"что в лоб, что по лбу"
И если например: подпрограмма имеет размер 100 байт, ВЫЗОВ её 10 раз будет 5*10 байт итого основная программа "потолстеет" на 150 байт; макрос имеет размер 100 байт, ПРИМЕНЕНИЕ макроса 10 раз увеличит программу на 100*10 байт. Потому что подпрограмма вызывается и экземпляр её кода 1, макрос не вызывается, а вставляется и его экземпляров в теле программы будет много. Это в чём физически разница между ними и то не вся.
Цитата Сообщение от flamehowk Посмотреть сообщение
Макрос, подпрограмма, функция - все это одно и то же явление! И работает оно одинаково. Различия, которыми Вы пытаетесь их наделить существуют лишь в Вашем воображении на том уровне абстракции, который Вы избрали для проектирования своих алгоритмов.
Вот уж воистину - и смешал Бог Яхве их языки, и перестали понимать друг друга.
Вот после таких заявлений и пишут
Цитата Сообщение от Ethereal Посмотреть сообщение
Это просто треш и угар какой-то.

Цитата Сообщение от flamehowk Посмотреть сообщение
Есть три явления в природе:
Профессионал, который знает суть вещей и понимает, как они работают, а потому может эффективно решать задачи, манипулируя предметом профессии.
Специалист, который ничего не понимает в происходящем, но который заучивает стандартные манипуляции и наборы операций, а потому в неизменных условиях может решать поставленные задачи.
Халтурщик, не только не понимающий сути вещей, но и не владеющий темой вообще, не умеющий ничего делать ни на каком уровне, но зато имеющий диплом и полтора года непонятного пребывания на непонятных должностях.
Так вот - первых в любой профессии единицы. Вторых - несколько процентов, а вот третьих - это все остальные. Когда сталкиваешься с таковыми и данные господа начинают "объяснять" вещи, которых не понимают вообще, то пред ними лучше срывать покровы максимально простым и доступным для их неокрепшего сознания образом.
Господа вам отвечавшие относятся к первым двум категориям по вашей классификации, а вы к третьей.
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
03.08.2017, 11:51
Да flamehowk Вас явно-же тролит.. А если нет, то это просто новичёк, а ни какой ни..
Цитата Сообщение от flamehowk Посмотреть сообщение
Я занимаюсь разработкой архитектуры вычислительных устройств и созданием команд для ее использования в машинных кодах
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
03.08.2017, 12:29  [ТС]
Дабы не нарушать своими халтурными суждениями размышлений Гуру о Великом, я пожалуй, откланяюсь.
Боюсь даже читать всё это, дабы не запутаться в терминах и не замкнуться в себе из-за ощущения собственной никчёмности
Чего и вам, друзья, рекомендую

Добавлено через 5 минут
А если серьёзно, flamehowk, если из этой идеи получится что-то стоящее, я первый выдам аплодисменты стоя.
Но пока, исходя из этого Comedy Club feat. Cirque du Soleil, что здесь происходят...
1
0 / 0 / 0
Регистрация: 22.02.2016
Сообщений: 27
04.08.2017, 12:11
Цитата Сообщение от Ol44 Посмотреть сообщение
Господа вам отвечавшие относятся к первым двум категориям по вашей классификации, а вы к третьей.
То что я делаю - никогда не глючит, знаете ли, и в мире не так много профессионалов, способных со мной потягаться в вещах, в которых я разбираюсь.

Цитата Сообщение от R71MT Посмотреть сообщение
А если нет, то это просто новичёк, а ни какой ни..
Первую свою официальную профессию программиста я получил еще в 1994-ом году, так что я довольно таки "новый" чек.

Цитата Сообщение от Jin X Посмотреть сообщение
А если серьёзно, flamehowk, если из этой идеи получится что-то стоящее, я первый выдам аплодисменты стоя.
Ловлю на слове
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.08.2017, 12:11
Помогаю со студенческими работами здесь

Есть акардеон как можно сделать что-бы линк исчезал?
Есть акардеон как можно сделать что-бы когда текста меньше чем 50 px ccылка &quot; Показать все&quot; исчезала? &lt;!DOCTYPE html&gt; ...

Сложные программы (игры) на Qbasic. Что можно сделать и есть ли предел?
При увеличении размера программы, рано или поздно, программа перестает запускаться (появляются сообщения &quot;Out of memory&quot; или...

Что можно сделать, чтобы ноутбук сильно не перенагревался? Какие есть способы?
Пожалуйста, не предлагайте способ - подложить что-то под ноутбук , всё равно перенагревается и отключается. какие альтернативные...

Хорошая сборка или нет? Наверняка есть, что можно сделать лучше, поэтому буду рад критике
Собираю пк брату для учебы минимум на 5 лет, потенциально чтобы можно было воткнуть и еще поиграть в будущем. То есть, чтобы ПК не был...

Макрос [FASM] - как обратиться к макросу и как передать параметр в макрос
Задачка тривиальная, но как обратиться к макросу и как передать параметр в макрос, ибо ругаецо? Само тело программы, по видимому,...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru