RosettaCodeData/Task/Program-name/X86-Assembly/program-name-2.x86

73 lines
1.0 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
mov eax, sys_write
mov ebx, stdout
mov ecx, program
mov edx, programlen
int kernel
mov dword eax, [scriptname]
call strlen
mov dword [scriptnamelen], eax
mov eax, sys_write
mov ebx, stdout
mov dword ecx, [scriptname]
mov dword edx, [scriptnamelen]
int kernel
mov eax, sys_write
mov ebx, stdout
mov ecx, nl
mov edx, nllen
int kernel
mov eax, sys_exit
mov ebx, 0
int kernel