我刚刚开始倒车,我对以下代码的一部分感到有些困惑。我知道什么它做,从技术方面,但我真的不明白为什么它这样做。
这是我有疑问的部分。
seg005:292F test si, 1 ; ?
seg005:2933 jz short loc_21587
seg005:2935 movsb ; move byte DS:SI to ES:DI
seg005:2936 dec cx
为什么要检查 LSB 是否已设置,如果已设置,则在移动字符串的其余部分之前只移动一个字节?这和对齐有关系吗?这是我能想到的最好的解释。
整个功能如下。所有评论和名字都是我填写的。对它们或整个功能的任何其他注释/评论表示赞赏。谢谢。
seg005:290A
seg005:290A ; =============== S U B R O U T I N E =======================================
seg005:290A
seg005:290A ; Attributes: bp-based frame
seg005:290A
seg005:290A StringConcat proc far ; CODE XREF: sub_1FFED+16P
seg005:290A ; sub_1FFED+3AP ...
seg005:290A
seg005:290A Destination = word ptr 6
seg005:290A Source = word ptr 8
seg005:290A
seg005:290A push bp
seg005:290B mov bp, sp
seg005:290D push si ; save SI
seg005:290E push di ; save DI
seg005:290F cld ; clear direction flag.
seg005:2910 mov di, [bp+Destination]
seg005:2913 push ds ; move ds....
seg005:2914 pop es ; ...into es
seg005:2915 mov dx, di
seg005:2917 xor al, al ; al = search char. 0x0
seg005:2919 mov cx, 0FFFFh
seg005:291C repne scasb
seg005:291E lea si, [di-1] ; last char in string
seg005:2921 mov di, [bp+Source]
seg005:2924 mov cx, 0FFFFh
seg005:2927 repne scasb
seg005:2929 not cx ; length of string
seg005:292B sub di, cx ; move back to the start of the string?
seg005:292D xchg si, di ; si = start of source string.
seg005:292D ; di = end ofdestination string
seg005:292F test si, 1 ; ?
seg005:2933 jz short loc_21587
seg005:2935 movsb ; move byte DS:SI to ES:DI
seg005:2936 dec cx
seg005:2937
seg005:2937 loc_21587: ; CODE XREF: StringConcat+29j
seg005:2937 shr cx, 1 ; Divide cx by 2. Moving words, not bytes, so half the size
seg005:2939 rep movsw ; move words DS:SI to ES:DI CX times
seg005:293B jnb short loc_2158E
seg005:293D movsb
seg005:293E
seg005:293E loc_2158E: ; CODE XREF: StringConcat+31j
seg005:293E xchg ax, dx
seg005:293F pop di
seg005:2940 pop si
seg005:2941 pop bp
seg005:2942 retf
seg005:2942 StringConcat endp