内嵌汇编编译问题Inline assembler syntax error

ghao0 2003-04-18 10:22:17
在 获取CPU序列号和硬盘序列号 中

[Error] GetCUPandHDserial.dpr(191): Inline assembler syntax error

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 //停在此处
inc ecx
cmp ecx,256
jne @3

iretd //中断返回
end;
...全文
432 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghao0 2003-04-18
  • 打赏
  • 举报
回复
您要所有的源码吗?
ghao0 2003-04-18
  • 打赏
  • 举报
回复
var
IDTR: LONGDWORD;
SavedGate:TGate;
OurGate: TGate;
dd: array [0..256] of word;
dsn:array [0..20] of char; //存放硬盘序列号

{$R *.res}
ghao0 2003-04-18
  • 打赏
  • 举报
回复
您说源程序有错?
源程序是我从别人处得的,我未改过,同时有一个编译好的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;
cwq 2003-04-18
  • 打赏
  • 举报
回复
有好多年不高汇编了,如果有不对的地方请指正
cwq 2003-04-18
  • 打赏
  • 举报
回复
如果你定义了这样的变量的话,请将他也铁出来
cwq 2003-04-18
  • 打赏
  • 举报
回复
dd这样的变量定义也没有
cwq 2003-04-18
  • 打赏
  • 举报
回复
呵呵,我看了你的调用,也许有如下问题:
1。你的mov word ptr dd[ecx*2],ax 语法由问题 不存在dd这样的通用寄存器或段寄存器
2.在改动时,要注意地址格是要相同
ghao0 2003-04-18
  • 打赏
  • 举报
回复
无人答,是分太少,还是无人会,无人看,无聊?...
上来几天,我问了3个问题,无一问题得到解答,因此无分了(1:100+100,2:20,3:40)
还有几十分(得的)给能回答问题的人

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧