📄 compare.asm
字号:
;
; GRDB
;
; Copyright(c) LADsoft
;
; David Lindauer, camille@bluegrass.net
;
;
; COMPARE.ASM
;
; Function: compare memory regions
;
;MASM MODE
.MODEL SMALL
.386
include eprints.inc
include einput.inc
include emtrap.inc
include eoptions.inc
PUBLIC compare
PUBLIC paddr
.CODE
;Set DS if valid address provided in input
; INPUT: SI points to input to parse
; OUTPUT: DX contains segment address to use
; CY if
cra PROC
call ReadAddress ; read source address
jc crax ; none found
test [optdwordcommand],1 ;see if flat real mode
jnz nomvz ;if set, no zero extend
movzx ebx,bx ;else extend
nomvz:
call defDS ; get data seg
crax:
ret
cra ENDP
;INPUT: AL has byte (two hex chars) to print
pbyte PROC
call PrintByte
call printspace
ret
pbyte ENDP
;INPUT: EDX has segment address
; EAX has offset address
;If flat real mode, print 32-bit offset, else print 16-bit offset
paddr PROC
xchg eax,edx ;now EDX=offset, EAX=segment
call printword ;display segment
xchg edx,ebx ;store offset in EBX
mov dl,':' ;putchar wants char in DL
call putchar ;print colon
mov eax,ebx ;put offset in EAX
test [optdwordcommand],1 ;printing 32-bit offsets?
jnz pdw ;if so, do that
call printword ;else just 16 bits
call printspace
ret
pdw:
call printdword ;print 32-bit offset
call printspace
ret
paddr ENDP
;
; compare command
; syntax is c start,end,start2
;
compare PROC
call WadeSpace ;find source address
jz errx ;not found (end of input)
call cra ;start seg in DX, offset in EBX
jc errx ;not found
push dx ;save segment
push ebx ;and starting offset
call WadeSpace ;see if any more
jz errx2 ;nope, didn't find
call ReadNumber ; read ending offset
jc errx2 ;not found
mov ecx,eax ;get ending offset into ECX
sub ecx,ebx ;subtract starting offset
jb errx2 ;error if end < start
call WadeSpace ;else keep reading input
jz errx2 ;need a destination
call cra ; read dest seg and ofs
jc errx2 ;not found
call WadeSpace ;make sure no more
jnz errx2 ;if more, syntax error
test [optdwordcommand],1 ;flat real mode?
jnz gotsz ;fine if so
movzx ebx,bx ;else zero extend dest offset
movzx ecx,cx ;and length to compare
movzx eax,word ptr [esp] ;and starting offset (on stack)
mov [esp],eax
gotsz:
pop esi ;get start ofs from stack to ESI
mov edi,ebx ;and ending offset to EDI
push dx ;save segment
clp:
push ds ;save current DS
push es ;and ES
mov ds,[esp+6] ;pushed as DX just before clp:
mov es,[esp+4] ;pushed as DX on line 5 of routine
db 67h ;dword override on operand
repe cmpsb ;cmp ds:[esi] with es:[edi]
mov al,ds:[esi-1] ;differing byte from source in AL
mov ah,es:[edi-1] ;and dest in AH
pop es ;back to our ds
pop ds ;and ES
jz cdone ;no difference in this case
mov dx,[esp+2] ;now dest segment into DX
push ax ;save differing bytes
call crlf ;new line
mov eax,esi ;location where different
dec eax ;minus cmpsb moved ESI past it
call paddr ;show ESI where different
pop ax ;restore differing bytes
push ax ;and save them again
call pbyte ;show source byte
pop ax ;get them back
mov al,ah ;setup dest byte
call pbyte ;and show that
mov eax,edi ;get dest offset
mov dx,[esp] ;and dest segment still on stack
dec eax ;minus correction for cmps
call paddr ;show dest seg:ofs
jmp clp ;find next difference
cdone:
add sp,4
clc ; to clean up stack
ret
errx2:
add sp,6
errx:
stc
ret
compare endp
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -