【问题标题】:Assembley procedure in pascal code?帕斯卡代码中的组装过程?
【发布时间】:2014-02-16 17:05:34
【问题描述】:

当我遇到这个过程时,我正在阅读 pascal 源代码:

  procedure Copier_Bytewise (const source, target; const Count: word);
  (* $ IFDEF VirtualPascal *)
  assembler; (* $ Uses ESI, EDI, ECX *) (* $ Frame-*)
  asm
    mov esi, source
    mov edi, target
    mov ecx, Count
    cld
    rep movsb
  end;
  (* $ ELSE *)
  .
  (* $ ENDIF *)

用这些参数调用这个过程:

Copier_Bytewise (Unpacked [WritePosition-Backwards], Unpacked [WritePosition], length);

那么,到底复制了什么?!

【问题讨论】:

  • movsb 将一个字节从源指针移动到目标(esi 到 edi,它们的内容指向什么)并递增每个字节。 rep 表示重复重复此指令 (movsb) ecx 的次数。这一切都记录在 x86 指令集手册中。

标签: assembly pascal


【解决方案1】:

源地址为内存地址:Unpacked [WritePosition-Backwards]

目的地址是内存地址:Unpacked [WritePosition]

复制的字节内容为:length

【讨论】:

  • 所以,如果每个元素都是一个字节,则此过程从数组中复制长度个数的元素,从“WritePosition-Backwards”开始偏移“WritePosition”?
  • 没错。元素大小为字节,因为 movsb 指令正在使用中。源/目标地址是Unpacked [xxx] 数组成员的内存地址。 (我们不知道Unpacked数组的类型。)
  • unpacked 听起来更像是一个修饰符,表示地址 xxx 可能未对齐
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多