Advertisement
Guest User

Untitled

a guest
Oct 13th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .section .data
  2.  
  3. #ifndef TEST
  4. #define TEST 9
  5. #endif
  6.     .macro linea                # Resultado - Comentario
  7.   #if TEST==1                   // 16 – Todos los elementos a 1
  8.         .int 1,1,1,1
  9.         .int 1,1,1,1
  10.         .int 1,1,1,1
  11.         .int 1,1,1,1
  12. #elif TEST==2                   // 0x0 ffff fff0 - Máximo elem e para que 16e no produzca acarreos
  13.         .int 0x0fffffff, 0x0fffffff, 0x0fffffff, 0x0fffffff
  14.         .int 0x0fffffff, 0x0fffffff, 0x0fffffff, 0x0fffffff
  15.         .int 0x0fffffff, 0x0fffffff, 0x0fffffff, 0x0fffffff
  16.         .int 0x0fffffff, 0x0fffffff, 0x0fffffff, 0x0fffffff
  17. #elif TEST==3                   // 0x1 0000 0000 - Mínimo elem e para que 16e sí produzca 1 acarreo
  18.         .int 0x10000000, 0x10000000, 0x10000000, 0x10000000
  19.         .int 0x10000000, 0x10000000, 0x10000000, 0x10000000
  20.         .int 0x10000000, 0x10000000, 0x10000000, 0x10000000
  21.         .int 0x10000000, 0x10000000, 0x10000000, 0x10000000
  22. #elif TEST==4                   // 0xf ffff fff0 - Notar agrupación de 4 en 4 dígitos hexadec,
  23.         .int 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
  24.         .int 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
  25.         .int 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
  26.         .int 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
  27. #elif TEST==5                   // ?? ??? ??? ??? - Nora
  28.         .int -1,-1,-1,-1
  29.         .int -1,-1,-1,-1
  30.         .int -1,-1,-1,-1
  31.         .int -1,-1,-1,-1
  32. #elif TEST==6                   // 3 200 000 000 - Máx e A*10B^3 p/suma representable uns32b <=4Gi-1
  33.         .int 200000000, 200000000, 200000000, 200000000
  34.         .int 200000000, 200000000, 200000000, 200000000
  35.         .int 200000000, 200000000, 200000000, 200000000
  36.         .int 200000000, 200000000, 200000000, 200000000
  37. #elif TEST==7                   // 4 800 000 000 - Mín el A·10B^3 p/suma produzca 1CF uns32b (>=4Gi)
  38.         .int 300000000, 300000000, 300000000, 300000000
  39.         .int 300000000, 300000000, 300000000, 300000000
  40.         .int 300000000, 300000000, 300000000, 300000000
  41.         .int 300000000, 300000000, 300000000, 300000000
  42. #elif TEST==8                   // 80 000 000 000 - Mín elm tipo A·10B no representable uns32b>=4Gi
  43.         .int 5000000000, 5000000000, 5000000000, 5000000000
  44.         .int 5000000000, 5000000000, 5000000000, 5000000000
  45.         .int 5000000000, 5000000000, 5000000000, 5000000000
  46.         .int 5000000000, 5000000000, 5000000000, 5000000000
  47. #else
  48.         .error "Definir TEST entre 1..8"
  49. #endif
  50.         .endm
  51.  
  52. lista:      linea
  53. longlista:  .int    (.-lista)/4
  54. resultado:  .quad       0
  55. formato:    .ascii "resultado \t =   %18lu (uns)\n"
  56.             .ascii         "\t\t = 0x%18lx (hex)\n"
  57.             .asciz         "\t\t = 0x %08x %08x \n"
  58.  
  59. # opción: 1) no usar printf, 2)3) usar printf/fmt/exit, 4) usar tb main
  60. # 1) as  suma.s -o suma.o
  61. #    ld  suma.o -o suma                 1232 B
  62. # 2) as  suma.s -o suma.o               6520 B
  63. #    ld  suma.o -o suma -lc -dynamic-linker /lib64/ld-linux-x86-64.so.2
  64. # 3) gcc suma.s -o suma -no-pie –nostartfiles     6544 B
  65. # 4) gcc suma.s -o suma -no-pie             8664 B
  66.  
  67. .section .text
  68. main: .global  main
  69.  
  70.     call trabajar   # subrutina de usuario
  71.     call imprim_C   # printf()  de libC
  72.     call acabar_C   # exit()    de libC
  73.     ret
  74.  
  75. trabajar:
  76.     mov     $lista, %rbx
  77.     mov  longlista, %ecx
  78.     call suma       # == suma(&lista, longlista);
  79.     mov  %eax, resultado
  80.     mov  %edx, resultado+4
  81.     ret
  82.  
  83. suma:
  84.     mov  $0, %eax
  85.     mov  $0, %edx
  86.     mov  $0, %rsi
  87. bucle:
  88.     add  (%rbx,%rsi,4), %eax
  89. #   jnc  salto
  90. #   inc  %edx
  91. # salto:
  92.     adc  $0, %edx
  93.     inc  %rsi
  94.     cmp  %rsi,%rcx
  95.     jne  bucle
  96.  
  97.     ret
  98.  
  99. imprim_C:           # requiere libC
  100.     mov   $formato, %rdi
  101.     mov   resultado, %rsi
  102.     mov   resultado, %rdx
  103.     mov   resultado+4, %ecx
  104.     mov   resultado, %r8d
  105.     mov          $0,%eax
  106.     call  printf       
  107.     ret
  108.  
  109. acabar_C:           # requiere libC
  110.     mov  $0, %edi
  111.     call _exit      # ==  exit(resultado)
  112.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement