メモリデータ比較中にハング
メモリデータ比較中にハング
A領域のデータとB領域のデータを先頭から比較するプログラムをアセンブラで組んでおります。
しかしかなりの頻度でプログラムがハングし、困っております。
ソースを眺めていても、どこが悪いのかわかりません。ハングの原因をうまく調べる方法はあるでしょうか?
動作環境:MS-DOS
アセンブラ:MASM32
MOV ECX, srcAddr;Aのメモリアドレス
PUSH ECX
POP ESI
MOV ECX, dstAddr;Bのメモリアドレス
PUSH ECX
POP EDI
MOV ECX, CmpByte;比較するバイト数(比較するのは100000Hexバイト)
XOR EAX, EAX
CALL ENTER_PROTECT;プロテクトモードに移行
CALL GET_SORC_SEL;SORC_SELのBASE AddressとLimitを変更
CALL GET_DEST_SEL;DEST_SELのBASE AddressとLimitを変更
; DWORD単位で比較するので2で割る
SHR ECX, 2
@@compare:
CLD ;CMPS*でのESI,EDIの変化を増加方向に
@@cmp4:
CMPSD DS:[ESI], ES:[EDI] ;4Byteずつ比較
jne @@err4
dec ECX
jnz @@cmp4
; 4で割った余り分のチェック
MOV ECX, CmpByte
AND ECX, 3
or ecx, ecx
jz @@exit
jmp @@cmp1
@@err4:
; 1Byteずつチェックしてコンペアエラーしたオフセットを割り出す
LEA ESI,[ESI-4] ; コンペアエラー前のオフセットに戻す
LEA EDI,[EDI-4]
shl ecx, 2
@@cmp1: ;1Byteずつ比較
CMPSB DS:[ESI], ES:[EDI]
jne @@exit
dec ECX
jnz @@cmp1
@@exit:
; コンペアしたByte数を計算(EAX <- CmpByte - ECX)
MOV EAX, CmpByte
SUB EAX, ECX
PUSH EAX
CALL FREE_SORC_SEL
CALL FREE_DEST_SEL
CALL LEAVE_PROTECT
POP AX
POP BX
MOV DX, BX
RET
_MemCmp2 ENDP