Страницы

Поиск по вопросам

воскресенье, 16 февраля 2020 г.

Зачем нужен ebp, если можно без него [закрыт]

#ассемблер


        
             
                
                    
                        
                            Закрыт. Этот вопрос необходимо уточнить или дополнить
подробностями. Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Добавьте больше подробностей
и уточните проблему, отредактировав это сообщение.
                        
                        Закрыт 3 года назад.
                                                                                
           
                
        
Зачем нужно использовать регистр ebp при организации стека программы, если можно
обойтись и без него(если нет хитрых асм вставок)? Почему нельзя по умолчанию использовать
такую оптимизацию? С чем это связанно?
    


Ответы

Ответ 1



Связано это в первую очередь с удобством. Никто не мешает вам адресоваться через регистр esp. Но при этом нужно постоянно держать в голове что сам стековый указатель в процессе выполнения кода может прыгать как угодно. И постоянно менять смещение для одних и тех же сущностей (а вам было бы удобно, если сейчас переменная называется foo, а через пару строк к ней нужно обращаться как к bar?). В совсем простеньких случаях это может иметь смысл, сам так делаю :) Например: print_uint: pushad push dword [esp+36] push format_u ; "%u", 0 call printf pop eax pop eax popad ret 4 Да и компиляторы могут генерировать код без enter/leave при оптимизации. Но в общем случае это "микрооптимизация" (и то под вопросом), и не стоит она того геморроя, который за собой тащит.

Ответ 2



Можно и без него (а очень жаль иногда). Например, gcc для тестовой программки #include int f() { return puts("xaxa"); } int main(void) { long a = 10; long long b = 11; int l = 100; float e = 8.8; f(a, b, l, e); return 0; } с флагами оптимизации avp@avp-ubu1:hashcode$ gcc -O -S t.c avp@avp-ubu1:hashcode$ gcc --vers gcc.real (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. avp@avp-ubu1:hashcode$ делает код без использования ebp(rbp) для организации фреймов стека .file "t.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "xaxa" .text .globl f .type f, @function f: .LFB23: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 movl $.LC0, %edi call puts addq $8, %rsp .cfi_def_cfa_offset 8 ret .cfi_endproc .LFE23: .size f, .-f .globl main .type main, @function main: .LFB24: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 movsd .LC1(%rip), %xmm0 movl $100, %edx movl $11, %esi movl $10, %edi movl $1, %eax call f movl $0, %eax addq $8, %rsp .cfi_def_cfa_offset 8 ret .cfi_endproc .LFE24: .size main, .-main .section .rodata.cst8,"aM",@progbits,8 .align 8 .LC1: .long 2684354560 .long 1075943833 .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609" .section .note.GNU-stack,"",@progbits

Комментариев нет:

Отправить комментарий