generated from loic/c-template
148 lines
12 KiB
ArmAsm
148 lines
12 KiB
ArmAsm
global _start
|
|
|
|
section .rodata
|
|
src: db 103, 108, 111, 98, 97, 108, 32, 95, 115, 116, 97, 114, 116, 10, 10, 115, 101, 99, 116, 105, 111, 110, 32, 46, 114, 111, 100, 97, 116, 97, 10, 115, 114, 99, 58, 32, 100, 98, 32, 126, 10, 115, 114, 99, 95, 108, 101, 110, 58, 32, 101, 113, 117, 32, 36, 32, 45, 32, 115, 114, 99, 10, 115, 101, 112, 58, 32, 100, 98, 32, 34, 44, 32, 34, 10, 122, 101, 114, 111, 95, 115, 116, 114, 58, 32, 100, 98, 32, 34, 48, 34, 10, 10, 115, 101, 99, 116, 105, 111, 110, 32, 46, 116, 101, 120, 116, 10, 10, 59, 118, 111, 105, 100, 9, 112, 117, 116, 110, 117, 109, 98, 101, 114, 40, 117, 105, 110, 116, 56, 95, 116, 32, 110, 41, 10, 59, 123, 10, 59, 9, 99, 104, 97, 114, 9, 98, 117, 102, 102, 101, 114, 91, 51, 93, 59, 10, 59, 9, 105, 110, 116, 9, 9, 108, 101, 110, 59, 10, 59, 9, 105, 110, 116, 9, 9, 105, 59, 10, 59, 10, 59, 9, 105, 102, 32, 40, 110, 32, 61, 61, 32, 48, 41, 10, 59, 9, 123, 10, 59, 9, 9, 119, 114, 105, 116, 101, 40, 49, 44, 32, 34, 48, 34, 44, 32, 49, 41, 59, 10, 59, 9, 9, 114, 101, 116, 117, 114, 110, 32, 59, 10, 59, 9, 125, 10, 59, 9, 108, 101, 110, 32, 61, 32, 48, 59, 10, 59, 9, 119, 104, 105, 108, 101, 32, 40, 110, 32, 62, 32, 48, 41, 10, 59, 9, 123, 10, 59, 9, 9, 98, 117, 102, 102, 101, 114, 91, 108, 101, 110, 93, 32, 61, 32, 40, 110, 32, 37, 32, 49, 48, 41, 59, 10, 9, 9, 59, 98, 117, 102, 102, 101, 114, 91, 108, 101, 110, 93, 32, 43, 61, 32, 39, 48, 39, 10, 59, 9, 9, 110, 32, 47, 61, 32, 49, 48, 59, 10, 59, 9, 9, 108, 101, 110, 43, 43, 59, 10, 59, 9, 125, 10, 59, 9, 105, 32, 61, 32, 108, 101, 110, 32, 45, 32, 49, 59, 10, 59, 9, 119, 114, 105, 116, 101, 40, 49, 44, 32, 38, 98, 117, 102, 102, 101, 114, 91, 105, 93, 44, 32, 108, 101, 110, 41, 59, 10, 112, 114, 105, 110, 116, 95, 110, 117, 109, 98, 101, 114, 58, 10, 9, 112, 117, 115, 104, 32, 114, 98, 112, 10, 9, 109, 111, 118, 32, 114, 98, 112, 44, 32, 114, 115, 112, 10, 9, 115, 117, 98, 32, 114, 115, 112, 44, 32, 49, 54, 10, 9, 59, 32, 97, 108, 9, 9, 9, 61, 32, 110, 32, 40, 105, 110, 112, 117, 116, 44, 32, 117, 105, 110, 116, 56, 95, 116, 41, 10, 9, 59, 32, 91, 114, 98, 112, 32, 45, 32, 52, 93, 9, 9, 61, 32, 108, 101, 110, 32, 40, 100, 119, 111, 114, 100, 41, 10, 9, 59, 32, 91, 114, 98, 112, 32, 45, 32, 56, 93, 9, 9, 61, 32, 98, 117, 102, 102, 101, 114, 91, 48, 93, 32, 117, 110, 105, 116, 115, 32, 100, 105, 103, 105, 116, 32, 40, 115, 116, 111, 114, 101, 100, 32, 102, 105, 114, 115, 116, 41, 10, 9, 59, 32, 91, 114, 98, 112, 32, 45, 32, 57, 93, 9, 9, 61, 32, 98, 117, 102, 102, 101, 114, 91, 49, 93, 32, 116, 101, 110, 115, 32, 100, 105, 103, 105, 116, 10, 9, 59, 32, 91, 114, 98, 112, 32, 45, 32, 49, 48, 93, 9, 61, 32, 98, 117, 102, 102, 101, 114, 91, 50, 93, 32, 104, 117, 110, 100, 114, 101, 100, 115, 32, 100, 105, 103, 105, 116, 10, 10, 9, 99, 109, 112, 32, 97, 108, 44, 32, 48, 10, 9, 106, 110, 101, 32, 46, 101, 95, 119, 114, 105, 116, 101, 95, 48, 10, 9, 59, 32, 110, 32, 61, 61, 32, 48, 32, 58, 32, 119, 114, 105, 116, 101, 32, 34, 48, 34, 32, 97, 110, 100, 32, 114, 101, 116, 117, 114, 110, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 100, 105, 44, 32, 49, 10, 9, 108, 101, 97, 32, 114, 115, 105, 44, 32, 91, 114, 101, 108, 32, 122, 101, 114, 111, 95, 115, 116, 114, 93, 10, 9, 109, 111, 118, 32, 114, 100, 120, 44, 32, 49, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 9, 106, 109, 112, 32, 46, 101, 110, 100, 10, 9, 46, 101, 95, 119, 114, 105, 116, 101, 95, 48, 58, 10, 10, 9, 109, 111, 118, 32, 100, 119, 111, 114, 100, 32, 91, 114, 98, 112, 32, 45, 32, 52, 93, 44, 32, 48, 32, 59, 32, 108, 101, 110, 32, 61, 32, 48, 10, 9, 46, 108, 111, 111, 112, 58, 10, 9, 99, 109, 112, 32, 97, 108, 44, 32, 48, 10, 9, 106, 122, 32, 46, 100, 111, 110, 101, 32, 59, 32, 98, 114, 101, 97, 107, 32, 105, 102, 32, 97, 108, 32, 61, 61, 32, 49, 10, 10, 9, 59, 32, 100, 105, 118, 105, 100, 101, 32, 110, 32, 98, 121, 32, 49, 48, 32, 58, 32, 113, 117, 111, 116, 105, 101, 110, 116, 32, 105, 110, 32, 114, 97, 120, 32, 40, 110, 101, 119, 32, 110, 41, 44, 32, 114, 101, 109, 97, 105, 110, 100, 101, 114, 32, 105, 110, 32, 114, 100, 120, 32, 40, 110, 101, 120, 116, 32, 100, 105, 103, 105, 116, 41, 10, 9, 109, 111, 118, 122, 120, 32, 114, 97, 120, 44, 32, 97, 108, 10, 9, 120, 111, 114, 32, 114, 100, 120, 44, 32, 114, 100, 120, 10, 9, 109, 111, 118, 32, 114, 99, 120, 44, 32, 49, 48, 10, 9, 100, 105, 118, 32, 114, 99, 120, 10, 10, 9, 59, 32, 115, 116, 111, 114, 101, 32, 100, 105, 103, 105, 116, 32, 97, 115, 32, 65, 83, 67, 73, 73, 32, 97, 116, 32, 98, 117, 102, 102, 101, 114, 91, 108, 101, 110, 93, 44, 32, 103, 114, 111, 119, 105, 110, 103, 32, 100, 111, 119, 110, 119, 97, 114, 100, 32, 102, 114, 111, 109, 32, 114, 98, 112, 45, 56, 10, 9, 97, 100, 100, 32, 100, 108, 44, 32, 39, 48, 39, 10, 9, 108, 101, 97, 32, 114, 57, 44, 32, 91, 114, 98, 112, 32, 45, 32, 56, 93, 10, 9, 109, 111, 118, 32, 101, 99, 120, 44, 32, 91, 114, 98, 112, 32, 45, 32, 52, 93, 10, 9, 115, 117, 98, 32, 114, 57, 44, 32, 114, 99, 120, 9, 59, 32, 114, 57, 32, 61, 32, 38, 98, 117, 102, 102, 101, 114, 91, 108, 101, 110, 93, 10, 9, 109, 111, 118, 32, 91, 114, 57, 93, 44, 32, 100, 108, 10, 10, 9, 105, 110, 99, 32, 100, 119, 111, 114, 100, 32, 91, 114, 98, 112, 32, 45, 32, 52, 93, 10, 9, 106, 109, 112, 32, 46, 108, 111, 111, 112, 10, 10, 9, 46, 100, 111, 110, 101, 58, 10, 9, 59, 32, 98, 117, 102, 102, 101, 114, 32, 104, 111, 108, 100, 115, 32, 100, 105, 103, 105, 116, 115, 32, 108, 101, 97, 115, 116, 45, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 102, 105, 114, 115, 116, 10, 9, 59, 32, 109, 111, 115, 116, 45, 115, 105, 103, 110, 105, 102, 105, 99, 97, 110, 116, 32, 100, 105, 103, 105, 116, 32, 105, 115, 32, 97, 116, 32, 114, 98, 112, 32, 45, 32, 56, 32, 45, 32, 40, 108, 101, 110, 32, 45, 32, 49, 41, 32, 61, 32, 114, 98, 112, 32, 45, 32, 55, 32, 45, 32, 108, 101, 110, 10, 9, 109, 111, 118, 32, 101, 100, 120, 44, 32, 91, 114, 98, 112, 32, 45, 32, 52, 93, 9, 59, 32, 101, 100, 120, 32, 61, 32, 108, 101, 110, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 100, 105, 44, 32, 49, 10, 9, 108, 101, 97, 32, 114, 115, 105, 44, 32, 91, 114, 98, 112, 32, 45, 32, 55, 93, 10, 9, 115, 117, 98, 32, 114, 115, 105, 44, 32, 114, 100, 120, 9, 9, 59, 32, 114, 115, 105, 32, 61, 32, 114, 98, 112, 32, 45, 32, 55, 32, 45, 32, 108, 101, 110, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 10, 9, 46, 101, 110, 100, 58, 10, 9, 109, 111, 118, 32, 114, 115, 112, 44, 32, 114, 98, 112, 10, 9, 112, 111, 112, 32, 114, 98, 112, 10, 9, 114, 101, 116, 10, 10, 95, 115, 116, 97, 114, 116, 58, 10, 9, 112, 117, 115, 104, 32, 114, 49, 52, 59, 32, 105, 110, 116, 32, 105, 10, 9, 112, 117, 115, 104, 32, 114, 49, 51, 10, 9, 120, 111, 114, 32, 114, 49, 52, 44, 32, 114, 49, 52, 32, 59, 32, 105, 32, 61, 32, 48, 10, 10, 9, 46, 108, 111, 111, 112, 58, 10, 9, 59, 32, 105, 102, 32, 105, 32, 62, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 99, 109, 112, 32, 114, 49, 52, 44, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 106, 103, 101, 32, 46, 100, 111, 110, 101, 32, 59, 32, 98, 114, 101, 97, 107, 59, 10, 10, 9, 59, 114, 49, 51, 32, 61, 32, 97, 100, 100, 114, 32, 111, 102, 32, 115, 114, 99, 32, 43, 32, 105, 10, 9, 108, 101, 97, 32, 114, 49, 51, 44, 32, 91, 114, 101, 108, 32, 115, 114, 99, 93, 10, 9, 97, 100, 100, 32, 114, 49, 51, 44, 32, 114, 49, 52, 10, 9, 10, 9, 99, 109, 112, 32, 98, 121, 116, 101, 32, 91, 114, 49, 51, 93, 44, 32, 49, 50, 54, 10, 9, 106, 101, 32, 46, 101, 115, 99, 97, 112, 101, 10, 10, 10, 9, 59, 32, 119, 114, 105, 116, 101, 32, 49, 44, 32, 114, 49, 51, 44, 32, 49, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 100, 105, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 115, 105, 44, 32, 114, 49, 51, 10, 9, 109, 111, 118, 32, 114, 100, 120, 44, 32, 49, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 9, 106, 109, 112, 32, 46, 110, 101, 120, 116, 95, 98, 121, 116, 101, 10, 10, 9, 46, 101, 115, 99, 97, 112, 101, 58, 10, 9, 112, 117, 115, 104, 32, 114, 49, 50, 10, 9, 120, 111, 114, 32, 114, 49, 50, 44, 32, 114, 49, 50, 32, 59, 32, 106, 32, 61, 32, 48, 10, 9, 46, 101, 95, 108, 111, 111, 112, 58, 10, 9, 99, 109, 112, 32, 114, 49, 50, 44, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 106, 103, 101, 32, 46, 101, 115, 99, 97, 112, 101, 95, 101, 110, 100, 10, 10, 9, 108, 101, 97, 32, 114, 97, 120, 44, 32, 91, 114, 101, 108, 32, 115, 114, 99, 93, 10, 9, 97, 100, 100, 32, 114, 97, 120, 44, 32, 114, 49, 50, 10, 9, 109, 111, 118, 32, 97, 108, 44, 32, 91, 114, 97, 120, 93, 10, 9, 99, 97, 108, 108, 32, 112, 114, 105, 110, 116, 95, 110, 117, 109, 98, 101, 114, 10, 10, 9, 105, 110, 99, 32, 114, 49, 50, 10, 9, 99, 109, 112, 32, 114, 49, 50, 44, 32, 115, 114, 99, 95, 108, 101, 110, 10, 9, 106, 103, 101, 32, 46, 101, 115, 99, 97, 112, 101, 95, 101, 110, 100, 10, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 49, 10, 9, 109, 111, 118, 32, 114, 100, 105, 44, 32, 49, 10, 9, 108, 101, 97, 32, 114, 115, 105, 44, 32, 91, 114, 101, 108, 32, 115, 101, 112, 93, 10, 9, 109, 111, 118, 32, 114, 100, 120, 44, 32, 50, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10, 10, 9, 106, 109, 112, 32, 46, 101, 95, 108, 111, 111, 112, 10, 9, 46, 101, 115, 99, 97, 112, 101, 95, 101, 110, 100, 58, 10, 9, 112, 111, 112, 32, 114, 49, 50, 10, 10, 9, 46, 110, 101, 120, 116, 95, 98, 121, 116, 101, 58, 10, 9, 105, 110, 99, 32, 114, 49, 52, 32, 59, 32, 43, 43, 105, 10, 9, 106, 109, 112, 32, 46, 108, 111, 111, 112, 10, 10, 9, 46, 100, 111, 110, 101, 58, 10, 9, 109, 111, 118, 32, 101, 97, 120, 44, 32, 54, 48, 32, 59, 32, 83, 89, 83, 95, 101, 120, 105, 116, 10, 9, 120, 111, 114, 32, 101, 100, 105, 44, 32, 101, 100, 105, 32, 59, 32, 99, 111, 100, 101, 32, 61, 32, 48, 10, 9, 115, 121, 115, 99, 97, 108, 108, 10
|
|
src_len: equ $ - src
|
|
sep: db ", "
|
|
zero_str: db "0"
|
|
|
|
section .text
|
|
|
|
;void putnumber(uint8_t n)
|
|
;{
|
|
; char buffer[3];
|
|
; int len;
|
|
; int i;
|
|
;
|
|
; if (n == 0)
|
|
; {
|
|
; write(1, "0", 1);
|
|
; return ;
|
|
; }
|
|
; len = 0;
|
|
; while (n > 0)
|
|
; {
|
|
; buffer[len] = (n % 10);
|
|
;buffer[len] += '0'
|
|
; n /= 10;
|
|
; len++;
|
|
; }
|
|
; i = len - 1;
|
|
; write(1, &buffer[i], len);
|
|
print_number:
|
|
push rbp
|
|
mov rbp, rsp
|
|
sub rsp, 16
|
|
; al = n (input, uint8_t)
|
|
; [rbp - 4] = len (dword)
|
|
; [rbp - 8] = buffer[0] units digit (stored first)
|
|
; [rbp - 9] = buffer[1] tens digit
|
|
; [rbp - 10] = buffer[2] hundreds digit
|
|
|
|
cmp al, 0
|
|
jne .e_write_0
|
|
; n == 0 : write "0" and return
|
|
mov eax, 1
|
|
mov rdi, 1
|
|
lea rsi, [rel zero_str]
|
|
mov rdx, 1
|
|
syscall
|
|
jmp .end
|
|
.e_write_0:
|
|
|
|
mov dword [rbp - 4], 0 ; len = 0
|
|
.loop:
|
|
cmp al, 0
|
|
jz .done ; break if al == 1
|
|
|
|
; divide n by 10 : quotient in rax (new n), remainder in rdx (next digit)
|
|
movzx rax, al
|
|
xor rdx, rdx
|
|
mov rcx, 10
|
|
div rcx
|
|
|
|
; store digit as ASCII at buffer[len], growing downward from rbp-8
|
|
add dl, '0'
|
|
lea r9, [rbp - 8]
|
|
mov ecx, [rbp - 4]
|
|
sub r9, rcx ; r9 = &buffer[len]
|
|
mov [r9], dl
|
|
|
|
inc dword [rbp - 4]
|
|
jmp .loop
|
|
|
|
.done:
|
|
; buffer holds digits least-significant first
|
|
; most-significant digit is at rbp - 8 - (len - 1) = rbp - 7 - len
|
|
mov edx, [rbp - 4] ; edx = len
|
|
mov eax, 1
|
|
mov rdi, 1
|
|
lea rsi, [rbp - 7]
|
|
sub rsi, rdx ; rsi = rbp - 7 - len
|
|
syscall
|
|
|
|
.end:
|
|
mov rsp, rbp
|
|
pop rbp
|
|
ret
|
|
|
|
_start:
|
|
push r14; int i
|
|
push r13
|
|
xor r14, r14 ; i = 0
|
|
|
|
.loop:
|
|
; if i > src_len
|
|
cmp r14, src_len
|
|
jge .done ; break;
|
|
|
|
;r13 = addr of src + i
|
|
lea r13, [rel src]
|
|
add r13, r14
|
|
|
|
cmp byte [r13], 126
|
|
je .escape
|
|
|
|
|
|
; write 1, r13, 1
|
|
mov eax, 1
|
|
mov rdi, 1
|
|
mov rsi, r13
|
|
mov rdx, 1
|
|
syscall
|
|
jmp .next_byte
|
|
|
|
.escape:
|
|
push r12
|
|
xor r12, r12 ; j = 0
|
|
.e_loop:
|
|
cmp r12, src_len
|
|
jge .escape_end
|
|
|
|
lea rax, [rel src]
|
|
add rax, r12
|
|
mov al, [rax]
|
|
call print_number
|
|
|
|
inc r12
|
|
cmp r12, src_len
|
|
jge .escape_end
|
|
|
|
mov eax, 1
|
|
mov rdi, 1
|
|
lea rsi, [rel sep]
|
|
mov rdx, 2
|
|
syscall
|
|
|
|
jmp .e_loop
|
|
.escape_end:
|
|
pop r12
|
|
|
|
.next_byte:
|
|
inc r14 ; ++i
|
|
jmp .loop
|
|
|
|
.done:
|
|
mov eax, 60 ; SYS_exit
|
|
xor edi, edi ; code = 0
|
|
syscall
|