Advertisement
Guest User

Untitled

a guest
Oct 13th, 2018
99
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.     adc  $0, %edx
  90.     inc  %rsi
  91.     cmp  %rsi,%rcx
  92.     jne  bucle
  93.  
  94.     ret
  95.  
  96. imprim_C:           # requiere libC
  97.     mov   $formato, %rdi
  98.     mov   resultado, %rsi
  99.     mov   resultado, %rdx
  100.     mov   resultado+4, %ecx
  101.     mov   resultado, %r8d
  102.     mov          $0,%eax
  103.     call  printf       
  104.     ret
  105.  
  106. acabar_C:           # requiere libC
  107.     mov  $0, %edi
  108.     call _exit      # ==  exit(resultado)
  109.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement