windows-nt/Source/XPSP1/NT/base/ntos/rtl/i386/byteswap.asm
2020-09-26 16:20:57 +08:00

166 lines
2.4 KiB
NASM

title "Byte Swap Functions"
;++
;
; Copyright (c) 1997 Microsoft Corporation
;
; Module Name:
;
; movemem.asm
;
; Abstract:
;
; This module implements functions to perform byte swapping operations.
;
;
; Author:
;
; Forrest Foltz (forrestf) 12-Dec-1997
;
; Environment:
;
; User or Kernel mode.
;
; Revision History:
;
;--
.486p
.xlist
include ks386.inc
include callconv.inc ; calling convention macros
.list
;
; Alignment for functions in this module
;
CODE_ALIGNMENT macro
align 16
endm
_TEXT$00 SEGMENT PARA PUBLIC 'CODE'
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
PAGE
SUBTTL "RtlUshortByteSwap"
;++
;
; USHORT
; RtlUshortByteSwap(
; IN USHORT Source
; )
;
; /*++
;
; Routine Description:
;
; The RtlfUshortByteSwap function exchanges bytes 0 and 1 of Source
; and returns the resulting USHORT.
;
; Arguments:
;
; (cx) Source - 16-bit value to byteswap.
;
; Return Value:
;
; Swapped 16-bit value.
;
;--
CODE_ALIGNMENT
cPublicFastCall RtlUshortByteSwap ,1
cPublicFpo 0, 0
mov ah, cl
mov al, ch
fstRET RtlUshortByteSwap
fstENDP RtlUshortByteSwap
PAGE
SUBTTL "RtlUlongByteSwap"
;++
;
; ULONG
; RtlUlongByteSwap(
; IN ULONG Source
; )
;
; /*++
;
; Routine Description:
;
; The RtlUlongByteSwap function exchanges byte pairs 0:3 and 1:2 of
; Source and returns the the resulting ULONG.
;
; Arguments:
;
; (ecx) Source - 32-bit value to byteswap.
;
; Return Value:
;
; Swapped 32-bit value.
;
;--
CODE_ALIGNMENT
cPublicFastCall RtlUlongByteSwap ,1
cPublicFpo 0, 0
mov eax, ecx
bswap eax
fstRET RtlUlongByteSwap
fstENDP RtlUlongByteSwap
PAGE
SUBTTL "RtlUlonglongByteSwap"
;++
;
; ULONG
; RtlUlonglongByteSwap(
; IN ULONGLONG Source
; )
;
; /*++
;
; Routine Description:
;
; The RtlUlonglongByteSwap function exchanges byte pairs 0:7, 1:6, 2:5,
; and 3:4 of Source and returns the resulting ULONGLONG.
;
; Arguments:
;
; (esp + 4) Source - Low half of 64-bit value to byteswap.
;
; (esp + 8) Source - High half of 64-bit value to byteswap.
;
; Return Value:
;
; Swapped 64-bit value.
;
;--
CODE_ALIGNMENT
cPublicFastCall RtlUlonglongByteSwap ,2
cPublicFpo 0, 0
mov edx, [esp + 8]
mov eax, [esp + 4]
bswap edx
bswap eax
mov ecx, eax
mov eax, edx
mov edx, ecx
fstRET RtlUlonglongByteSwap
fstENDP RtlUlonglongByteSwap
_TEXT$00 ends
end