1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
; asm (nasm)
; -----------------------------------------------------------------------------
; write_digit
;
; This function is able to write a digit in any numeral base from 2 to 36.
; For bases above 10, it uses latin letters --as for ordinary hex writing.
; Only uppercase letters are used here (they have the size of decimal digits).
; Note that base 36 means digits from 0 to 35, not 36 ;-).
; The only parameter is the digit's numeric value, which should be passed in
; eax (al in fact). The function returns in ebx 0 if all is right, 1 if the
; value was strictly above 35, in which case '?' is written out.
; -----------------------------------------------------------------------------
section .data
; space & newline, for testing
space db 32
newline db 10
; static array of digits, plus error code
digits: db "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ?"
digit_error_code equ $ - 1
section .bss
section .text
global _start
; === write digit =============================================================
; digit numeric value: in al
write_digit:
movzx ecx, al ; pointer to digit will be in ecx for writing
cmp ecx, 35
ja write_digit_above_35
; case below or equal to 35:
mov ebx, 0 ; return value: ok
add ecx, digits ; point to digit
jmp write_digit_write
; case above 35:
write_digit_above_35:
mov ebx, 1 ; return value: error
mov ecx, digit_error_code ; point to error code '?'
; write digit
write_digit_write:
mov edx, 1 ; weight of string to be written
; (pointer to byte already in ecx)
mov ebx, 1 ; file descriptor for stdout
mov eax, 4 ; code for sys_write
int 80h
ret
; === test with sample values =================================================
; --- test tool routines: write space & newline -------------------------------
write_space:
mov edx, 1
mov ecx, space
mov ebx, 1
mov eax, 4
int 80h
ret
write_newline:
mov edx, 1
mov ecx, newline
mov ebx, 1
mov eax, 4
int 80h
ret
; --- start = test ------------------------------------------------------------
_start:
xor eax, eax
; 0
mov al, 0
call write_digit
call write_space
; 1
mov al, 1
call write_digit
call write_space
; 9
mov al, 9
call write_digit
call write_space
; 10
mov al, 10
call write_digit
call write_space
; 15
mov al, 15
call write_digit
call write_space
; 16
mov al, 16
call write_digit
call write_space
; 35
mov al, 35
call write_digit
call write_space
; 36
mov al, 36
call write_digit
call write_space
; 255
mov al, 255
call write_digit
call write_space
call write_newline
jmp _end ; useless here, but kept for generality
; --- end ---------------------------------------------------------------------
_end:
mov ebx, 0 ; exit code 0
mov eax, 1 ; code for sys_exit
int 80h |
Partager