Programming Examples

2. Copying a String

2. Copying a String

This example contains a section of assembly code that moves a byte string of arbitrary length to an arbitrary byte address.

;The routine reflect copies bytes from the source location

;to the destination location.

;

;The first parameter is the source address and the second

;parameter is the destination address.

;

;The third parameter is the number of bytes to copy.

;For performance, larger chunks of bytes are handled differently.

.CODE

.EXPORT reflect,ENTRY

reflect

 

 

.PROC

 

 

.CALLINFO

ENTRY_GR=6,SAVE_RP

 

.ENTER

 

 

COMB,=,N

%arg2,%r0,fallout

; done, count is zero

COMB,<,N

%arg2,%r0,choke

; caller error, neg count

OR

%arg0,%arg1,%r6

; source and dest

OR

%r6,%arg2,%r6

; count

EXTRU,=

%r6,31,2,%r0

; 2 low order bits = 0?

B,N

onebyte

; yes, skip this branch

ADDIBT,<,N

-16,%arg2,chekchunk

; no, skip chunkify if count<0

chunkify

 

 

LDWM

16(%arg0),%r6

; word 1- > temp1

 

 

; point ahead 4 words in source

LDW

-12(%arg0),%r5

; place mark 3 wds back- >temp2

LDW

-8(%arg0),%r4

; place mark 2 wds back- >temp3

LDW

-4(%arg0),%r3

; place mark 1 wds back- >temp4

STW

%r5,4(%arg1)

; dest wd 2 <-temp2

STWM

%r6,16(%arg1)

; dest wd 1 <-temp1

 

 

; point ahead 4 words in dest

STW

%r4,-8(%arg1)

; dest wd 3 <-temp3

ADDIBF,<

-16,%arg2,chunkify

; loop if count > 0

STW

%r3,-4(%arg1)

; dest wd 2 <-temp1

chekchunk

 

 

ADDIBT,<

12,%arg2,exeunt

; go if count < -12

COPY

%r0,%ret0

; clear rtnval

subchunk

 

 

LDWS,MA

4(%arg0),%r6

; word- >temp1

 

 

; point ahead 4 bytes in source

ADDIBF,<

-4,%arg2,subchunk

; go if count<4

STWS,MA

%r6,4(%arg1)

; dest< -temp1

 

 

; point ahead 4 bytes in dest

132

Chapter 7