LINUX.ORG.RU

Нужно ли учить ассемблер?


2

3

Пишу на С++. Нужно ли учить ассемблер? МатЧасть (устройство оперативной памяти, указатели, сколько какая переменная занимает памяти) и так далее примерно знаю (опыт кодинга на с++).

Также очень поверхностно знаю как работает процессор(читал разные статьи на хабре).

Будет ли мне профить от учения ассемблера (Под профитом понимаю лучшее понимание Си-шного кода при роботе с памятью указателями и разные принципы оптимизации)

UPD Мне все равно на мой заработок. Я хочу программировать как бог.

Перемещено mono из talks



Последнее исправление: knotri (всего исправлений: 1)

Ответ на: комментарий от emulek

x>>1 быстрее x/2. Причина такому парадоксу много, оснавная причина в том, что gcc умеет переделывать x/2 в x>>1 (когда это надо), а вот наоборот — увы.

Чё? o_O

i-rinat ★★★★★
()
Ответ на: комментарий от emulek

Я думал ты об отладчике.

Пацаны(tm) разбирают код без отладчика!

Yustas ★★★★
()
Ответ на: комментарий от emulek

У меня асм был сразу после синклеровского бейсика, и вот я могу уверенно сказать, что никаких принципиальных отличий от сей в нем нет. Если кому-то интересно, как же работает железо под асмом, достаточно усвоить, что примитивные операции отображены на команды, сложные выражения дробятся на последовательности команд, и есть instruction pointer, регистр-указатель на очередную команду к исполнению, и stack pointer, регистр-указатель на вершину стека. Вызов функции это поклажа значений и текущего ip в стек и замена ip на адрес вызова. Возврат это доставание ip из стека. Переход, условный или безусловный это просто занесение нового значения в ip. На этом делаются лупы. Что еще забыл?

Зачем это все трогать руками — непонятно. Ясность приходит с моделью в голове, а не с асмом.

arturpub ★★
()

Нужно ли учить ассемблер?

«Если не уверены, выбирайте N».

i-rinat ★★★★★
()

не будет. Я знал ассемблер до того, как знал Си. Это совершенно разные вещи.

dikiy ★★☆☆☆
()

ты, дяденька, дурак. Ассемблер учить не надо, особенно тот, что для x86, ибо после этого останешься моральным уродом навсегда.

Асм — это _инструмент_, и если нет понимания, зачем он нужен — то вряд ли он тебе вообще нужен. И вообще, в мире архитектур — как собак нерезаных в советском союзе, так что ты уж уточни, про что идет речь.

demidrol ★★★★★
()
Ответ на: комментарий от i-rinat

x>>1 быстрее x/2. Причина такому парадоксу много, оснавная причина в том, что gcc умеет переделывать x/2 в x>>1 (когда это надо), а вот наоборот — увы.

Чё? o_O

мне лениво с тобой спорить. Сам почитай выхлоп компилятора.

emulek
()
Ответ на: комментарий от knotri

Я не могу понять что тут будет происходить на низком уровне.

на нихком уровне есть такие же команды косвенной адресации. Ну то есть есть команда

mov [AX],BX - занести в ячейку с адресом в AX значение из регистра CX.

а есть команды прямой адресации:

mov [адрес],BX.

в принципе все то же самое.

dikiy ★★☆☆☆
()
Ответ на: комментарий от arturpub

Я полностью понял то что ты сказал. Ибо очень поверхностные познания у меня в нем есть(давно писал недо-ОС хелловорлд).

Но на мой пример с картинкой мне никто не ответил.

data *ImgData;
// RGB формат, 24 бита на цвет.
// code
paint(*ImgData);

Как это будет передаваться в paint? Пусть ImgData занимает 3 мегабайта(столько будет занимать 1000*1000 картинка)

knotri
() автор топика
Ответ на: комментарий от arturpub

У меня асм был сразу после синклеровского бейсика, и вот я могу уверенно сказать, что никаких принципиальных отличий от сей в нем нет.

а в какой заднице ты был после синклера и MS-DOS4.2 ?

Скомпиль простенькую программу в 10 строк (нетривиальных), и удивись.

Что еще забыл?

забыл про U,V трубы, про i8087, про MMX/SSE, и ещё про Over9000 удивительных вещей, которых не было в Z80.

Зачем это все трогать руками — непонятно.

это-то мне понятно, что ты не в теме...

emulek
()
Ответ на: комментарий от emulek

Какой ты агрессивный сегодня, док. Знаю я про трубы и буферы и все такое — закончил отслеживать на п4. Чем отличается структура исполнения, никто так и не написал. Если тебе нужны ммыксы или ссе, используй билтины, а про трубы и пикеш не надо думать — там все сто раз подумано и генерится как надо.

arturpub ★★
()
Ответ на: комментарий от knotri

Если data это один пиксел, то в паинт передается первый пиксел картинки. По значению, что смысла не имеет. В паинт зашло 0xFF80C0, например.

arturpub ★★
()
Ответ на: комментарий от knotri

Как это будет передаваться в paint?

что «ЭТО»?

08048430 <main>:
 8048430:	55                   	push   ebp
 8048431:	89 e5                	mov    ebp,esp
 8048433:	83 e4 f0             	and    esp,0xfffffff0
 8048436:	83 ec 20             	sub    esp,0x20
 8048439:	c7 44 24 1c 30 85 04 	mov    DWORD PTR [esp+0x1c],0x8048530
 8048440:	08 
 8048441:	8b 44 24 1c          	mov    eax,DWORD PTR [esp+0x1c]
 8048445:	89 04 24             	mov    DWORD PTR [esp],eax
 8048448:	e8 73 fe ff ff       	call   80482c0 <printf@plt>
 804844d:	b8 00 00 00 00       	mov    eax,0x0
 8048452:	c9                   	leave  
 8048453:	c3                   	ret    

#include <stdio.h>
int main()
{
	char *s = "гы";
	printf(s);
	return 0;
}
emulek
()
Ответ на: комментарий от arturpub

а про трубы и пикеш не надо думать — там все сто раз подумано и генерится как надо.

про то, как «передаётся указатель на картинку» тоже думать не нужно. И как ТС доказал — даже вредно. Берёшь и смотришь. И понимаешь, что не хрен туда лезть.

emulek
()
Ответ на: комментарий от emulek

Да блин. Ну для примера

struct dataImg { int sizeX; int sizeY; char* data; };

dataImg myPic;

Дальше выделяем data какой то кусок памяти, например 30 байт. (10 пикселей).

И передаем функции myPic. myPic же имеет огромный размер(если картинка большая). И вот как это работает мне не понятно. Но я это для примера привел. Есть полно других вещей который я не понимаю.

knotri
() автор топика
Ответ на: комментарий от arturpub

Ты s передаешь, а он *s просил так-то ;)

откуда я знаю, что такое data? Вот оно и передастся. Это если operator*() не перезагрузил.

emulek
()
Ответ на: комментарий от knotri

У myPic размер всего-то 12 байт. И суя его как paint(myPic), ты копируешь 12 байт в стек как структурный аргумент для paint. А вот данные *по адресу*, который указан в 4-хбайтном myPic.data они большие. Но ты их не передавал через стек, ты указатель передал (в составе структуры).

arturpub ★★
()
Ответ на: комментарий от knotri

Видел тред на одной странице. Вообще по теме, может и немного попсово, для начала почитай книги К.Касперски (он же Н.Лихачев) уже не помню как называются, одна из них кажется «Искусство дизассемблирования», там дается машинное представление базовых структур данных...

Twissel ★★★★★
()
Ответ на: комментарий от i-rinat

Во. На этом-то все. Ip, sp, eflags, сегментные, которых теперь уже нет.

arturpub ★★
()
Ответ на: комментарий от emulek

Сам почитай выхлоп компилятора.

x>>1 быстрее x/2. Причина такому парадоксу много, оснавная причина в том, что gcc умеет переделывать x/2 в x>>1 (когда это надо), а вот наоборот — увы.

Это примерно как: «основная причина гравитации состоит в том, что вода падает с неба».

i-rinat ★★★★★
()
Ответ на: комментарий от knotri

И передаем функции myPic. myPic же имеет огромный размер(если картинка большая). И вот как это работает мне не понятно. Но я это для примера привел. Есть полно других вещей который я не понимаю.

дык скомпиль и посмотри. Что непонятно — спрашивай.

Дальше выделяем data какой то кусок памяти, например 30 байт. (10 пикселей).

упрлс? Что значит «выделяю объект»? Ты можешь только получить указатель на объект. Иначе сработает конструктор копирования. Который по умолчанию тупо memcpy(всё) делает. Вот у тебя и будет вычитание из esp, а потом memcpy туда.

emulek
()
Ответ на: комментарий от i-rinat

Это примерно как: «основная причина гравитации состоит в том, что вода падает с неба».

вода с неба — пример действия гравитации. Как и у меня пример работы оптимизатора.

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

emulek
()

Зависит от того, чем будешь заниматься. Если программированием - то наверное нет.

Профит есть при дебаге, креш анализе, реверсинге итд

vasily_pupkin ★★★★★
()

Присоединяюсь к вопросу в ракурсе: КАК его учить? В универе сумбурно излагают и пишем в Borland C++ 3.1. С офтопиком не хочу иметь дела. Какие ключевые слова на тему ассемблера в линукс?

Deleted
()
Ответ на: комментарий от Deleted

wasm.ru гляньте, fasm как среду, она в интел-нотации и с плюшками.

arturpub ★★
()

Я его тоже не знаю, и не знаю как подступиться. Подскажите, кто-нибудь, пожалуйста, что означает ссылка в контексте асма? Вот, к примеру, я записал в какой-то регистр единицу. Я должен сослаться как то на сам регистр? Или непосредственно на эту единицу? Как там это все происходит? В ЯП высокого уровня, фактически, присваивание и есть ссылка. Если я пишу, например, a=some_object, я могу достать some_object, обратившись к нему по его «адресу» - символу a. А как в асме?

anonymous
()
Ответ на: комментарий от arturpub

ты — нет. А вот ТС этого явно не понимает. И кстати асм тут не при чём.

emulek
()
Ответ на: комментарий от Deleted

Какие ключевые слова на тему ассемблера в линукс?

сначала изучи нормальные, человеческие ЯП(питон какой-нить). Потом — машинные.

emulek
()
Ответ на: комментарий от anonymous

что означает ссылка в контексте асма?

нет там ссылок.

Вот, к примеру, я записал в какой-то регистр единицу. Я должен сослаться как то на сам регистр? Или непосредственно на эту единицу? Как там это все происходит?

никак не происходит. Ссылка на регистр не имеет смысла. Ссылка в сишечке — синтаксический сахар. Это на самом деле передача в функцию указателя, а потом его разименование. Причём это специальный указатель, прибитый гвоздями к переменной. А указатель в сишечке, это в асме комбинация адреса и типа(если это не void*).

В ЯП высокого уровня, фактически, присваивание и есть ссылка.

это в пхп так. В C++ присваивание — специальный оператор. А в сишечке это побитное копирование.

А как в асме?

а в асме ты можешь скопировать в регистр кусок памяти шириной в этот регистр, и наоборот. ВСЁ.

emulek
()
Ответ на: комментарий от anonymous

Машинные - это что?

асм.

Которые еще ниже асма?

ниже асма тоже асм. Только другой.

emulek
()
Ответ на: комментарий от i-rinat

Какой скрытый смысл ты там углядел?

Я разглядел там бред.

ты просто ничего не понял. Это твоя проблема, какой смысл отрицать то, чего ты не понимаешь? Сначала попытайся понять, потом отрицай. Или не пытайся, но и не отрицай.

emulek
()
Ответ на: комментарий от emulek

это в асме комбинация адреса и типа

Адреса чего, регистра? Если да, то это условно можно считать ссылкой, наверное, нет? Остается только определить, как связать между собой два регистра и определить механизм доступа из одного в другой, и мы можем пейсать программы.=)

anonymous
()
Ответ на: комментарий от anonymous

Адреса чего, регистра?

нет, памяти.

Если да, то это условно можно считать ссылкой, наверное, нет?

ну если учесть, что в твоём CPU на самом деле Over9000 регистров, которые процессор сам подставляет вместо rax, то да — наверное можно. Но не нужно. Сначала изучи простой i8086, в котором только ax в 16 бит, и только один.

как связать между собой два регистра и определить механизм доступа из одного в другой, и мы можем пейсать программы.=)

считай регистры некоторым аналогом глобальных переменных, имя которых ты не можешь изменить. Ну типа errno. И ссылки на которые ты не можешь делать. По тем же причинам, почему не можешь делить на ноль.

emulek
()
Ответ на: комментарий от anonymous

Ты слишком разные уровеи взял, все объекты питонов и пхп имеют на низком уровне тип struct object *, фактически ты в словаре глобального неймспейса по ключу «а» установил значение, которое валялось там же по ключу «сомобикт». Причем эти обе строки тоже завернуты в struct object, у которого внутри что-то вроде int type и дальше полезная нагрузка. Понял насколько это далеко от железки?

В проце все просто: есть т.н. регистровый файл (аппаратное устройство на кристалле), в котором по разным смещениям лежат регистры. Какой регистр заюзает команда — зашито в ней самой. В ее битовом паттерне есть участок из 3-4 бит, который отвечает за смещение в этом файле. Регистров обычно немного, но бывают архитектуры с большим регистровым файлом. Копирование из одного в другой делает mov. Mov ax, dx — ax = dx. Некоторые регистры можно использовать не как пункт назначения копировпния, а как адрес такого пункта в памяти. Mov bx, 1000; mov byte ptr [bx], 1 — записать единичку в байт по адресу 1000.

arturpub ★★
()
Ответ на: комментарий от arturpub

Спасибо, многое прояснилось в голове. Завтра начну пробовать, давно собирался уже взяться.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.