from-scratch/stages/hex0/hex0.in

221 lines
3.4 KiB
Plaintext

; ELF header
; e_ident: u128
; Magic number: 0x7f454c46 = "\x7fELF"
7f 45 4c 46
; EI_CLASS: u8 = ELFCLASS64
02
; EI_DATA: u8 = ELFDATA2LSB
01
; EI_VERSION: u8 = EV_CURRENT
01
; EI_OSABI: u8 = ELFOSABI_NONE
00
; EI_ABIVERSION: u8 = 0
00
; EI_PAD: [u8; 7]
00 00 00 00 00 00 00
; e_type: u16 = E_EXEC
02 00
; e_machine: u16 = EM_X86_64
3e 00
; e_version: u32 = EV_CURRENT
01 00 00 00
; e_entry: u64 = 0x400078
78 00 40 00 00 00 00 00
; e_phoff: u64 = 0x40
40 00 00 00 00 00 00 00
; e_shoff: u64 = 0x0
00 00 00 00 00 00 00 00
; e_flags: u32 = 0
00 00 00 00
; e_ehsize: u16 = 64
40 00
; e_phentsize: u16 = 56
38 00
; e_phnum: u16 = 1
01 00
; e_shentsize: u16 = 0
00 00
; e_shnum: u16 = 0
00 00
; e_shstrndx: u16 = 0
00 00
; End of ELF header
;
; Program header
; p_type: u32 = PT_LOAD
01 00 00 00
; p_flags: u32 = PF_R | PF_X
05 00 00 00
; p_offset: u64 = 0
00 00 00 00 00 00 00 00
; p_vaddr: u64 = 0x400000
00 00 40 00 00 00 00 00
; p_paddr: u64 = 0x0
00 00 00 00 00 00 00 00
; p_filesz: u64 = 0x167
67 01 00 00 00 00 00 00
; p_memsz: u64 = 0x167
67 01 00 00 00 00 00 00
; p_align: u64 = 0x1000
00 10 00 00 00 00 00 00
; End of program header
;
; Code segment (offset 0x40, virtual address 0x400000)
;
; _start=120:
; ; alloca 0x1000 bytes on the stack
; mov rbp, rsp
48 89 e5
; sub rsp, 0x10000, increase this if you want to read more than 0x10000 bytes
48 81 ec 00 00 01 00
; ; read 0x10000 bytes from stdin into the stack
; .READ: (130)
; xor rax, rax
48 31 c0
; mov edi, 0 (stdin)
48 c7 c7 00 00 00 00
; mov rsi, rsp
48 89 e6
; mov rdx, 0x10000, increase this if you want to read more than 0x10000 bytes
48 c7 c2 00 00 01 00
; syscall (sys_read)
0f 05
; cmp rax, 0
48 83 f8 00
; jle die
0f 8e b3 00 00 00
;# (162)
; ; end = r8
; mov r8, rax
49 89 c0
; add r8, rsp
49 01 e0
; ; pos = r9
; mov r9, rsp
49 89 e1
; ; dst = r10
; mov r10, rsp
49 89 e2
; add r10, 0x0000
49 81 c2 00 00 00 00
; ; while (pos < end) {
; ; .L0: (181)
; cmp r9, r8
4d 39 c1
; jge .L3
0f 8d 72 00 00 00
; (190)
;
; ; if (*pos == ';') {
; mov al , byte [r9]
41 8a 41 00
; cmp al, '\n'
3c 0a
; je .L2.1:
0f 84 15 00 00 00
; (202)
; cmp al, ';'
3c 3b
; jne .L1
0f 85 15 00 00 00
; ; while (*pos != '\n') pos++;
; ; .L2: (210)
; inc r9
49 ff c1
; cmp byte [r9], '\n'
41 80 39 0a
; jne .L2
0f 85 f3 ff ff ff
; .L2.1: (223)
; inc r9
49 ff c1
; jmp .L0
e9 ce ff ff ff
; (231)
; ; .L1: (231)
; ; convert *pos to high word
; mov al, byte [r9]
41 8a 01
; mov bl, al
88 c3
; sub bl, 'a'
80 eb 61
; add bl, 10
80 c3 0a
; sub al, '0'
2c 30
; cmp al, 10
3c 0a
; cmovge eax, ebx
0f 43 c3
; shl al, 4
c0 e0 04
; ; pos++
; inc r9
49 ff c1
; ; convert *pos to low word
; mov bl, byte [r9]
41 8a 19
; mov cl, bl
88 d9
; sub cl, 'a'
80 e9 61
; add cl, 10
80 c1 0a
; sub bl, '0'
80 eb 30
; cmp bl, 10
80 fb 0a
; cmovge ebx, ecx
0f 4d d9
; ; combine high and low word
; or al, bl
08 d8
; ; write the byte to dst
; mov byte [r10], al
41 88 02
; inc r10
49 ff c2
; inc r9
49 ff c1
; ; if (*pos++ == '\n') goto .L1;
; cmp byte [r9], '\n'
41 80 39 0a
; je .L0
0f 84 8d ff ff ff
;# (296)
; inc r9
49 ff c1
; jmp .L1 ;
e9 b7 ff ff ff
;# (304)
; ; }
; .L3: (304)
; ; write the decoded bytes to stdout
; mov rax, 1 (sys_write)
48 c7 c0 01 00 00 00
; mov rdi, 1 (stdout)
48 c7 c7 01 00 00 00
; mov rsi, rsp
48 89 e6
; add rsi, 0x000
48 81 c6 00 00 00 00
; mov rdx, r10
4c 89 d2
; sub rdx, rsi
48 29 f2
; syscall
0f 05
; jmp .READ ;
e9 2d ff ff ff
;# (341)
;
; die: (341)
; mov rax, 60 (sys_exit)
48 c7 c0 3c 00 00 00
; xor rdi, rdi
48 31 ff
; syscall
0f 05
; _start+215