めげずに、PBR
seg000:015B mov es, di seg000:015D seg000:015D loc_7D5D: ; CODE XREF: seg000:0159^Xj seg000:015D cmp word ptr [bp+44h], 0FFFh seg000:0162 jnz short loc_7D76 seg000:0164 add bx, ax seg000:0166 shr bx, 1 seg000:0168 mov bx, es:[bx] seg000:016B jnb short loc_7D71 seg000:016D mov cl, 4 seg000:016F shr bx, cl seg000:0171 seg000:0171 loc_7D71: ; CODE XREF: seg000:016B^Xj seg000:0171 and bh, 0Fh seg000:0174 jmp short loc_7D79 seg000:0176 loc_7D76: ; CODE XREF: seg000:0162^Xj seg000:0176 mov bx, es:[bx] seg000:0179
ESレジスタにDIレジスタの内容を転送。
[BP+44h]の内容と即値:0FFFhとを比較。
一致しなければ、loc_7D76へジャンプ。
BXレジスタの内容にAXレジスタの内容を加算。
BXレジスタの内容を1ビット右シフト。
BXレジスタにES:[BX]の内容を転送。
JNB=JNCだから、キャリーフラグがオフなら、loc_7D71へジャンプ。
BXレジスタの内容を4ビット右シフト。
BHレジスタの内容と即値:0Fhとの論理積を求める。上位4ビットクリア。
loc_7D79に無条件ジャンプ。
BXレジスタにES:[BX]の内容を転送。
seg000:0179 loc_7D79: ; CODE XREF: seg000:0174^Xj seg000:0179 pop es seg000:017A popf seg000:017B ja short loc_7D30 seg000:017D mov dl, [bp+24h] seg000:0180 jmp dword ptr [bp+40h]
ESレジスタ、復元。
フラグレジスタ、復元。
小さければ、loc_7D30へジャンプ。
DLレジスタに[BP+24h]の内容を転送。
[BP+40h]に格納されているポインタ先へ far ジャンプ。
う〜ん。
途中から、完全に迷子になってしまった気がする...
たった 500Byte 弱のコードでも、アセンブラソースだけだと、正直、しんどい。
もう一度、読み直して、整理しないとダメだな、こりゃ。