Rotth is a stack based concatenative language highly inspired by Porth
0

Configure Feed

Select the types of activity you want to include in your feed.

Add print routine

Ivan Chinenov (Mar 8, 2022, 10:25 PM +0300) df2f7d65 09ff5a40

+89
+89
print.asm
··· 1 + section .data 2 + buffer times 32 db 0 3 + 4 + section .text 5 + global print 6 + 7 + print: 8 + call ft_itoa 9 + mov rdi, buffer 10 + call cstrlen 11 + 12 + mov rdi, 1 ; fd 13 + mov rsi, buffer ; buffer 14 + xor rdx, rdx 15 + mov rdx, rax ; count 16 + mov rax, 1 ; write(2) 17 + syscall 18 + 19 + ret 20 + 21 + ;====================================================== 22 + 23 + ; https://tuttlem.github.io/2013/01/08/strlen-implementation-in-nasm.html 24 + 25 + cstrlen: 26 + push rbx ; save any registers that 27 + push rcx ; we will trash in here 28 + 29 + mov rbx, rdi ; rbx = rdi 30 + 31 + xor al, al ; the byte that the scan will 32 + ; compare to is zero 33 + 34 + mov rcx, 0xffffffff ; the maximum number of bytes 35 + 36 + repne scasb ; while [rdi] != al, keep scanning 37 + 38 + sub rdi, rbx ; length = dist2 - dist1 39 + mov rax, rdi ; rax now holds our length 40 + 41 + pop rcx ; restore the saved registers 42 + pop rbx 43 + 44 + ret ; all done! 45 + 46 + ;====================================================== 47 + 48 + ; https://stackoverflow.com/a/54381686/12015230 49 + 50 + ft_itoa: 51 + xor rcx, rcx ;initialize counter 52 + xor r9, r9 ;set neg flag to 0 53 + mov eax, edi ;move number in RAX for DIV instruction 54 + push rbx ;save RBX 55 + mov ebx, 10 56 + 57 + .check_negative: 58 + and edi, 0x80000000 59 + mov rdi, buffer 60 + jz .divide ;number is positive, proceed to main loop 61 + not eax ;else 62 + inc eax ;compute absolute value with binary complement 63 + inc r9 ;set neg flag 64 + 65 + .divide: 66 + xor edx, edx 67 + div ebx 68 + add edx, 48 ;convert int to char 69 + push rdx 70 + inc rcx 71 + cmp eax, 0 72 + jnz .divide 73 + 74 + .check_neg_flag: 75 + cmp r9, 1 76 + jne .buff_string 77 + mov byte[rdi], '-' 78 + 79 + .buff_string: 80 + pop rdx 81 + mov byte[rdi + r9], dl 82 + dec rcx 83 + inc r9 84 + cmp rcx, 0 85 + jnz .buff_string 86 + mov byte[rdi + r9], 10 87 + mov byte[rdi + r9 + 1], 0 88 + pop rbx ;restore RBX 89 + ret