; helper routines lib for sample applications. ; this lib was tested only to work with the accompanying `sample' applications ; and wasn't intended to be used outside of this scope. ;--------------------------------------------------------------------------------- format ELF public dd2ascii_hex public dec_ascii2dd public dw2ascii_hex public dw2ascii_dec public error_chk section '.text' executable ;================================================================================= ; dword to ascii hex ; by Cecchinel Stephan (from APJ) ; ; [esp+4] - value to convert ; [esp+8] - pointer to the output buffer ;================================================================================= dd2ascii_hex: mov eax, [esp+4] bswap eax movq mm3, [sum] movq mm4, [comp] movq mm2, [mask] movq mm5, mm3 psubb mm5, mm4 movd mm0, eax movq mm1, mm0 psrlq mm0, 4 mov eax, [esp+8] pand mm0, mm2 pand mm1, mm2 punpcklbw mm0, mm1 movq mm1, mm0 pcmpgtb mm0, mm4 pand mm0, mm5 paddb mm1, mm3 paddb mm1, mm0 movq [eax], mm1 ret ;================================================================================= ; ascii decimal string to numeral value (works only with positive values) ; ; [esp+4] - pointer to a null terminated string ; on return eax will hold converted value ; ;================================================================================= dec_ascii2dd: push ebx push ecx push esi mov esi, [esp+4+3*4] xor eax, eax xor ecx, ecx xor ebx, ebx @@: lodsb test al, al je @f sub al, 30h lea ecx, [ecx+4*ecx] lea ecx, [eax+2*ecx] jmp @b @@: lea eax, [ebx+ecx] xor eax, ebx pop esi pop ecx pop ebx ret ;================================================================================= ; word to ascii hex ; ; [esp+4] - value to convert ; [esp+8] - pointer to the output buffer ;================================================================================= dw2ascii_hex: push ebx mov eax, [esp+4+4] mov edx, [esp+8+4] mov ebx, eax and eax, 0xf cmp al, 0xa jge l3 add al, 0x30 jmp l4 l3: add al, 0x37 l4: mov [edx+3], byte al ror ebx, 4 mov eax, ebx and eax, 0xf cmp al, 0xa jge l5 add al, 0x30 jmp l6 l5: add al, 0x37 l6: mov [edx+2], byte al ror ebx, 4 mov eax, ebx and eax, 0xf cmp al, 0xa jge l7 add al, 0x30 jmp l8 l7: add al, 0x37 l8: mov [edx+1], byte al ror ebx, 4 and ebx, 0xf cmp bl, 0xa jge l9 add bl, 0x30 jmp la l9: add bl, 0x37 la: mov [edx], byte bl pop ebx ret ;============================================================================================================ ; dword to ASCII decimal ; ; [esp+4] - dword to convert ; [esp+8] - pointer to a buffer that will receive the output ; [esp+12] - specifies number of digits in the number. (leading zeroes appended if needed) ;============================================================================================================ dw2ascii_dec: push edx push ecx push ebx mov eax, [esp+4+3*4] mov edi, [esp+8+3*4] mov esi, [esp+12+3*4] mov ecx, 10 xor ebx, ebx @@: xor edx, edx div ecx add dl, 30h inc ebx push edx test eax, eax jne @b sub esi, ebx js b1 jz b1 mov al, 0x30 @@: stosb dec esi jns @b dec edi b1: pop eax stosb dec ebx jnz b1 mov [edi], byte 0 cmp edi, [esp+8+3*4] jne @f mov [edi], word 0030h inc edi @@: mov eax, edi pop ebx pop ecx pop edx ret ;================================================================================= ; print current errno to STDOUT ; ; [esp+4] - pointer to error string ; [esp+8] - return address where we should return in case of error ; eax - 'int 0x80' return value. if want to treat 0 as an error too then ; eax should contain 0x80000000 ;================================================================================= error_chk: test eax, eax jns exit push edi push esi push ebx push eax mov ecx, eax mov esi, [esp+4+4*4] ;; error string mov edi, err_s @@: lodsb stosb test al, al jne @b dec edi neg ecx cmp ecx, 131 jbe @f cmp ecx, 0x80000000 jne prnt_n xor ecx, ecx prnt_n: push edi push ecx call dd2ascii_hex add esp, 8 add edi, 9 mov [edi-1], byte 0xa sub edi, err_s mov edx, edi jmp w_out @@: cmp ecx, 41 je prnt_n cmp ecx, 58 je prnt_n mov esi, errno1-1 f_nxt: mov edx, -1 @@: inc esi inc edx cmp [esi], byte 0xa jne @b dec ecx jnz f_nxt sub esi, edx mov ecx, edx inc ecx rep movsb mov edx, edi sub edx, err_s w_out: mov eax, 4 ;SYS_WRITE mov ebx, 1 ;STDOUT mov ecx, err_s int 0x80 pop eax pop ebx pop esi pop edi add esp, 8 exit: ret ;================================================================================= section '.data' writeable sum dq 0x3030303030303030 mask dq 0x0f0f0f0f0f0f0f0f comp dq 0x0909090909090909 errno1 db "EPERM",0xa ; 1 db "ENOENT",0xa db "ESRCH",0xa db "EINTR",0xa db "EIO",0xa db "ENXIO",0xa db "E2BIG",0xa db "ENOEXEC",0xa db "EBADF",0xa db "ECHILD",0xa db "EAGAIN (EWOULDBLOCK)",0xa db "ENOMEM",0xa db "EACCES",0xa db "EFAULT",0xa db "ENOTBLK",0xa db "EBUSY",0xa db "EEXIST",0xa db "EXDEV",0xa db "ENODEV",0xa db "ENOTDIR",0xa db "EISDIR",0xa db "EINVAL",0xa db "ENFILE",0xa db "EMFILE",0xa db "ENOTTY",0xa db "ETXTBSY",0xa db "EFBIG",0xa db "ENOSPC",0xa db "ESPIPE",0xa db "EROFS",0xa db "EMLINK",0xa db "EPIPE",0xa db "EDOM",0xa db "ERANGE",0xa db "EDEADLK (EDEADLOCK)",0xa db "ENAMETOOLONG",0xa db "ENOLCK",0xa db "ENOSYS",0xa db "ENOTEMPTY",0xa db "ELOOP",0xa ; 40 db 0xa db "ENOMSG",0xa ; 42 db "EIDRM",0xa db "ECHRNG",0xa db "EL2NSYNC",0xa db "EL3HLT",0xa db "EL3RST",0xa db "ELNRNG",0xa db "EUNATCH",0xa db "ENOCSI",0xa db "EL2HLT",0xa db "EBADE",0xa db "EBADR",0xa db "EXFULL",0xa db "ENOANO",0xa db "EBADRQC",0xa db "EBADSLT",0xa ; 57 db 0xa db "EBFONT",0xa ; 59 db "ENOSTR",0xa db "ENODATA",0xa db "ETIME",0xa db "ENOSR",0xa db "ENONET",0xa db "ENOPKG",0xa db "EREMOTE",0xa db "ENOLINK",0xa db "EADV",0xa db "ESRMNT",0xa db "ECOMM",0xa db "EPROTO",0xa db "EMULTIHOP",0xa db "EDOTDOT",0xa db "EBADMSG",0xa db "EOVERFLOW",0xa db "ENOTUNIQ",0xa db "EBADFD",0xa db "EREMCHG",0xa db "ELIBACC",0xa db "ELIBBAD",0xa db "ELIBSCN",0xa db "ELIBMAX",0xa db "ELIBEXEC",0xa db "EILSEQ",0xa db "ERESTART",0xa db "ESTRPIPE",0xa db "EUSERS",0xa db "ENOTSOCK",0xa db "EDESTADDRREQ",0xa db "EMSGSIZE",0xa db "EPROTOTYPE",0xa db "ENOPROTOOP",0xa db "EPROTONOSUPPORT",0xa db "ESOCKTNOSUPPORT" db "EOPNOTSUPP",0xa db "EPFNOSUPPORT",0xa db "EAFNOSUPPORT",0xa db "EADDRINUSE",0xa db "EADDRNOTAVAIL",0xa db "ENETDOWN",0xa db "ENETUNREACH",0xa db "ENETRESET",0xa db "ECONNABORTED",0xa db "ECONNRESET",0xa db "ENOBUFS",0xa db "EISCONN",0xa db "ENOTCONN",0xa db "ESHUTDOWN",0xa db "ETOOMANYREFS",0xa db "ETIMEDOUT",0xa db "ECONNREFUSED" db "EHOSTDOWN",0xa db "EHOSTUNREACH",0xa db "EALREADY",0xa db "EINPROGRESS",0xa db "ESTALE",0xa db "EUCLEAN",0xa db "ENOTNAM",0xa db "ENAVAIL",0xa db "EISNAM",0xa db "EREMOTEIO",0xa db "EDQUOT",0xa db "ENOMEDIUM",0xa db "EMEDIUMTYPE",0xa db "ECANCELED",0xa db "ENOKEY",0xa db "EKEYEXPIRED",0xa db "EKEYREVOKED",0xa db "EKEYREJECTED",0xa db "EOWNERDEAD",0xa db "ENOTRECOVERABLE",0xa ; 131 err_s rb 256