在 获取CPU序列号和硬盘序列号 中[Error] GetCUPandHDserial.dpr(191): Inline assembler syntax errorprocedure Ring0Proc;
asm
  // Wait for controller not busy
  mov dx,01f7h
  @1:in al,dx
  cmp al,050h
  jne @1  // Get first/second drive
  dec dx
  mov al,0a0h
  out dx,al  // Get drive info data
  inc dx
  mov al,0ech
  out dx,al
  nop
  nop  // Wait for data ready
  @2:in al,dx
  cmp al,058h
  jne @2
  nop
  nop
  // Read sector
  xor ecx,ecx
  mov dx,01f0h
  @3:in ax,dx
  mov word ptr dd[ecx*2],ax //停在此处
  inc ecx
  cmp ecx,256
  jne @3  iretd //中断返回
end;

解决方案 »

  1.   

    呵呵,我看了你的调用,也许有如下问题:
    1。你的mov word ptr dd[ecx*2],ax 语法由问题 不存在dd这样的通用寄存器或段寄存器
    2.在改动时,要注意地址格是要相同
      

  2.   

    您说源程序有错?
    源程序是我从别人处得的,我未改过,同时有一个编译好的dll,他不可能再把程序改错吧
    还有2处同样的错
    procedure Ring0Proc;
    asm
      // Wait for controller not busy
      mov dx,01f7h
      @1:in al,dx
      cmp al,050h
      jne @1  // Get first/second drive
      dec dx
      mov al,0a0h
      out dx,al  // Get drive info data
      inc dx
      mov al,0ech
      out dx,al
      nop
      nop  // Wait for data ready
      @2:in al,dx
      cmp al,058h
      jne @2
      nop
      nop
      // Read sector
      xor ecx,ecx
      mov dx,01f0h
      @3:in ax,dx
      mov word ptr dd[ecx*2],ax //----------------------err1
      inc ecx
      cmp ecx,256
      jne @3  iretd //中断返回
    end;procedure Change2Ring0;
    begin
      asm
        mov eax, offset Ring0Proc
        mov OurGate.off2, ax // 将 中 断 函 数 的 地 址
        shr eax, 16 // 填 入 新 造 的 中 断 门
        mov OurGate.off1, ax // 描 述 符
        mov OurGate.op,0028h
        mov OurGate.seg,0ee00h//----------------------err2
        mov ebx,offset IDTR
        sidt [ebx]
        // 将 中 断 描 述 符 表 寄 存 器(IDTR)的 内 容 取 出
        mov ebx, dword ptr [IDTR+2]
        // 取 出 中 断 描 述 符 表(IDT) 基 地 址
        add ebx, 8*3
        // 计 算Int 3 的 描 述 符 应 放 置 的 地 址 选 用
        //Int3 是 因 为 它 在Win32 保 护 模 式 下 未 占 用
        mov edi, offset SavedGate
        mov esi, ebx
        movsd // 保 存 原 来 的Int 9 描 述 符 到
        movsd //SavedGate 以 便 恢 复    mov edi, ebx
        mov esi, offset OurGate
        cli
        movsd // 替 换 原 来 的 中 断 门 描 述 符
        movsd // 以 安 装 中 断 服 务 例 程
        sti
        mov eax,6200h
        // 用 以 测 试 放 在EAX 中 的 数 据 能 否 正 确 传 到Ring0 中 断
        mov ecx,0
        // 用 以 测 试 放 在ECX 中 的 数 据
        // 能 否 正 确 传 到Ring0 中 断
        // 因 为 很 多VxD 服 务 都 用此二 寄 存 器 传 递 参 数
        int 3h
        // 人 为 触 发 中 断, 平 时 会 出 现保 护 错 误 蓝 屏 或 非 法 操
        // 作 对 话 框, 现 在 安 装 了
        // 中 断 服 务 例 程 后, 就 会 通 过
        //VMM 在Ring0 调 用 中 断 服 务 例 程Ring0Proc
        mov edi, ebx
        mov esi, offset SavedGate
        cli
        movsd // 恢 复 原 来 的 中 断 门 描 述 符
        movsd
        sti
      end;  asm
        xor ecx,ecx
        mov ebx,offset dd[10*2]//----------------------err3
        @4:mov ax,[ebx]
        mov byte ptr dsn[ecx],ah
        inc ecx
        mov byte ptr dsn[ecx],al
        inc ebx
        inc ebx
        inc ecx
        cmp ecx,20
        jne @4
      end;end;
      

  3.   

    var
      IDTR: LONGDWORD;
      SavedGate:TGate;
      OurGate: TGate;
      dd: array [0..256] of word;
      dsn:array [0..20] of char; //存放硬盘序列号{$R *.res}