80 lines
1.1 KiB
Plaintext
80 lines
1.1 KiB
Plaintext
bits 32
|
|
|
|
section .data
|
|
|
|
stdout equ 1
|
|
|
|
sys_write equ 4
|
|
sys_exit equ 1
|
|
|
|
kernel equ 0x80
|
|
|
|
program db "Program: ", 0
|
|
programlen equ $-program
|
|
|
|
nl db "", 10, 0
|
|
nllen equ $-nl
|
|
|
|
section .bss
|
|
|
|
scriptname resd 1
|
|
scriptnamelen resd 1
|
|
|
|
section .text
|
|
|
|
global start
|
|
|
|
strlen: ; eax: a string ending in 0
|
|
push eax ; cache eax
|
|
|
|
.strloop:
|
|
mov bl, byte [eax]
|
|
cmp bl, 0
|
|
je .strret ; return len if bl == 0
|
|
inc eax ; else eax++
|
|
jmp .strloop
|
|
|
|
.strret:
|
|
pop ebx ; ebx = cached eax
|
|
sub eax, ebx ; eax -= ebx
|
|
ret ; eax = len
|
|
|
|
start:
|
|
mov eax, esp
|
|
add eax, 4
|
|
mov eax, [eax]
|
|
mov dword [scriptname], eax
|
|
|
|
push programlen
|
|
push program
|
|
push stdout
|
|
mov eax, sys_write
|
|
sub esp, 4
|
|
int kernel
|
|
add esp, 4 + 4 * 3
|
|
|
|
mov dword eax, [scriptname]
|
|
call strlen
|
|
mov dword [scriptnamelen], eax
|
|
|
|
push dword [scriptnamelen]
|
|
push dword [scriptname]
|
|
push stdout
|
|
mov eax, sys_write
|
|
sub esp, 4
|
|
int kernel
|
|
add esp, 4 + 4 * 3
|
|
|
|
push nllen
|
|
push nl
|
|
push stdout
|
|
mov eax, sys_write
|
|
sub esp, 4
|
|
int kernel
|
|
add esp, 4 + 4 * 3
|
|
|
|
push 0
|
|
mov eax, sys_exit
|
|
sub esp, 4
|
|
int kernel
|