【问题标题】:NASM "register size specification ignored"NASM“忽略寄存器大小规范”
【发布时间】:2014-02-17 00:08:41
【问题描述】:

我试图用 NASM 组装一个文件,但它指向了文件中的这一行:

mov al, byte ptr es:[bx]

说:

error: comma, colon or end of line expected

我发现一个page on this site 说 NASM 不喜欢“ptr”这个词,如果我写的话会很高兴:

mov al, byte es:[bx]

相反。所以我把“ptr”这个词拿出来,NASM还是不高兴。当我省略“ptr”这个词时,这是 NASM 给我的:

warning: register size specification ignored

和:

error: invalid combination of opcode and operands

这是第 22 条陷阱!无论我是否输入“ptr”这个词,NASM 都很生气。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 我不使用 NASM 但尝试:mov al, [es:bx]mov al, byte [es:bx] ... 也有一段时间了,但 es:bx 可能不是有效的 x86 地址,尝试使用 di,@ 987654329@ 或 [es:di] ...
  • 为什么 es:bx 不是有效地址而 es:di 是?我可以将 bx 设置为我想要的任何值,我可以将 di 设置为我想要的任何值。
  • 这不是关于你可以设置什么——而是关于处理器可以执行什么......我认为它是有效的,尝试我建议的替代语法,看看是否有效。
  • es:bx 应该是一个有效的组合,但正如@GuySirton 提到的,段覆盖应该放在括号内(即mov al, byte [es:bx]
  • cx 不是 16 位代码寻址的有效基址/索引。请参阅英特尔软件开发人员手册第 2 卷第 2.1.5 节中的表 2.1。

标签: nasm


【解决方案1】:

我明白了! 如果我写的话,NASM 很高兴:

mov al,byte [es:bx]

就像 Guy Sirton 说的。如果我从指令中省略“字节”一词,就会发生这种情况。如果指令是这样的:

mov al, [es:bx]

NASM 可以看到我想要移动一个字节的地方,因为我将它存储在 al 中,它不会抱怨。但是,如果指令是这样的:

mov [es:bx],0xff

NASM 看不到我要存储多少内存的地方 0xff,它会给你这样的错误:

error: operation size not specified

了解这一点很重要,尤其是如果您使用的是this 教程,NASM 除了常规方式之外不会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    相关资源
    最近更新 更多