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 ; rm fail-linux-amd64.o
  29 
  30 
  31 ; fail [code...]
  32 ;
  33 ; Do nothing but quit with the status code/number given as an argument; if no
  34 ; status code/number was given, quit using code 1 by default. If given 0 for
  35 ; the status code, it will paradoxically succeed, as 0 is the success code.
  36 
  37 
  38 sys_exit equ 60
  39 
  40 section .text
  41 
  42 global _start
  43 
  44 _start:
  45 
  46 ; rcx = argc
  47 pop rcx
  48 
  49 ; just quit with the default code, if no arguments were given
  50 cmp rcx, 1
  51 mov rdx, 1
  52 je quit
  53 
  54 ; skip argv[0]
  55 pop rbx
  56 ; get argv[1]
  57 pop rbx
  58 
  59 ; an empty string fails to parse: if so, quit with the default code
  60 mov al, [rbx]
  61 cmp al, 0
  62 je bad_code
  63 
  64 mov rdx, 0
  65 mov rax, 0
  66 parse_code:
  67     mov al, [rbx]
  68     cmp al, 0
  69     je quit
  70 
  71     cmp al, '0'
  72     jl bad_code
  73     cmp al, '9'
  74     jg bad_code
  75 
  76     imul rdx, 10
  77     sub al, '0'
  78     add rdx, rax
  79 
  80     inc rbx
  81     jmp parse_code
  82 
  83 bad_code:
  84     mov rdx, 1
  85 
  86 quit:
  87     ; exit(rdx)
  88     mov rax, sys_exit
  89     mov rdi, rdx
  90     syscall