Помогите понять что тут написано

Тема в разделе "WASM.HEAP", создана пользователем click_and_die, 20 апр 2007.

  1. click_and_die

    click_and_die New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    192
    Код (Text):
    1.     .file   "dizasm"
    2.     .text
    3. .globl _start
    4.     .type   _start, @function
    5. _start:
    6. .LFB3:
    7.     pushl   %ebp
    8. .LCFI0:
    9.     movl    %esp, %ebp
    10. .LCFI1:
    11.     subl    $16, %esp
    12. .LCFI2:
    13.     movl    $786432, -4(%ebp)
    14.     leave
    15.     ret
    16. .LFE3:
    17.     .size   _start, .-_start
    18.     .section    .eh_frame,"a",@progbits
    19. .Lframe1:
    20.     .long   .LECIE1-.LSCIE1
    21. .LSCIE1:
    22.     .long   0x0
    23.     .byte   0x1
    24.     .string "zP"
    25.     .uleb128 0x1
    26.     .sleb128 -4
    27.     .byte   0x8
    28.     .uleb128 0x5
    29.     .byte   0x0
    30.     .long   __start
    31.     .byte   0xc
    32.     .uleb128 0x4
    33.     .uleb128 0x4
    34.     .byte   0x88
    35.     .uleb128 0x1
    36.     .align 4
    37. .LECIE1:
    38. .LSFDE1:
    39.     .long   .LEFDE1-.LASFDE1
    40. .LASFDE1:
    41.     .long   .LASFDE1-.Lframe1
    42.     .long   .LFB3
    43.     .long   .LFE3-.LFB3
    44.     .uleb128 0x0
    45.     .byte   0x4
    46.     .long   .LCFI0-.LFB3
    47.     .byte   0xe
    48.     .uleb128 0x8
    49.     .byte   0x85
    50.     .uleb128 0x2
    51.     .byte   0x4
    52.     .long   .LCFI1-.LCFI0
    53.     .byte   0xd
    54.     .uleb128 0x5
    55.     .align 4
    56. .LEFDE1:
    57.     .ident  "GCC: (GNU) 4.0.2 20051125 (Red Hat 4.0.2-8)"
    58.     .section    .note.GNU-stack,"",@progbits
    Мне просто интересно, можно ли это как-то использовать при отладке или оптимизации проги (я только начал изучать системное прг. Я прикладной программист (Java))
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    небольшой код на AT&T асме, асмовских команд всего 6 штук, остальное какая-то чухня из данных..
     
  3. click_and_die

    click_and_die New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    192
    Great
    Когда-то это было программой, которая умножает два числа:)

    Как я понимаю, основные операции в этом блоке:

    Код (Text):
    1.      
    2.   pushl   %ebp
    3. .LCFI0:
    4.         movl    %esp, %ebp
    5. .LCFI1:
    6.         subl    $16, %esp
    7. .LCFI2:
    8.         movl    $786432, -4(%ebp)
    9.         leave
    10.         ret
    или я не прав?

    Но тогда я не вижу в чем их смысл.

    push ebp -- сохраняем ebp;
    mov esp, ebp -- извлекаем из ebp и помещаем в esp
    sub $16, esp -- вычитаем...
    Где тут умножение?
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    судя по всему:
    Код (Text):
    1. main() {
    2.   int t = 786432;
    3. }
    может не будем гадать и посмотрим на оригинал?
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Наоборот :) А АТ&Т операнды в другом порядке (op src,dest).
     
  6. click_and_die

    click_and_die New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    192
    censored
    t=1024*768;
    :)
    Что одно и то же
     
  7. click_and_die

    click_and_die New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    192
    IceStudent
    Спасибо, буду знать
     
  8. click_and_die

    click_and_die New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    192
    Что же получается - значение выражения вычислил компилятор а не прграмма?
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    получается что да )
     
  10. click_and_die

    click_and_die New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    192
    Great
    Хороший компилятор:)
    А зачем тогда программа?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    практически любой компилятор
    Код (Text):
    1. int func( )
    2. {
    3. return 2*3;
    4. }
    скомилирует примерно в
    Код (Text):
    1. push ebp
    2. mov ebp, esp
    3. mov eax, 6
    4. leave
    5. retn
    ну может разве что без пролога и эпилога, но всегда константные выражения вычисляются на этапе компиляции
    они просто максимально упрощаются. например 2*3+a будет упрощено до 6+a
    А 4+5+b, где const int b = 6, будет упрощено до 15 сразу при компиляции.
     
  12. click_and_die

    click_and_die New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    192
    Теперь все понятно, так как программа, которая читает значение с консоли и выводит его на экран с увеличением на 1 выглядит так:
    Код (Text):
    1.     .file   "mytest_prg1"
    2.     .text
    3. .globl BIOS_STARTER_POINT
    4.     .type   BIOS_STARTER_POINT, @function
    5. BIOS_STARTER_POINT:
    6. .LFB3:
    7.     pushl   %ebp
    8. .LCFI0:
    9.     movl    %esp, %ebp
    10. .LCFI1:
    11.     subl    $24, %esp
    12. .LCFI2:
    13.     andl    $-16, %esp
    14.     movl    $0, %eax
    15.     addl    $15, %eax
    16.     addl    $15, %eax
    17.     shrl    $4, %eax
    18.     sall    $4, %eax
    19.     subl    %eax, %esp
    20.     subl    $12, %esp
    21.     pushl   $0
    22. .LCFI3:
    23.     call    default_BIOS_INPUT
    24.     addl    $16, %esp
    25.     movl    %eax, -8(%ebp)
    26.     movl    default_BIOS, %eax
    27.     movl    default_BIOS_LENGTH, %edx
    28.     movl    -8(%ebp), %ecx
    29.     incl    %ecx
    30.     subl    $4, %esp
    31.     pushl   %eax
    32.     pushl   %edx
    33.     pushl   %ecx
    34.     call    default_BIOS_OUTPUT
    35.     addl    $16, %esp
    36.     leave
    37.     ret
    38. .LFE3:
    39.     .size   BIOS_STARTER_POINT, .-BIOS_STARTER_POINT
     
  13. click_and_die

    click_and_die New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    192
    Тут даже видно какие функции вызываются - просто класс!
    Интересно, а можно ли вот так разобрать программу, изменить в этом тексте что-нить (например, константу или функцию) - и собрать обратно? Это было бы отлично!
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    можно. только геморно немного пересобирать будет. не с каждой программой выйдет.
    лучше править прямо бинарник
     
  15. click_and_die

    click_and_die New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    192
    Еще один вопрос: (может после более детального прочтения документации я не буду таких задавать...)

    Я вскрывал разные исполняемые файлы. Если основная часть программы выполняется в блоках типа
    Код (Text):
    1. push ebp
    2. mov ebp, esp
    3. mov eax, 6
    4. leave
    5. retn
    то зачем тогда нужны остальные инструкции?
    Неужели нет в мире компилера, способного писать программы без
    ?
    Ну то есть по минимуму: заголовок, сигнатура, исполняемая часть. Прога которая считает произведение двух чисел весит 15 килобайт!
    Зачем нужны инструкции типа:
    Код (Text):
    1. call    default_BIOS_INPUT
    2.         addl    $16, %esp
    3.         movl    %eax, -8(%ebp)
    4.         movl    default_BIOS, %eax
    5.         movl    default_BIOS_LENGTH, %edx
    ?
    Или это просто особенности формата исполняемого файла (то есть меньше сделать нельзя?)
     
  16. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    click_and_die
    В первом фрагменте кода компилятор (или программист, если этот код был написан изначально на ассемблере) создал стековый фрейм (push ebp / mov ebp, esp) и уничтожил (leave). Стековый фрейм обычно используется для хранения локальных переменных и ещё для адресации аргументов функции через ebp, что даёт небольшой выйгрыш в размере, по сравнению с прямой адресацией через esp, и гораздо удобнее. В данном примере никаких локальных переменных нет. Аргументов тоже нет. Оптимизирующий компилятор не только не задействовал бы стековый фрейм, но и заинлайнил бы автоматически данную функцию. Если речь о GCC, то нужно включить соответствующие ключи оптимизации (-O1, -O2 или -fomit-frame-pointer). Если же речь идёт о freepascal или другом подобном чуде, то... в общем, не судьба.

    Можно, конечно, издеваться над форматом экзешника, но в Линуксе это не очень актуально. Минимальный рабочий эльф занимает около 40-50 байт. Вот статья (есть ошибки): http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
     
  17. click_and_die

    click_and_die New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    192
    Да, именно о нем.

    Буду штудировать документацию