Pull to refresh

Comments 24

Было бы круто, если бы вы добавили в раздел "Объекты в голове программиста" информацию про выравнивание, когда ожидается, что структура в памяти будет занимать, например, 5 байт, а занимает 8.

Да и про влияние выравнивания и его необходимость тоже. Скажем, на IA-32 (x86) базовый набор команд не требует какого-либо выравнивания операндов, но производительность от этого таки зависит. А вот операнды SSE уже должны быть выровнены в обязательном порядке, если правильно помню. А в ARMах допустимость невыровненных операндов зависит от разновидности архитектуры. Ну и т.д. и т.п.

Ещё было бы круто не называть struct объектами. Все таки объект это грубо говоря struct в сочетании с кодом для его обработки

Так себе логика.

struct с методами это объект?

class без методов это не объект?

В Си объекты могут быть представлены только struct-ами. Но не любой экземпляр struct-а правомочно назвать объектом с точки зрения программистской логики.

MessageBoxIndirect принимает структуру, но это не объект, а просто пачку параметров упаковали в структуру.

IoDeleteDevice в ядерном/драйверном коде тоже принимает структуру (DEVICE_OBJECT), и это явно объект.

Ну так я о том же что не стоит ООПшные объекты сюда цеплять. Лучше структуру структурой называть, разве нет?

Есть книга Чарльз Петцольд "Код" там это гораздо понятней и проще описано. А если хочется посмотреть как работает, то есть серия статей на Wasm по написанию своего компилятора или взлом с OlyDb

для понимания основ(/расширения кругозора/разрыва шаблонов) стоит познакомиться с архитектурой мотороловского MC14500, там всего шестнадцать инструкций. Вот к примеру у одного любителя есть экстракт, если не охота по даташитам искать: http://www.righto.com/2021/02/a-one-bit-processor-explained-reverse.html

Для спойлера: там например нет переходов назад, только вперед. Циклы тем не менее возможны, хотя очень весело

Вижу ассемблер – плюсую. Потом прочитал, понравилось – захотелось еще раз лайкнуть, а нельзя-я-я!

На машинном уровне есть только биты. В том числе размер данных (в байтах) условен и определяется исполняемой инструкцией. Типы данных, модификаторы (final, private, public) - только на уровне языка, в машинном коде их не существует, все "поля" (байты) объекта изменяемы вне зависимости от настроек языка.

Смотря какая машина.

Ух. Спасибо. Ностальжи. TASM forever!

  • WORD = 2 байта

  • DWORD = 4 байта

А еще бывает и другое: word = 4 bytes; halfword=2 bytes; dword=8bytes....

Все зависит от конкретного ассемблера и конкретного проца/MCU.

Причём у упоминаемого здесь ARM слово как раз 4 байта, а 2 байта -- это полуслово. Кстати, 64-разрядной является архитектура ARMv8-A, а вот все более ранние, а также ARMv8-M -- 32-разрядные.

А ещё биты могут нумероваться не справа налево, а наоборот (0 -- старший): так дело обстоит в ИБМовской Системе 360 и её потомках, включая современную z/Architecture.

В общем, косяков по мелочи найти можно немало.

Спасибо! Действительно очень талантливо описано.) Вызывает ностальгические чувства .

push bp

mov pb,sp

Не забыть ни когда)

"Код выполняется по шагам (тактам), за один шаг исполняется одна машинная инструкция".

Нет.

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

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

Я впервые познакомился с программированием как раз через ассемблер. Классе в 10 по-моему. Наверное 1999 год. Сейчас мой язык JavaScript

Многие вещи упрощены. Как уже писали выше про инструкцию на такт. Или к примеру про локальные переменные на стеке, про то что стек растет вниз, про упрощенные float'ы, и т. д.

Но для новичка я думаю нюансы и не нужны, и как обзорная статья вполне норм должна зайти.

Да, как же на ассемблере все проще и понятней. Объяснить школьнику обьекты, темплейты и прочие сущности С++ крайне тяжело. А вот байты и операции с ними гораздо проще и у человека появляется понимание что на самом деле представляет из себя машина.

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

А память программст очищает так:

xor eax, eax

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

MOV BX, [AX]

Неверный режим адресации. В 16-битном мире возможны только (речь только о регистрах) [BX], [BP], [SI], [DI], [BX+SI], [BP+SI], [BX+DI], [BP+DI]. Впрочем, возможно вы имели в виду [EAX] или [RAX].

Sign up to leave a comment.

Articles