.data TMP1 DWORD 0 DataArray BYTE 1000 DUP(0) ; we assume that max packet size = 1000 .code MOV EBX, 0 ; Initialize EBX to 0 First: CALL GetHDLCData ; Get a 32-bit stream from MOV ECX, 32 ; the channel; Init ECX to 32 MOV TMP1, EAX ; Store stream in TMP1 MOV EAX, EBX ; move saved data to EAX MOV EBX, TMP1 ; move new stream to EBX Again: CMP AL, 7Eh ; check for flag JE StartOfPacket SHLD EAX, EBX, 1 ; shift left into EAX SHL EBX, 1 ; shift EBX LOOP Again ; Compare again MOV EBX, EAX ; Not found save EAX into EBX JMP First ; get new stream StartOfPacket: MOV EDX, 32 SUB EDX, ECX ; shift = 32 – ECX AND EDX, 07h ; modulo 8 and saved into EDX MOV ESI, 0 ; initialize index to 0 CMP ECX, 8 ; at least one byte left? JL NextStream NextByte: SHLD EAX, EBX, 8 ; get next byte SHL EBX, 8 ; shift EBX to maintain consistency EndYet: CMP AL, 7Eh ; End Of Packet ? JE EndOfPacket MOV DataArray[ESI], AL ; save byte INC ESI ; index++ SUB ECX, 8 ; -1 byte CMP ECX, 8 ; at least one byte left? JGE NextByte ; yes, save byte NextStream: SHLD EAX, EBX, CL ; no, save remaining bits MOV EBX, EAX ; save into EBX CALL GetHDLCData ; get new stream MOV ECX, EAX ; save new stream into ECX MOV EAX, EBX ; restore left bits into EAX MOV EBX, ECX ; move new stream into EBX MOV ECX, EDX ; bits to save SHLD EAX, EBX, CL ; shift by few bits to make a ; byte ; we have 32 new bits + (8 - EDX) old bits MOV ECX, 40 ; 32 fresh bits + 8 old/new bits SUB ECX, EDX ; take away already shifted bits JMP EndYet ; check for end of packet EndOfPacket: Exit