我刚开始倒车,对以下代码的一部分感到有些困惑。
从技术方面,我知道它在做什么,但是我真的不明白为什么要这样做。 >
这是我有疑问的部分。

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