Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Getopt - echocol.asm

echocol.asm

Caricato da: ZioCrocifisso
Scarica il programma completo

  1. global _start
  2. extern getopt
  3. extern optarg
  4. extern optind
  5. extern optopt
  6.  
  7. section .data
  8.         opts db 'f:b:sri', 0
  9.  
  10.         usage:
  11.                 db 'Usage: echocol [-f foreground color] [-b background color] [-s | -r] [-i] text', 10
  12.                 db '    -f <n>          Foreground color (0-7)', 10
  13.                 db '    -b <n>          Background color (0-7)', 10
  14.                 db '    -s              Blink (slow)', 10
  15.                 db '    -r              Blink (rapid)', 10
  16.                 db '    -i              Bold/Intensity', 10, 10
  17.                 db 'Example: echocol -f 4 -b 7 -i example text', 10
  18.         usage_len equ $ - usage
  19.  
  20.         unr db 'Unrecognized option.', 10, 10
  21.         unr_len equ $ - unr
  22.  
  23.         eow db ' '
  24.         eol db 10
  25.  
  26.         %macro escape 1
  27.                 %strlen len %1
  28.                 %%start:
  29.                 db 0x1B, '[', %1, 'm'
  30.                 times (8 - (3 + len)) db 0
  31.         %endmacro
  32.  
  33.         escape_fcolors:
  34.                 escape '30'
  35.                 escape '31'
  36.                 escape '32'
  37.                 escape '33'
  38.                 escape '34'
  39.                 escape '35'
  40.                 escape '36'
  41.                 escape '37'
  42.  
  43.         escape_bcolors:
  44.                 escape '40'
  45.                 escape '41'
  46.                 escape '42'
  47.                 escape '43'
  48.                 escape '44'
  49.                 escape '45'
  50.                 escape '46'
  51.                 escape '47'
  52.  
  53.         escape_slow:
  54.                 escape '5'
  55.        
  56.         escape_rapid:
  57.                 escape '6'
  58.  
  59.         escape_boldintensity:
  60.                 escape '1'
  61.  
  62.         escape_reset:
  63.                 escape '0'
  64.  
  65.         escape1_len: equ 4
  66.         escape2_len: equ 5
  67.  
  68. section .text
  69.         %macro print 2
  70.                 mov rax, 1
  71.                 mov rdi, 1
  72.                 mov rsi, %1
  73.                 mov rdx, %2
  74.                 syscall
  75.         %endmacro
  76.  
  77.         _start:
  78.                 mov rdi, [rsp]
  79.                 mov rsi, rsp
  80.                 add rsi, 8
  81.                 mov rdx, opts
  82.                 call getopt
  83.                 cmp rax, 'f'
  84.                 je .foreground
  85.                 cmp rax, 'b'
  86.                 je .background
  87.                 cmp rax, 's'
  88.                 je .slowblink
  89.                 cmp rax, 'r'
  90.                 je .rapidblink
  91.                 cmp rax, 'i'
  92.                 je .boldintensity
  93.                 cmp rax, '?'
  94.                 je .unrecognized
  95.                 jmp .printtext
  96.  
  97.                 .foreground:
  98.                         mov rbx, [optarg]
  99.                         mov rcx, 0
  100.                         mov cl, [rbx]
  101.                         sub cl, '0'
  102.                         lea rbx, [escape_fcolors + rcx * 8]
  103.                         print rbx, escape2_len
  104.                         jmp _start
  105.  
  106.                 .background:
  107.                         mov rbx, [optarg]
  108.                         mov rcx, 0
  109.                         mov cl, [rbx]
  110.                         sub cl, '0'
  111.                         lea rbx, [escape_bcolors + rcx * 8]
  112.                         print rbx, escape2_len
  113.                         jmp _start
  114.  
  115.                 .slowblink:
  116.                         print escape_slow, escape1_len
  117.                         jmp _start
  118.  
  119.                 .rapidblink:
  120.                         print escape_rapid, escape1_len
  121.                         jmp _start
  122.  
  123.                 .boldintensity:
  124.                         print escape_boldintensity, escape1_len
  125.                         jmp _start
  126.  
  127.                 .unrecognized:
  128.                         print unr, unr_len
  129.                         print usage, usage_len
  130.                         jmp _start
  131.  
  132.                 .printtext:
  133.                         mov ebx, [rsp]
  134.                         cmp dword [optind], ebx
  135.                         jge .end
  136.  
  137.                         mov rbx, rsp
  138.                         add rbx, 8
  139.                         mov rax, 0
  140.                         mov eax, [optind]
  141.                         shl eax, 3
  142.                         mov rbx, [rbx + rax]
  143.  
  144.                         mov rax, 0
  145.                         mov rdi, rbx
  146.  
  147.                         .searchend:
  148.                                 scasb
  149.                                 jnz .searchend
  150.  
  151.                         mov rcx, rdi
  152.                         sub rcx, rbx
  153.                         print rbx, rcx
  154.                         print eow, 1
  155.  
  156.                         inc dword [optind]
  157.                         jmp .printtext
  158.  
  159.                 .end:
  160.                         print escape_reset, escape1_len
  161.                         print eol, 1
  162.  
  163.                         mov rax, 60
  164.                         mov rdi, 0
  165.                         syscall
  166.  
  167.                         ret