procedure       Move( const Source; var Dest; count : Integer );
var
  S, D: PChar;
  I: Integer;
begin
  S := PChar(@Source);
  D := PChar(@Dest);
  if S = D then Exit;
  if Cardinal(D) > Cardinal(S) then
    for I := count-1 downto 0 do
      D[I] := S[I]
  else
    for I := 0 to count-1 do
      D[I] := S[I];
end;=========================================================================================
1> Source , Dest 被定义为什么类型?根据下面程序分析可知是一个字符串型,但为什么省略了String?
2> 在进行字符的传送时,为什么要判断源串与目标串的地址空间大小的问题,对于串指针,是指向首字
符的,不会指向尾字符,更不用逆序传字符。还请delphi高人指点。

解决方案 »

  1.   

    Source , Dest 是不定类型
      

  2.   

    你说的不定类型可以把它理解成两个地址吗。是不是在函数内部强制将两个地址所指向的内存空间申明为字符型,准备进行字符的copy
      

  3.   

    下面是它的汇编代码实现,从逆序中可以看到 STD 指令      PUSH    ESI
            PUSH    EDI        MOV     ESI,EAX
            MOV     EDI,EDX        MOV     EAX,ECX        CMP     EDI,ESI
            JA      @@down
            JE      @@exit        SAR     ECX,2           { copy count DIV 4 dwords       }
            JS      @@exit        REP     MOVSD        MOV     ECX,EAX
            AND     ECX,03H
            REP     MOVSB           { copy count MOD 4 bytes        }
            JMP     @@exit@@down:
            LEA     ESI,[ESI+ECX-4] { point ESI to last dword of source     }
            LEA     EDI,[EDI+ECX-4] { point EDI to last dword of dest       }        SAR     ECX,2           { copy count DIV 4 dwords       }
            JS      @@exit
            STD
            REP     MOVSD        MOV     ECX,EAX
            AND     ECX,03H         { copy count MOD 4 bytes        }
            ADD     ESI,4-1         { point to last byte of rest    }
            ADD     EDI,4-1
            REP     MOVSB
            CLD
    @@exit:
            POP     EDI
            POP     ESI
      

  4.   

    有STD指令是因为要考虑到内存重叠的问题,我之前也有类似疑问,你可以参考一下:http://topic.csdn.net/u/20100920/10/25ebc49e-3c19-4f8b-ae7e-5018daf963e4.html
      

  5.   

    问题几乎是一样,哈哈。感谢Jekhn
      

  6.   

    我来尝试解释一下。Cardinal(D) 和 Cardinal(S) 是什么?
    是指针地址。
    不要以为这样做是为了判断同一个字串的覆盖方式。
    其实,是内存地址才是真实考虑的东西。
    如果,你连续分配了2个变量A,B。
    那么,简单可以理解成,内存中 A 后面紧接着就是 B。
    而Cardinal(A) 小于 Cardinal(B)。
    for 循环里,是用 downto 还是用 to ,这时候就明白了吧?