[41] | 1 | ; File name : String.asm |
---|
| 2 | ; Project name : Assembly Library |
---|
| 3 | ; Created date : 12.7.2010 |
---|
[53] | 4 | ; Last update : 13.10.2010 |
---|
[41] | 5 | ; Author : Tomi Tilli |
---|
| 6 | ; Description : Functions for handling characters. |
---|
| 7 | |
---|
| 8 | ; Section containing code |
---|
| 9 | SECTION .text |
---|
| 10 | |
---|
| 11 | ;-------------------------------------------------------------------- |
---|
[53] | 12 | ; String_ConvertDSSItoLowerCase |
---|
| 13 | ; Parameters: |
---|
| 14 | ; DS:SI: Ptr to string to convert |
---|
| 15 | ; Returns: |
---|
| 16 | ; CX: Number of characters processed |
---|
| 17 | ; SI: Updated |
---|
| 18 | ; Corrupts registers: |
---|
| 19 | ; Nothing |
---|
| 20 | ;-------------------------------------------------------------------- |
---|
| 21 | ALIGN JUMP_ALIGN |
---|
| 22 | String_ConvertDSSItoLowerCase: |
---|
| 23 | push dx |
---|
| 24 | push ax |
---|
| 25 | |
---|
| 26 | mov dx, StringProcess_ConvertToLowerCase |
---|
| 27 | call StringProcess_DSSIwithFunctionInDX |
---|
| 28 | |
---|
| 29 | pop ax |
---|
| 30 | pop dx |
---|
| 31 | ret |
---|
| 32 | |
---|
| 33 | |
---|
| 34 | ;-------------------------------------------------------------------- |
---|
[41] | 35 | ; String_ConvertWordToAXfromStringInDSSIwithBaseInBX |
---|
| 36 | ; Parameters: |
---|
| 37 | ; BX: Numeric base (10 or 16) |
---|
| 38 | ; DS:SI: Ptr to string to convert |
---|
| 39 | ; Returns: |
---|
| 40 | ; AX: Word converted from string |
---|
[53] | 41 | ; CX: Number of characters processed |
---|
[52] | 42 | ; SI: Updated |
---|
| 43 | ; CF: Cleared if successfull |
---|
| 44 | ; Set if error during conversion |
---|
[41] | 45 | ; Corrupts registers: |
---|
[52] | 46 | ; Nothing |
---|
[41] | 47 | ;-------------------------------------------------------------------- |
---|
| 48 | ALIGN JUMP_ALIGN |
---|
| 49 | String_ConvertWordToAXfromStringInDSSIwithBaseInBX: |
---|
[52] | 50 | push di |
---|
| 51 | push dx |
---|
[41] | 52 | |
---|
[52] | 53 | xor di, di |
---|
| 54 | mov dx, StringProcess_ConvertToWordInDIWithBaseInBX |
---|
| 55 | call StringProcess_DSSIwithFunctionInDX |
---|
| 56 | xchg ax, di |
---|
[41] | 57 | |
---|
[52] | 58 | pop dx |
---|
| 59 | pop di |
---|
[41] | 60 | ret |
---|
| 61 | |
---|
| 62 | |
---|
| 63 | ;-------------------------------------------------------------------- |
---|
[53] | 64 | ; String_CopyDSSItoESDIandGetLengthToCX |
---|
[41] | 65 | ; Parameters: |
---|
| 66 | ; DS:SI: Ptr to source NULL terminated string |
---|
| 67 | ; ES:DI: Ptr to destination buffer |
---|
| 68 | ; Returns: |
---|
| 69 | ; CX: Number of characters copied |
---|
| 70 | ; SI,DI: Updated by CX characters |
---|
| 71 | ; Corrupts registers: |
---|
| 72 | ; Nothing |
---|
| 73 | ;-------------------------------------------------------------------- |
---|
| 74 | ALIGN JUMP_ALIGN |
---|
[53] | 75 | String_CopyDSSItoESDIandGetLengthToCX: |
---|
[41] | 76 | push ax |
---|
[52] | 77 | |
---|
[41] | 78 | xor cx, cx |
---|
| 79 | ALIGN JUMP_ALIGN |
---|
[52] | 80 | .CopyNextCharacter: |
---|
[41] | 81 | lodsb ; Load from DS:SI to AL |
---|
| 82 | test al, al ; NULL to end string? |
---|
| 83 | jz SHORT .EndOfString |
---|
| 84 | stosb ; Store from AL to ES:DI |
---|
| 85 | inc cx ; Increment number of characters written |
---|
[52] | 86 | jmp SHORT .CopyNextCharacter |
---|
[41] | 87 | |
---|
| 88 | ALIGN JUMP_ALIGN |
---|
| 89 | .EndOfString: |
---|
| 90 | pop ax |
---|
| 91 | ret |
---|
[46] | 92 | |
---|
| 93 | |
---|
| 94 | ;-------------------------------------------------------------------- |
---|
[52] | 95 | ; String_GetLengthFromDSSItoCX |
---|
[46] | 96 | ; Parameters: |
---|
[52] | 97 | ; DS:SI: Ptr to NULL terminated string |
---|
[46] | 98 | ; Returns: |
---|
[52] | 99 | ; CX: String length in characters |
---|
[46] | 100 | ; Corrupts registers: |
---|
| 101 | ; Nothing |
---|
| 102 | ;-------------------------------------------------------------------- |
---|
| 103 | ALIGN JUMP_ALIGN |
---|
[52] | 104 | String_GetLengthFromDSSItoCX: |
---|
| 105 | push ax |
---|
[46] | 106 | push si |
---|
| 107 | |
---|
[52] | 108 | call Memory_ExchangeDSSIwithESDI |
---|
| 109 | xor ax, ax ; Find NULL |
---|
| 110 | mov cx, -1 ; Full segment if necessary |
---|
| 111 | repne scasb |
---|
| 112 | mov cx, di |
---|
| 113 | call Memory_ExchangeDSSIwithESDI |
---|
[46] | 114 | |
---|
[52] | 115 | pop si |
---|
| 116 | stc |
---|
| 117 | sbb cx, si ; Subtract NULL |
---|
[46] | 118 | pop ax |
---|
| 119 | ret |
---|