202 lines
2.8 KiB
NASM
202 lines
2.8 KiB
NASM
global _start
|
|
extern strlen
|
|
|
|
section .bss
|
|
label1: resq 1
|
|
label2: resq 1
|
|
label3: resq 1
|
|
|
|
section .text
|
|
_start:
|
|
mov rax, 1
|
|
mov [label1], rax
|
|
mov rax, 1
|
|
mov [label2], rax
|
|
mov rax, 2
|
|
mov [label3], rax
|
|
call label4
|
|
mov rdi, 0
|
|
mov rax, 60
|
|
syscall
|
|
|
|
label4:
|
|
push rbp
|
|
mov rbp, rsp
|
|
sub rsp, 0
|
|
mov rax, label16
|
|
push rax
|
|
pop rdi
|
|
call label12
|
|
mov rax, 1
|
|
push rax
|
|
pop rdi
|
|
call label14
|
|
mov rax, label19
|
|
push rax
|
|
pop rdi
|
|
call strlen
|
|
push rax
|
|
mov rax, 1
|
|
mov rbx, rax
|
|
pop rax
|
|
cmp rax, rax
|
|
sete al
|
|
movzx rax, al
|
|
cmp rax, 0
|
|
je label18
|
|
mov rax, label20
|
|
push rax
|
|
pop rdi
|
|
call label12
|
|
jmp label17
|
|
label18:
|
|
mov rax, 0
|
|
cmp rax, 0
|
|
je label21
|
|
mov rax, label22
|
|
push rax
|
|
pop rdi
|
|
call label12
|
|
jmp label17
|
|
label21:
|
|
mov rax, 1
|
|
cmp rax, 0
|
|
je label23
|
|
mov rax, label24
|
|
push rax
|
|
pop rdi
|
|
call label12
|
|
jmp label17
|
|
label23:
|
|
mov rax, label25
|
|
push rax
|
|
pop rdi
|
|
call label12
|
|
label17:
|
|
label5:
|
|
mov rsp, rbp
|
|
pop rbp
|
|
ret
|
|
|
|
label6:
|
|
push rbp
|
|
mov rbp, rsp
|
|
sub rsp, 8
|
|
mov [rbp - 8], rdi
|
|
mov rax, [label1]
|
|
push rax
|
|
mov rax, [label2]
|
|
push rax
|
|
mov rax, [rbp - 8]
|
|
push rax
|
|
mov rax, [rbp - 8]
|
|
push rax
|
|
pop rdi
|
|
call strlen
|
|
push rax
|
|
pop rdx
|
|
pop rsi
|
|
pop rdi
|
|
pop rax
|
|
syscall
|
|
label7:
|
|
mov rsp, rbp
|
|
pop rbp
|
|
ret
|
|
|
|
label8:
|
|
push rbp
|
|
mov rbp, rsp
|
|
sub rsp, 8
|
|
mov [rbp - 8], rdi
|
|
mov rax, [rbp - 8]
|
|
cmp rax, 0
|
|
je label27
|
|
mov rax, label28
|
|
push rax
|
|
pop rdi
|
|
call label6
|
|
jmp label26
|
|
label27:
|
|
mov rax, label29
|
|
push rax
|
|
pop rdi
|
|
call label6
|
|
label26:
|
|
label9:
|
|
mov rsp, rbp
|
|
pop rbp
|
|
ret
|
|
|
|
label10:
|
|
push rbp
|
|
mov rbp, rsp
|
|
sub rsp, 0
|
|
mov rax, label30
|
|
push rax
|
|
pop rdi
|
|
call label6
|
|
label11:
|
|
mov rsp, rbp
|
|
pop rbp
|
|
ret
|
|
|
|
label12:
|
|
push rbp
|
|
mov rbp, rsp
|
|
sub rsp, 8
|
|
mov [rbp - 8], rdi
|
|
mov rax, [rbp - 8]
|
|
push rax
|
|
pop rdi
|
|
call label6
|
|
call label10
|
|
label13:
|
|
mov rsp, rbp
|
|
pop rbp
|
|
ret
|
|
|
|
label14:
|
|
push rbp
|
|
mov rbp, rsp
|
|
sub rsp, 8
|
|
mov [rbp - 8], rdi
|
|
mov rax, [rbp - 8]
|
|
push rax
|
|
pop rdi
|
|
call label8
|
|
call label10
|
|
label15:
|
|
mov rsp, rbp
|
|
pop rbp
|
|
ret
|
|
|
|
strcmp:
|
|
xor rdx, rdx
|
|
.loop:
|
|
mov al, [rsi + rdx]
|
|
mov bl, [rdi + rdx]
|
|
inc rdx
|
|
cmp al, bl
|
|
jne .not_equal
|
|
cmp al, 0
|
|
je .equal
|
|
jmp .loop
|
|
.not_equal:
|
|
mov rax, 0
|
|
ret
|
|
.equal:
|
|
mov rax, 1
|
|
ret
|
|
|
|
section .data
|
|
label16: db `test`, 0
|
|
label19: db `1`, 0
|
|
label20: db `1`, 0
|
|
label22: db `2`, 0
|
|
label24: db `3`, 0
|
|
label25: db `4`, 0
|
|
label28: db `true`, 0
|
|
label29: db `false`, 0
|
|
label30: db `\n`, 0
|