Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2015, 02:48   #1
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Только начинаю изучение Assembler и сногое пока что н понятно.

Есть вот такая программа на "С"

Код:
int main(){

    int a = 5;
    int b = 5;
    int c = 5;
    int d = 5;

    if (a > b && c < d ){
        // this code
    }else{
        // other code
    }

}
Я перевожу этот код в Assembler при помощи GCC

Код:
gcc -S not-nested-compound.c
И на выходе получаю "not-nested-compound.s"

Код:
    .file   "not-nested-compound.c"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $16, %esp
    movl    $5, -4(%ebp)
    movl    $5, -8(%ebp)
    movl    $5, -12(%ebp)
    movl    $5, -16(%ebp)
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Debian 4.7.2-5) 4.7.2"
    .section    .note.GNU-stack,"",@progbits
Не могу понять что делает вот эта инструкция что именно находится в %ebp (stack-data-pointer) на этот момент.

Код:
    pushl   %ebp
И что означают минусовые отступы перед регистрами ?

Это похоже на сдвиг в памяти ? так как по 4 байта

Код:
    movl    $5, -4(%ebp)
    movl    $5, -8(%ebp)
    movl    $5, -12(%ebp)
    movl    $5, -16(%ebp)

И последний вопрос,

Зачем делать вот это перемещение ?

movl %esp, %ebp

Из того что написано выходит

переместить stack-pointer в stack-data-pointer ?

Это какой то обмен адресами ?

Спасибо.

И еще, если кому не в падлу, могли бы каждую строку закоментить что конкртно происходит. :D
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось Stilet; 03.09.2015 в 08:18.
pompiduskus вне форума Ответить с цитированием
Старый 03.09.2015, 03:35   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Может сначала изучите синтаксис gnu as и куча вопросов само отпадет?

Цитата:
Не могу понять что делает вот эта инструкция что именно находится в %ebp (stack-data-pointer) на этот момент.
Познакомьтесь с понятием пролог функции. Узнаете зачем сохраняется указатель стека и резервируется новый...

Цитата:
И что означают минусовые отступы перед регистрами ?
А что означает mov [ebp-4], 5 в интеловской записи? А что такое локальные переменные? А где они сохраняются?

Цитата:
Это похоже на сдвиг в памяти ? так как по 4 байта
Открою секрет - там может не быть именно 4 байт... Почему эта цифра для вас стала магической?

Зачем делать вот это перемещение ?

movl %esp, %ebp

Цитата:
Из того что написано выходит

переместить stack-pointer в stack-data-pointer ?

Это какой то обмен адресами ?
Пролог функции. Локальный стек и переменные...

П.С. Вы уверены, что вам пора браться за асм, если вы не знаете базовых вещей?

Цитата:
И еще, если кому не в падлу, могли бы каждую строку закоментить что конкртно происходит. :D
Вы шутите, да? Не говоря уже о том, что все команды легко гуглятся, но тут достаточно простого перевода...
p51x вне форума Ответить с цитированием
Старый 03.09.2015, 07:40   #3
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Уверен,уверен.

Если я сам пишу то код выглядит не так. А если его прогонять через "GCC -S" то он по другому выводит.

Ветка форума для вопросо ? или я что то пропустил ?
И я же сказал что только учусь.

Век живи век учись, а дураком помрешь

PS: Вы написли столько букв, что можно было роман написать, а полезной инфы из этого всего 4 бита. Не лень же ?

Это я так ....
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось pompiduskus; 03.09.2015 в 07:46.
pompiduskus вне форума Ответить с цитированием
Старый 03.09.2015, 08:35   #4
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Почти со всем разобрался, спасибо!
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось pompiduskus; 03.09.2015 в 08:37.
pompiduskus вне форума Ответить с цитированием
Старый 03.09.2015, 10:21   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а вы пишете под GNU ASM когда пишете?

да и gcc явно генерит код для себя, а не для вас
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.09.2015, 13:56   #6
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Да под него.

Получается что так, на сколько я понял

может будет кому интересно/полезно.

все что начитается с .LFB0:

Это ".(L)(F)unction(B)egin:" лэйбл
Это .(L)(F)unction(E)end0:" лэйбл

А все что начинается с ".cfi_xxxxxxx" Это

Цитата:
.cfi_startproc

"Those .cfisomething directives result in generation of additional data by the compiler.
This data helps traverse the call stack when an instruction causes an exception,
so the exception handler (if any) can be found and correctly executed.
The call stack information is useful for debugging.
This data most probably goes into a separate section of the executable.
It's not inserted between the instructions of your code."

А "leave" это тоже самое что и

Код:
    movl    %ebp, %esp
    popl    %ebp
противоположное

Цитата:

pushl %ebp
movl %esp, %ebp
=================================== =================

Получается что если убрать все это "не нужное"

Код:
	.globl	main
main:

	pushl	%ebp
	movl	%esp, %ebp

	subl	$48, %esp
	movl	$10, -40(%ebp)
	movl	$10, -36(%ebp)
	movl	$10, -32(%ebp)
	movl	$10, -28(%ebp)
	movl	$10, -24(%ebp)
	movl	$10, -20(%ebp)
	movl	$10, -16(%ebp)
	movl	$10, -12(%ebp)
	movl	$10, -8(%ebp)
	movl	$10, -4(%ebp)
	movl	$0, %eax			# %eax это просто return 0;

	leave

	ret
я прогнал через GDB - debuger и если убрать "movl $0, %eax " то программа выполняется но код выдает 0X200

а с "movl $0, %eax " завершается нормально


=> 2 поста и нет даже 4 битов
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось pompiduskus; 03.09.2015 в 14:01.
pompiduskus вне форума Ответить с цитированием
Старый 03.09.2015, 14:02   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Получается что если убрать все это "не нужное"
А еще надо не забыть про выкинутый оптимизатором "пустой" иф...
p51x вне форума Ответить с цитированием
Старый 03.09.2015, 14:26   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это все "не нужное" компилятор генерирует для себя, а не для вас.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.09.2015, 15:33   #9
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Теперь уже понятно стало что к чему Спасибо еще раз.
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что значит "прямое чтение файла"? WildWhiteRabbit Безопасность, Шифрование 9 27.06.2015 19:38
"Connection Closed Gracefully." Что это значит? dimon000 Работа с сетью в Delphi 15 06.05.2014 14:31
Что значит "Определить удельный вес продаж каждого месяца" IPI Паскаль, Turbo Pascal, PascalABC.NET 1 23.01.2011 14:46
"Mail.Ru Агент" что это? и как это? Nick007 Софт 9 21.11.2009 10:13
Что значит оператор "^" ? JamS007 Общие вопросы .NET 5 12.01.2009 20:17