File: fail-linux-amd64.asm
   1 ; The MIT License (MIT)
   2 ;
   3 ; Copyright (c) 2026 pacman64
   4 ;
   5 ; Permission is hereby granted, free of charge, to any person obtaining a copy
   6 ; of this software and associated documentation files (the "Software"), to deal
   7 ; in the Software without restriction, including without limitation the rights
   8 ; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   9 ; copies of the Software, and to permit persons to whom the Software is
  10 ; furnished to do so, subject to the following conditions:
  11 ;
  12 ; The above copyright notice and this permission notice shall be included in
  13 ; all copies or substantial portions of the Software.
  14 ;
  15 ; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 ; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 ; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18 ; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19 ; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20 ; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21 ; SOFTWARE.
  22 
  23 
  24 ; To compile this app for linux/amd64, use the commands
  25 ;
  26 ; nasm -f elf64 -o fail-linux-amd64.o fail-linux-amd64.asm
  27 ; ld -n -s fail-linux-amd64.o -o fail
  28 
  29 
  30 ; fail [code...]
  31 ;
  32 ; Do nothing but quit with the status code/number given as an argument; if no
  33 ; status code/number was given, quit using code 1 by default. If given 0 for
  34 ; the status code, it will paradoxically succeed, as 0 is the success code.
  35 
  36 
  37 sys_exit equ 60
  38 
  39 section .text
  40 
  41 global _start
  42 
  43 _start:
  44 
  45 ; rcx = argc
  46 pop rcx
  47 
  48 ; just quit with the default code, if no arguments were given
  49 cmp rcx, 1
  50 mov rdx, 1
  51 je quit
  52 
  53 ; skip argv[0]
  54 pop rbx
  55 ; get argv[1]
  56 pop rbx
  57 
  58 ; an empty string fails to parse: if so, quit with the default code
  59 mov al, [rbx]
  60 cmp al, 0
  61 je bad_code
  62 
  63 mov rdx, 0
  64 mov rax, 0
  65 parse_code:
  66     mov al, [rbx]
  67     cmp al, 0
  68     je quit
  69 
  70     cmp al, '0'
  71     jl bad_code
  72     cmp al, '9'
  73     jg bad_code
  74 
  75     imul rdx, 10
  76     sub al, '0'
  77     add rdx, rax
  78 
  79     inc rbx
  80     jmp parse_code
  81 
  82 bad_code:
  83     mov rdx, 1
  84 
  85 quit:
  86     ; exit(rdx)
  87         mov rax, sys_exit
  88         mov rdi, rdx
  89         syscall