【问题标题】:Inline Assembler: Invalid reference syntax内联汇编程序:无效的引用语法
【发布时间】:2021-12-01 14:57:25
【问题描述】:

两天前我收到Free Pascal Compiler 2.2.0的以下错误:

Error: Invalid reference syntax

史前史:

我想为“i386-linux”平台编译一个包含一些汇编指令的 pascal 源代码

procedure drawpixel(x,y,color: word); assembler;
asm
  mov ax, y
  mov bx, x
  mov dl, color

  mov cx, 320
  mul cx
  add ax, bx
  mov di, ax
  mov [es:di], dl /// Right at [es:di] the inline assembler gives this annoying exception
  ret
end;

请有人帮助我。

【问题讨论】:

  • 嗯,你是在linux中吗?此代码用于 16 位实模式,即使您将其组装也无法在 linux 中运行。 (事实上​​,它甚至无法在实模式下工作,因为未设置 es。)
  • mul cx之后,DX寄存器为0。mov [es:di], dl指令不会显示颜色!请记住,DLDX 的一部分。改变这个:mov cx, colormov dx, 320mul dxadd bx, axmov [es:bx], cl
  • 可能是你的汇编器上的语法是mov es:[di], dl
  • @SepRoland:或者由于目标平台是“i386-linux”,imul bx, y, 320/add bx, x,如果您仍然想使用 16 位操作数大小。 (或者用 LEA 乘以 5,用移位乘以 64,320 = 5 * 64)。但是,是的,用 mul 覆盖 DL 是一个错误。

标签: assembly pascal freepascal i386


【解决方案1】:

正如评论员已经指出的那样,这是 16 位汇编程序,如果不修改 32 位将无法工作。

除了将 16 位寄存器用于间接目标 ([di]) 很奇怪之外,32 位应用程序中的 ES 段与 DS 段相同,因此可能不是您想要的(我认为应该是这样的)是一些 mode-X 屏幕缓冲区),但会将其撞到应用程序内存的前 64kb 中的某个位置,这至少可以部分防止写入以捕获零指针引用。

您需要重新考虑这一点,在 Linux 中无法像在 dos 中那样访问图形屏幕。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 2014-06-19
    • 2016-05-19
    • 2021-09-05
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多