Skip to content

Commit 08a2dd5

Browse files
authored
Add Quine in X86 64 (#5291)
1 parent cb2d792 commit 08a2dd5

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed

archive/x/x86-64/quine.asm

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
; SYSCALLS
2+
%DEFINE SYS_READ 0
3+
%DEFINE SYS_WRITE 1
4+
%DEFINE STDOUT 1
5+
%DEFINE SYS_EXIT 60
6+
section .data
7+
string:
8+
.msg db "; SYSCALLS%DEFINE SYS_READ 0%DEFINE SYS_WRITE 1%DEFINE STDOUT 1%DEFINE SYS_EXIT 60section .datastring:.msg db .len equ $- .msgquote db 0x22newline db 0xAlinestarts dw 0, 10, 18, 19, 16, 19, 13, 7, 8linestarts2 dw 16, 13, 14, 45, 312, 17, 13, 13, 7, 19, 10, 11, 12, 6, 12, 18, 15, 12, 31, 24, 7, 12, 12, 8, 18, 15, 16, 10, 7, 12, 10, 12, 9, 6, 18, 15, 14, 10, 7, 18, 15, 19, 19, 7, 18, 15, 14, 10, 7, 18, 15, 16, 10, 7, 10, 6, 12, 18, 15, 12, 32, 25, 7, 12, 12, 8, 18, 15, 16, 10, 7, 12, 10, 12, 9, 6, 11, 10, 7%DEFINE PRINT1 90section .textglobal _start_start:MOV R12, string.msgMOV R13, 2MOV R14, 16MOV R15, 158loop0:MOV RCX, R13MOV RAX, SYS_WRITEMOV RDI, STDOUTMOV RSI, R12ADD R12W, WORD [linestarts+RCX]MOV DX, [linestarts+RCX]SYSCALLMOV RCX, R13CMP RCX, R14JE exit1MOV RAX, SYS_WRITEMOV RDI, STDOUTMOV RSI, newlineMOV RDX, 1SYSCALLMOV RCX, R13ADD RCX, 2MOV R13, RCXJMP loop0exit1:MOV RAX, SYS_WRITEMOV RDI, STDOUTMOV RSI, quoteMOV RDX, 1SYSCALLMOV RAX, SYS_WRITEMOV RDI, STDOUTMOV RSI, string.msgMOV RDX, string.lenSYSCALLMOV RAX, SYS_WRITEMOV RDI, STDOUTMOV RSI, quoteMOV RDX, 1SYSCALLMOV RAX, SYS_WRITEMOV RDI, STDOUTMOV RSI, newlineMOV RDX, 1SYSCALLMOV R13, 0loop1:MOV RCX, R13MOV RAX, SYS_WRITEMOV RDI, STDOUTMOV RSI, R12ADD R12W, WORD [linestarts2+RCX]MOV DX, [linestarts2+RCX]SYSCALLMOV RCX, R13CMP RCX, R15JE exit2MOV RAX, SYS_WRITEMOV RDI, STDOUTMOV RSI, newlineMOV RDX, 1SYSCALLMOV RCX, R13ADD RCX, 2MOV R13, RCXJMP loop1exit2:MOV RAX, 60MOV RDI, 0SYSCALL"
9+
.len equ $- .msg
10+
quote db 0x22
11+
newline db 0xA
12+
linestarts dw 0, 10, 18, 19, 16, 19, 13, 7, 8
13+
linestarts2 dw 16, 13, 14, 45, 312, 17, 13, 13, 7, 19, 10, 11, 12, 6, 12, 18, 15, 12, 31, 24, 7, 12, 12, 8, 18, 15, 16, 10, 7, 12, 10, 12, 9, 6, 18, 15, 14, 10, 7, 18, 15, 19, 19, 7, 18, 15, 14, 10, 7, 18, 15, 16, 10, 7, 10, 6, 12, 18, 15, 12, 32, 25, 7, 12, 12, 8, 18, 15, 16, 10, 7, 12, 10, 12, 9, 6, 11, 10, 7
14+
%DEFINE PRINT1 90
15+
section .text
16+
global _start
17+
_start:
18+
MOV R12, string.msg
19+
MOV R13, 2
20+
MOV R14, 16
21+
MOV R15, 158
22+
loop0:
23+
MOV RCX, R13
24+
MOV RAX, SYS_WRITE
25+
MOV RDI, STDOUT
26+
MOV RSI, R12
27+
ADD R12W, WORD [linestarts+RCX]
28+
MOV DX, [linestarts+RCX]
29+
SYSCALL
30+
MOV RCX, R13
31+
CMP RCX, R14
32+
JE exit1
33+
MOV RAX, SYS_WRITE
34+
MOV RDI, STDOUT
35+
MOV RSI, newline
36+
MOV RDX, 1
37+
SYSCALL
38+
MOV RCX, R13
39+
ADD RCX, 2
40+
MOV R13, RCX
41+
JMP loop0
42+
exit1:
43+
MOV RAX, SYS_WRITE
44+
MOV RDI, STDOUT
45+
MOV RSI, quote
46+
MOV RDX, 1
47+
SYSCALL
48+
MOV RAX, SYS_WRITE
49+
MOV RDI, STDOUT
50+
MOV RSI, string.msg
51+
MOV RDX, string.len
52+
SYSCALL
53+
MOV RAX, SYS_WRITE
54+
MOV RDI, STDOUT
55+
MOV RSI, quote
56+
MOV RDX, 1
57+
SYSCALL
58+
MOV RAX, SYS_WRITE
59+
MOV RDI, STDOUT
60+
MOV RSI, newline
61+
MOV RDX, 1
62+
SYSCALL
63+
MOV R13, 0
64+
loop1:
65+
MOV RCX, R13
66+
MOV RAX, SYS_WRITE
67+
MOV RDI, STDOUT
68+
MOV RSI, R12
69+
ADD R12W, WORD [linestarts2+RCX]
70+
MOV DX, [linestarts2+RCX]
71+
SYSCALL
72+
MOV RCX, R13
73+
CMP RCX, R15
74+
JE exit2
75+
MOV RAX, SYS_WRITE
76+
MOV RDI, STDOUT
77+
MOV RSI, newline
78+
MOV RDX, 1
79+
SYSCALL
80+
MOV RCX, R13
81+
ADD RCX, 2
82+
MOV R13, RCX
83+
JMP loop1
84+
exit2:
85+
MOV RAX, 60
86+
MOV RDI, 0
87+
SYSCALL

0 commit comments

Comments
 (0)