Ошибка автора или так и должно быть?

Тема в разделе "WASM.UNIX", создана пользователем xlinuks, 3 сен 2007.

  1. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Нашел след код в стиле хелоу уорлд:
    Код (Text):
    1. .section .data
    2. hello: 
    3.     .ascii  "Hello, world!\n"
    4. hello_len:
    5.     .long   . - hello
    6. ########################################################################
    7.     .section .text
    8.     .globl _start
    9.    
    10. _start:
    11.     xorl %ebx, %ebx     # %ebx = 0
    12.     movl $4, %eax       # write () system call
    13.     xorl %ebx, %ebx     # %ebx = 0
    14.     incl %ebx       # %ebx = 1, fd = stdout
    15.     leal hello, %ecx    # %ecx ---> hello
    16.     movl hello_len, %edx    # %edx = count
    17.     int $0x80       # execute write () system call
    18.    
    19.     ## terminate program via _exit () system call
    20.     xorl %eax, %eax     # %eax = 0
    21.     incl %eax       # %eax = 1 system call _exit ()
    22.     xorl %ebx, %ebx     # %ebx = 0 normal program return code
    23.     int $0x80       # execute system call _exit ()
    Зачем автор повторяет (сразу после старт) "xorl %ebx, %ebx" и через ряд опять этоже?
    А дальше "incl %ebx", неужели сначала обнулить а потом добавить *один* быстрее работает чем просто "movl $1, %ebx"?
    Дальше он повторяет тоже самое с %eax.
    Нашел на http://database.sarang.net/study/linux/asm/linux-asm.txt
     
  2. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Мне кажется, что это просто ДИЗ_АСМ какого-то ЯВУ. Вот и всё.

    Вот еще вариант
    Код (Text):
    1. #;as x2.s -o x2.o
    2. #;gcc x2.o -lX11 -L/usr/X11R6/lib -o x2
    3.     .data
    4.    
    5. prDisplay:  .long   0   # указатель на структуру Display
    6. nScreenNum: .long   0   # номер экрана
    7. nWnd:       .long   0   # ID окна
    8.  
    9. rEvent:     .space  96,0    # буфер для получения события (сообщения)
    10.                 # вообщето все намного сложней
    11.                 # но длинное слово (32бит)со смещением 0
    12.                 # обычно содержит тип события
    13. prGC:       .long   0
    14.  
    15. msgHello:   .asciz "Privet !!!" # какое-то непереводимое ругательство
    16.         msgHelloLen=.-msgHello-1
    17.  
    18.     .text
    19.     .global main        # без libc мы обойтись не сможем!
    20.    
    21. main:
    22.     # устанавлиываем связь с сервером
    23.     pushl   $0
    24.     call    XOpenDisplay
    25.     addl    $4,%esp
    26.     movl    %eax,prDisplay  # теперь prDisplay содержит адресс структуры
    27.                 # или равен 0 в случае ошибки
    28.    
    29.     # получаем номер основного экрана
    30.     pushl   %eax
    31.     call    XDefaultScreen
    32.     addl    $4,%esp
    33.     movl    %eax,nScreenNum
    34.  
    35.     # создаем окно
    36.     pushl   nScreenNum
    37.     pushl   prDisplay
    38.     call    XWhitePixel
    39.     addl    $8,%esp
    40.     pushl   %eax        # белый пиксел )
    41.    
    42.     pushl   nScreenNum
    43.     pushl   prDisplay
    44.     call    XBlackPixel
    45.     addl    $8,%esp
    46.     pushl   %eax        # черный пиксел )
    47.  
    48.     pushl   $5      # толщина рамки
    49.     pushl   $100        # высота окна
    50.     pushl   $100        # ширина окна
    51.        
    52.     pushl   $0      # x
    53.     pushl   $0      # y
    54.    
    55.     pushl   nScreenNum 
    56.     pushl   prDisplay  
    57.     call    XRootWindow
    58.     addl    $8,%esp
    59.     pushl   %eax        # окно родитель
    60.    
    61.     pushl   prDisplay   # дисплей
    62.     call    XCreateSimpleWindow
    63.     addl    $36,%esp
    64.     movl    %eax,nWnd   # номер окна
    65.  
    66.     # устанавливаем события обрабатываемые прграммой
    67.     pushl   $(1 | (1 << 15)) # это у нас ExposureMask OR KeyPressMask
    68.     pushl   nWnd         
    69.     pushl   prDisplay  
    70.     call    XSelectInput
    71.     addl    $12,%esp
    72.    
    73.     # показываем окно (проще некуда ;-) )
    74.     pushl   nWnd
    75.     pushl   prDisplay
    76.     call    XMapWindow
    77.     addl    $8,%esp
    78.    
    79.     # самое главное
    80.     # цикл получения и обработки сообщений
    81.    
    82. wloop:
    83.     pushl   $rEvent     # адрес буфера
    84.     pushl   prDisplay   # дисплей
    85.     call    XNextEvent 
    86.     addl    $8,%esp
    87.    
    88.     movl    rEvent,%eax # !!! так делать не стоит
    89.                 # но здесь сойдет
    90.     cmpl    $12,%eax
    91.     je  _Expose
    92.     cmpl    $2,%eax
    93.     je  _KeyPress
    94.     jmp wloop
    95.  
    96. _Expose:
    97.     # запрос на перерисовку
    98.  
    99.     # получаем графический контекст
    100.     pushl   $0
    101.     pushl   $0
    102.     pushl   nWnd
    103.     pushl   prDisplay
    104.     call    XCreateGC
    105.     addl    $16,%esp
    106.     movl    %eax,prGC
    107.    
    108.     # а кто у на сегодня "черный"?
    109.     pushl   $0
    110.     pushl   prDisplay
    111.     call    XBlackPixel
    112.     addl    $8,%esp
    113.    
    114.     # устанвливаем цвет которым рисуем
    115.     pushl   %eax
    116.     pushl   prGC
    117.     pushl   prDisplay
    118.     call    XSetForeground
    119.     addl    $12,%esp
    120.    
    121.     # рисуем текст
    122.     pushl   $msgHelloLen
    123.     pushl   $msgHello
    124.     pushl   $50
    125.     pushl   $10
    126.     pushl   prGC
    127.     pushl   nWnd
    128.     pushl   prDisplay
    129.     call    XDrawString
    130.     addl    $28,%esp
    131.    
    132.     # освобождаем графический контекст
    133.     pushl   prGC
    134.     pushl   prDisplay
    135.     call    XFreeGC
    136.     addl    $8,%esp
    137.    
    138.     jmp wloop
    139.    
    140. _KeyPress:
    141.     # кто-то нажал на кнопку
    142.    
    143.     pushl   prDisplay
    144.     call    XCloseDisplay
    145.    
    146.     call    exit
     
  3. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    xor reg,reg
    inc reg
    работает быстрее mov
     
  4. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    А можно об этом гдето прочитать в он-лайне? именно об "xor & inc" и mov.
    (Мне интересно что такого делает "mov" что он проигрывает двум другим вместе взятым, и вообще меня интересуют на данный момент именно такие мелкие *трюки*, например какую технику нужно использовать чтобы получался самый быстрый loop, чтобы создавать мелкие утилиты так чтобы они были the fastest and the lightest ever, хотелось бы под AT&T).
     
  5. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    А у Фога нет этого? На сайте цикл его статей по оптимизации есть.
     
  6. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Есть еще классная книжка, там можно подсмотреть очень много полезного.
    Генри Уоррен мл. "Алгоритмические трюки для програраммистов"
     
  7. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    S_Alex у тебя нет случайно этой книжки или где ее можно за бесплатно *купить*?
    twgt где можно найти "Фога"? прогуглил без успеха.
     
  8. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    http://www.agner.org/optimize/
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    xor reg, reg
    add reg, 1
    еще круче =)
    угу, только он код зачастую не для x86 машин приводит ;)
     
  10. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    далеко ходить ненадо :) http://www.wasm.ru/publist.php?list=10
    или http://www.wasm.ru/doclist.php?list=1
     
  11. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Спасибо всем
     
  12. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    n0name
    Главное не код, а хороший алгоритм.
    Код - это уже второй план работы.
     
  13. Bob

    Bob New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2004
    Сообщения:
    112
    Адрес:
    Ukraine
    S_Alex

    И то и другое важно. Потому как любую хорошую идею может загубить кривая реализация.
     
  14. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    главное не начинать оптимизировать код, пока всё не написал