i386inc.asm
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:5k
源码类别:

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* i386inc.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2006 x264 project
  5. ;*
  6. ;* Author: Sam Hocevar <sam@zoy.org>
  7. ;*
  8. ;* This program is free software; you can redistribute it and/or modify
  9. ;* it under the terms of the GNU General Public License as published by
  10. ;* the Free Software Foundation; either version 2 of the License, or
  11. ;* (at your option) any later version.
  12. ;*
  13. ;* This program is distributed in the hope that it will be useful,
  14. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. ;* GNU General Public License for more details.
  17. ;*
  18. ;* You should have received a copy of the GNU General Public License
  19. ;* along with this program; if not, write to the Free Software
  20. ;* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  21. ;*****************************************************************************
  22. BITS 32
  23. ;=============================================================================
  24. ; Macros and other preprocessor constants
  25. ;=============================================================================
  26. ; Symbol prefix for C linkage
  27. %macro cglobal 1
  28.     %ifdef PREFIX
  29.         global _%1
  30.         %define %1 _%1
  31.     %else
  32.         global %1
  33.     %endif
  34. %endmacro
  35. ; Name of the .rodata section. On OS X we cannot use .rodata because NASM
  36. ; is unable to compute address offsets outside of .text so we use the .text
  37. ; section instead until NASM is fixed.
  38. %macro SECTION_RODATA 0
  39.     %ifidn __OUTPUT_FORMAT__,macho
  40.         SECTION .text
  41.         fakegot:
  42.     %else
  43.         SECTION .rodata data align=16
  44.     %endif
  45. %endmacro
  46. ; PIC support macros. All these macros are totally harmless when __PIC__ is
  47. ; not defined but can ruin everything if misused in PIC mode. On x86, shared
  48. ; objects cannot directly access global variables by address, they need to
  49. ; go through the GOT (global offset table). Most OSes do not care about it
  50. ; and let you load non-shared .so objects (Linux, Win32...). However, OS X
  51. ; requires PIC code in its .dylib objects.
  52. ;
  53. ; - GOT_* should be used as a suffix for global addressing, eg.
  54. ;     picgetgot ebx
  55. ;     mov eax, [foo GOT_ebx]
  56. ;   instead of
  57. ;     mov eax, [foo]
  58. ;
  59. ; - picgetgot computes the GOT address into the given register in PIC
  60. ;   mode, otherwise does nothing. You need to do this before using GOT_*.
  61. ;
  62. ; - picpush and picpop respectively push and pop the given register
  63. ;   in PIC mode, otherwise do nothing. You should always use them around
  64. ;   picgetgot except when sure that the register is no longer used and is
  65. ;   being restored later by other means.
  66. ;
  67. ; - picesp is defined to compensate the changing of esp when pushing
  68. ;   a register into the stack, eg.
  69. ;     mov eax, [esp + 8]
  70. ;     pushpic  ebx
  71. ;     mov eax, [picesp + 12]
  72. ;   instead of
  73. ;     mov eax, [esp + 8]
  74. ;     pushpic  ebx
  75. ;     mov eax, [esp + 12]
  76. ;
  77. %ifdef __PIC__
  78.     %ifidn __OUTPUT_FORMAT__,macho
  79.         ; There is no real global offset table on OS X, but we still
  80.         ; need to reference our variables by offset.
  81.         %define GOT_eax - fakegot + eax
  82.         %define GOT_ebx - fakegot + ebx
  83.         %define GOT_ecx - fakegot + ecx
  84.         %define GOT_edx - fakegot + edx
  85.         %macro picgetgot 1
  86.             call %%getgot 
  87.           %%getgot: 
  88.             pop %1 
  89.             add %1, $$ - %%getgot
  90.         %endmacro
  91.     %else
  92.         %ifidn __OUTPUT_FORMAT__,elf
  93.             %define GOT _GLOBAL_OFFSET_TABLE_
  94.         %else ; for a.out
  95.             %define GOT __GLOBAL_OFFSET_TABLE_
  96.         %endif
  97.         extern GOT
  98.         %define GOT_eax + eax wrt ..gotoff
  99.         %define GOT_ebx + ebx wrt ..gotoff
  100.         %define GOT_ecx + ecx wrt ..gotoff
  101.         %define GOT_edx + edx wrt ..gotoff
  102.         %macro picgetgot 1
  103.             call %%getgot 
  104.           %%getgot: 
  105.             pop %1 
  106.             add %1, GOT + $$ - %%getgot wrt ..gotpc 
  107.         %endmacro
  108.     %endif
  109.     %macro picpush 1
  110.         push %1
  111.     %endmacro
  112.     %macro picpop 1
  113.         pop %1
  114.     %endmacro
  115.     %define picesp esp+4
  116. %else
  117.     %define GOT_eax
  118.     %define GOT_ebx
  119.     %define GOT_ecx
  120.     %define GOT_edx
  121.     %macro picgetgot 1
  122.     %endmacro
  123.     %macro picpush 1
  124.     %endmacro
  125.     %macro picpop 1
  126.     %endmacro
  127.     %define picesp esp
  128. %endif
  129. %assign FDEC_STRIDE 32
  130. ; This is needed for ELF, otherwise the GNU linker assumes the stack is
  131. ; executable by default.
  132. %ifidn __OUTPUT_FORMAT__,elf
  133. SECTION .note.GNU-stack noalloc noexec nowrite progbits
  134. %endif