diff options
| author | Christian Cunningham <cc@localhost> | 2024-07-13 21:33:35 -0700 | 
|---|---|---|
| committer | Christian Cunningham <cc@localhost> | 2024-07-13 21:33:35 -0700 | 
| commit | a1f9e733b83ada52be67c8410c2cf2124af4c94b (patch) | |
| tree | a639eb18b9da116ee302b226abdcd5e3f9258e2f /dtos.inc | |
| parent | cf8c4c93fd891018185f8a0cf0757f454a0e09a6 (diff) | |
Digit to String Conversion
Diffstat (limited to 'dtos.inc')
| -rw-r--r-- | dtos.inc | 122 | 
1 files changed, 122 insertions, 0 deletions
| diff --git a/dtos.inc b/dtos.inc new file mode 100644 index 0000000..fb4a048 --- /dev/null +++ b/dtos.inc @@ -0,0 +1,122 @@ +%ifndef DTOS_INC +%define DTOS_INC +%ifndef MONAD_INC +%include "monad.inc" +%endif +	 +	section .data +	_NUMERALS	db	"0123456789ABCDEF" +	_DATA_BYTE_BUFFER	times 63 db "0" +	_FIRST_DIGIT	db	"0", 0x0A, 0 + +	m_make	DTOS_RESULT,	_DATA_BYTE_BUFFER + +%macro dtomz_h 1 +	mov	rax,	%1 +	mov	rcx,	16 +	call	data_to_zstring +%endm + +%macro dtomz_d 1 +	mov	rax,	%1 +	mov	rcx,	10 +	call	data_to_zstring +%endm + +%macro dtomz_o 1 +	mov	rax,	%1 +	mov	rcx,	8 +	call	data_to_zstring +%endm + +%macro dtomz_b 1 +	mov	rax,	%1 +	mov	rcx,	2 +	call	data_to_zstring +%endm + +	section .text +clear_data_zstring: +	push	rbp +	mov	rbp,	rsp +	push	rdi +	cld +	lea	rdi,	[rel _DATA_BYTE_BUFFER] +	mov	al,	"0" +	mov	rcx,	64 +	rep stosb +	std +	pop	rdi +	mov	rsp,	rbp +	pop	rbp +	ret + +data_to_zstring: +	;; rax: Value +	;; rcx: Base +	push	rbp +	mov	rbp,	rsp +	;; +	push	rax +	push	rcx +	call	clear_data_zstring +	pop	rcx +	pop	rax + +	cmp	rcx,	16 +	ja	.err_exit +	cmp	rcx,	2 +	jb	.err_exit +	std +	;; Preserve Caller-saved registers +	push	rsi +	push	rdi +	;;  Initially include newline character +	lea	rdi,	[rel _FIRST_DIGIT] +.loop: +	;; Get lowest digit +	xor	rdx,	rdx +	div	rcx +	;; Set the numeral +	lea	rsi,	[rel _NUMERALS] +	add	rsi,	rdx +	movsb +	cmp	rax,	0 +	jne	.loop +	mov	rax,	rdi +	inc	rax +	cld +	;; Recover Registers +	pop	rdi +	pop	rsi +	m_return	rel m_DTOS_RESULT,	rax +	jmp	.exit +.err_exit: +	m_Nothing	rel m_DTOS_RESULT +.exit: +	lea	rax,	[rel m_DTOS_RESULT] +	;; +	mov	rsp,	rbp +	pop	rbp +	ret + +data_to_zstring_mh: +	mov	rcx,	16 +	call	data_to_zstring +	ret + +data_to_zstring_md: +	mov	rcx,	10 +	call	data_to_zstring +	ret + +data_to_zstring_mo: +	mov	rcx,	8 +	call	data_to_zstring +	ret + +data_to_zstring_mb: +	mov	rcx,	2 +	call	data_to_zstring +	ret +%endif | 
