Pull to refresh

Comments 26

Что такое ассемблер? — это машинные инструкции, то есть команды что делать процессору.

Вот это поворот! Так и надо! С ходу и поддых!

Если сразу не понял с кем имеешь дело, то добиваем:
Что такое DLL библиотека?

Это файл с расширением DLL :)

P.S. Но, признаться, изложение отторжения не вызвало. Скорее недоумение. Если на таком уровне объяснять, то программирование становится карго-культом.
Я просто упростил до максимума, по сути на ассемблере очень близко программируют на машинном коде, я даже не расписывал какие есть ассемблеры.
Краткое содержание:
1. Объясню позже;
2. Объясню позже;
3. Объясню позже.
:)

Мне как раз это понравилось наоборот в стиле статьи. Разговор по-мужски.

Кому как. Лично я такую фигню ещё со школы не люблю.

При всей кривой грамотности, повествование на редкость складное и гладкое, с места в карьер, без рассусоливаний. Рубленый слог, прям Маяковский. Если такими темпами продолжать, то можно внезапно куче народу ненавязчиво объяснить, как оно все в действительности работает - большинство ведь не знает (и даже не знает о том, что не знает).

Однозначно, аффтар, пеши истчо! Серьезно.

С ассемблером я разбирался лет 15 назад. Смотрел masm, tasm, nasm, goasm, но fasm — показался самым удобным и лёгким в освоении для новичка из-за двух моментов:
1) два в одном: компилятор + линковщик;
2) мощная система макросов.
Щас, конечно, всё забыл давно.
Помню только, что секцию импорта можно было формировать тремя способами:
1) выписывать всё врукопашную, что для мелких проектов — норм, но, если проект хоть сколько-то серьёзен, — заколебаешься;
2) импортировать скопом — по строчке на dll-ку, это раздувало экзешник, конечно, зато никакой нудятины с выписыванием по одной функции;
3) была консольная утилитка, которая прочёсывала исходники и формировала секцию импорта — категорически удобная штука, я бы её включил в джентльменский набор fasm-разработчика.
Да, но в середине 2000-х он, кажется, был ещё в зачаточном состоянии. Nasm уже потихоньку загибался, а yasm подхватывал его идеи и концепции.

На masm32, код hello world получится в 2 раза короче из-за того, что не надо импортировать функции. Просто пишешь на winapi не сильно заморачиваясь.

АСМ жил, АСМ жив, АСМ будет жить!
Приятно осознавать, что кто-то еще интересуется и популяризует этот язык.
Даёшь больше инфы про системные вызовы Windows, Linux, BSD! С примерами и пояснениями!
UFO just landed and posted this here
Я об этом писал. Я знаю что ассемблер это не машинные инструкции.
Я понимаю, что не по теме, но просто в очередной раз увидел и хочу, наконец, спросить. Почему люди постоянно затирают %USERNAME% в скриншотах? Я рискну предположить, что имя пользователя у автора — это что-нибудь вроде «zeq52giw», «illya334» или просто «Illya», наконец. Если я на скриншоте увижу «C:\Users\Illya» — это что, будет какой-то кошмарный деанон, и Земля налетит на небесную ось? Эти прямоугольники только внимание привлекают без нужды.
Ну вот у меня на рабочем компьютере имя пользователя суть мой внутренний табельный номер и я его светить по идее не должен (хотя тут вряд ли этот случай). Другое дело, что для статьи можно просто завести обезличенного юзера, ну либо в виртуалку поставить всё и показывать всё как есть. В общем есть куча способов не замазывать.
Интересное изложение материала, без лишних слов сразу к делу — отличный подход! Автору спасибо.
include "win32ax.inc"
и тогда просто пишите:
.data
.code
invoke printf, "Hello World"
.end $EntryPoint

и формат PE и прочее было бы не нужно…
Хотя тогда статья была бы о программе в 5 строк и не чем было бы писать? =)

Написали бы лучше статью о возможностях фасма, о его препроцессоре и чем он уникален.
О его авторе математике Томасе, о том что он сам себя компилирует, о том что в виде дллки есть, о плагинах. Лет 10 назад был макрос позволяющий вызывать функции вот так:
CreateFile(...)
CloseHandle(..)
ExitProcess(0)

вместо invoke, ccall.

Fast то и отличается design principles, от всего другого и возможностями кастомизации.
На masm32 код был бы таким:
    .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
Можно сократить инклуды до
include \masm32\include\windows.inc ; always first
include \masm32\macros\macros.asm ; MASM support macros
uselib kernel32,user32,masm32,gdi32 ;хотя зачем тут юзер и гди?

Это писал Сплит…
Эйнштейн: "Долго делать программу. (относительно)"
Творец: "Теперь мы полностью готовы. К началу."
Вдохновитель: "По началу вас это может напугать, но не боимся и разбираемся."
Мастер интриги: "На самом деле из всей этой каши текста, команд всего 3: на 16, 18, 21 строках. (и то это не команды, а макросы. Мы к командам даже не подобрались)"
Индус: "Самое интересное то что программа весит 2КБ. (Можно сократить и до 1КБ, но для упрощения и так пойдет)"
Философ: "Это штото на подобие команды, но это и близко не команда ассемблера, а просто макрос."
Заботливый: "Не переживайте если нечего не поняли."
Оптимист: "Дальше думаю не стоит объяснять, вроде все понятно."

Автор, а чем другие статьи по асму на Хабре не понравились? Зачем ещё одна?

Хелловорлд всяко написать проще, чем что-то реально новое и полезное.
Fasm реально хорош, как то давно сделал один проект коммерческий на нём, векторные расчёты, SSE и AVX использовался, до сих пор крутится. По прошествии времени понимаю что это был мартышкин труд. Сейчас компилятор C++ гораздо лучше всё оптимизирует и написать проще.

Не знаю, не знаю. Я вот с изумлением смотрю, в какую ассемблерную кашу компилируется рекурсивный расчёт числа Фибоначчи на С.

Попробуйте сами:

#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.

Sign up to leave a comment.

Articles