diff options
Diffstat (limited to 'strings/strxmov.asm')
-rw-r--r-- | strings/strxmov.asm | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/strings/strxmov.asm b/strings/strxmov.asm new file mode 100644 index 00000000000..9b027ad4276 --- /dev/null +++ b/strings/strxmov.asm @@ -0,0 +1,103 @@ +; Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +; +; This library is free software; you can redistribute it and/or +; modify it under the terms of the GNU Library General Public +; License as published by the Free Software Foundation; either +; version 2 of the License, or (at your option) any later version. +; +; This library is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +; Library General Public License for more details. +; +; You should have received a copy of the GNU Library General Public +; License along with this library; if not, write to the Free +; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +; MA 02111-1307, USA + + TITLE Optimized strxmov for MSDOS / Intel 8086 + +ifndef M_I386 + .8087 + DOSSEG + .MODEL LARGE + .CODE + + PUBLIC _strxmov +_strxmov PROC + mov bx,sp + add bx,4 + push si + push di + mov cx,ds ; Save ds +ASSUME DS: NOTHING +ASSUME ES: NOTHING + les di,DWORD PTR ss:[bx] ; dst + jmp next_str + +start_str: + mov al,ds:[si] + movsb ; move arg + and al,al + jnz start_str ; Not last + dec di + +next_str: + add bx,4 + lds si,DWORD PTR ss:[bx] + mov ax,ds + or ax,si + jnz start_str + + mov byte ptr es:[di],0 ; Force end null (if no source) + mov ds,cx + mov ax,di ; Return ptr to last 0 + mov dx,es + pop di + pop si + ret +_strxmov ENDP + +else + +include macros.asm + + begcode strxmov + public _strxmov + +_strxmov PROC near +ASSUME DS: NOTHING +ASSUME ES: NOTHING + push EBP + mov EBP,ESP + mov EDX,EBX ; Save EBX + mov ECX,ESI ; Save ESI + push EDI + mov EDI,8[EBP] ; Get destination + lea EBX,8[EBP] ; Get adress to first source - 4 + xor al,al + jmp next_str + +start_str: movsb + cmp AL,[EDI-1] + jne start_str + dec EDI ; Don't copy last null + +next_str: add EBX,4 + mov ESI,[EBX] + or ESI,ESI + jne start_str + mov byte ptr [EDI],0 ; Force last null + + mov EAX,EDI ; Return ptr to null + pop EDI + mov ESI,ECX + mov EBX,EDX + pop EBP + ret +_strxmov endp + endcode strxmov + +endif + + END |