Comments 26
Что такое ассемблер? — это машинные инструкции, то есть команды что делать процессору.
Вот это поворот! Так и надо! С ходу и поддых!
Что такое DLL библиотека?
Это файл с расширением DLL :)
P.S. Но, признаться, изложение отторжения не вызвало. Скорее недоумение. Если на таком уровне объяснять, то программирование становится карго-культом.
1. Объясню позже;
2. Объясню позже;
3. Объясню позже.
:)
При всей кривой грамотности, повествование на редкость складное и гладкое, с места в карьер, без рассусоливаний. Рубленый слог, прям Маяковский. Если такими темпами продолжать, то можно внезапно куче народу ненавязчиво объяснить, как оно все в действительности работает - большинство ведь не знает (и даже не знает о том, что не знает).
Однозначно, аффтар, пеши истчо! Серьезно.
1) два в одном: компилятор + линковщик;
2) мощная система макросов.
Щас, конечно, всё забыл давно.
Помню только, что секцию импорта можно было формировать тремя способами:
1) выписывать всё врукопашную, что для мелких проектов — норм, но, если проект хоть сколько-то серьёзен, — заколебаешься;
2) импортировать скопом — по строчке на dll-ку, это раздувало экзешник, конечно, зато никакой нудятины с выписыванием по одной функции;
3) была консольная утилитка, которая прочёсывала исходники и формировала секцию импорта — категорически удобная штука, я бы её включил в джентльменский набор fasm-разработчика.
Еще yasm есть :)
На masm32, код hello world получится в 2 раза короче из-за того, что не надо импортировать функции. Просто пишешь на winapi не сильно заморачиваясь.
Приятно осознавать, что кто-то еще интересуется и популяризует этот язык.
Даёшь больше инфы про системные вызовы Windows, Linux, BSD! С примерами и пояснениями!
include "win32ax.inc"
и тогда просто пишите:
.data
.code
invoke printf, "Hello World"
.end $EntryPoint
и формат PE и прочее было бы не нужно…
Хотя тогда статья была бы о программе в 5 строк и не чем было бы писать? =)
Написали бы лучше статью о возможностях фасма, о его препроцессоре и чем он уникален.
О его авторе математике Томасе, о том что он сам себя компилирует, о том что в виде дллки есть, о плагинах. Лет 10 назад был макрос позволяющий вызывать функции вот так:
CreateFile(...)
CloseHandle(..)
ExitProcess(0)
вместо invoke, ccall.
Fast то и отличается design principles, от всего другого и возможностями кастомизации.
.486 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include \masm32\include\windows.inc ; always first
include \masm32\macros\macros.asm ; MASM support macros
; -----------------------------------------------------------------
; include files that have MASM format prototypes for function calls
; -----------------------------------------------------------------
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
; ------------------------------------------------
; Library files that have definitions for function
; exports and tested reliable prebuilt code.
; ------------------------------------------------
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.code ; Tell MASM where the code starts
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start: ; The CODE entry point to the program
print chr$("Hey, this actually works.",13,10)
exit
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start ; Tell MASM where the program ends
Это писал Сплит…
Эйнштейн: "Долго делать программу. (относительно)"
Творец: "Теперь мы полностью готовы. К началу."
Вдохновитель: "По началу вас это может напугать, но не боимся и разбираемся."
Мастер интриги: "На самом деле из всей этой каши текста, команд всего 3: на 16, 18, 21 строках. (и то это не команды, а макросы. Мы к командам даже не подобрались)"
Индус: "Самое интересное то что программа весит 2КБ. (Можно сократить и до 1КБ, но для упрощения и так пойдет)"
Философ: "Это штото на подобие команды, но это и близко не команда ассемблера, а просто макрос."
Заботливый: "Не переживайте если нечего не поняли."
Оптимист: "Дальше думаю не стоит объяснять, вроде все понятно."
Автор, а чем другие статьи по асму на Хабре не понравились? Зачем ещё одна?
Не знаю, не знаю. Я вот с изумлением смотрю, в какую ассемблерную кашу компилируется рекурсивный расчёт числа Фибоначчи на С.
Попробуйте сами:
#include <stdio.h>
int fibonacci(int n)
{
if (n <= 1)
{
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
int main(void)
{
printf("%i", fibonacci(45));
}
Недавно на stackoverflow прочитал такой вот комментарий (актуальный тут, как мне показалось):
Hellо, I am a compiler.
I just scanned thousands of lines of code while you were reading this sentence. I browsed through millions of possibilities of optimizing a single line of yours using hundreds of different optimization techniques based on a vast amount of academic research that you would spend years getting at. I won't feel any embarrassment, not even a slight ick, when I convert a three-line loop to thousands of instructions just to make it faster. I have no shame to go to great lengths of optimization or to do the dirtiest tricks. And if you don't want me to, maybe for a day or two, I'll behave and do it the way you like. I can transform the methods I'm using whenever you want, without even changing a single line of your code. I can even show you how your code would look in assembly, on different processor architectures and different operating systems and in different assembly conventions if you'd like. Yes, all in seconds. Because, you know, I can; and you know, you can't.
P.S. Oh, by the way you weren't using half of the code you wrote. I did you a favor and threw it away.
Туториал по FASM (Windows x32 API/Win32API), «Hello world!»