从技术方面,我知道它在做什么,但是我真的不明白为什么要这样做。 >
这是我有疑问的部分。
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
#1 楼
这是次要的速度优化。移动字符的主循环使用movsw
(移动字),它可能比移动字节快一点。但是,如果字节数为奇数,则一个字节将不被复制,这就是为什么在其前后有一个额外的mosvb
(因此,根据字节地址的对齐方式,在此之前或之后移动额外的字节)。
评论
从未对齐的源地址进行复制会降低性能,因此需要首先对其进行对齐
–彼得·弗里
16年5月23日在19:31