【问题标题】:Why can't we MOV a value of A000H or higher into a 16-bit register? [duplicate]为什么我们不能将 A000H 或更高的值移动到 16 位寄存器中? [复制]
【发布时间】:2020-09-07 02:46:14
【问题描述】:

我尝试了最基本的指令“mov ax,B006H”并收到错误消息

【问题讨论】:

  • 我假设 A000H 不起作用,并且您的意思是大于或等于 A000h 的 16 位值。规则是,如果您使用h 后缀来表示十六进制数,并且值以 A、B、C、D、E、F 开头,则十六进制数必须以 0 开头。基本上,如果您有一个 Hex以字母开头的数字(并使用 h 后缀),您必须在开头添加 0。
  • 它不仅仅适用于 16 位数字。对于最高位为 Ato F 的情况,如果不在开头添加额外的 0,汇编程序将无法知道 mov al, ch 是否意味着将寄存器 CH 移动到 AL 或者您是否意味着将十六进制值 c(十进制的 12 ) 到 AL。为此,您必须写 mov al, 0ch
  • 错误信息告诉你到底是什么问题。

标签: assembly hex emu8086


【解决方案1】:

十六进制数字必须以 十进制 数字开头。这就是为什么这么多十六进制常量以前导零开头的原因。

这将起作用:

mov ax, 0b006h

【讨论】:

  • mov ax, 0b006h 也有效 mov ax, 0xb006h 也有效。
  • even 是什么意思?哦,您的意思不是“偶数”(如可被 2 整除)。为了清楚起见,我会打出even这个词
  • @Basilisk 如果您使用 0x 前缀,请不要将 h 放在末尾。尽管 EMU8086 支持包括 MASM/TASM 在内的大多数其他汇编器都会报错。使用0x 前缀或h 后缀,但不能同时使用。
  • @MichaelPetch:这意味着要让汇编程序将标记识别为数字文字,它必须以数字开头,但对于十六进制数字,它必须是 even十进制数字,而不是任何十六进制数字。我想我第一次阅读时是这样在心理上解析它的,但是在看到您的评论后,我的大脑花了几秒钟才再次正确解析它。 :P
  • @PeterCordes :是的,在我的评论中建议他们考虑使用 even 来表达清楚。
【解决方案2】:
mov ax,0B006H

解析器很挑剔

【讨论】:

  • 这是 10 秒之前的旧答案。
  • 较旧,但关于解析器为何如此挑剔的细节略少。在您的回答中,读者需要弄清楚为什么这里需要前导 0。 (如果您考虑如何编写解析器/符号名称的歧义,则很明显,但并非每个人都会轻易提出这种推理。)
  • @PeterCordes:我不知道为什么,因为我使用的汇编程序无法处理那里的符号名称,而只能处理 [symbolname],所以我认为解析器无缘无故地挑剔。
  • 我很好奇你用的是什么汇编器;在英特尔语法的两种主要风格(NASM 和 MASM)中,mov ax, symbol 都是有效的。在 NASM 中,它是地址的 mov-immediate。在类似 MASM 的汇编器中,它是从符号地址加载的,与 mov ax, [symbol] 相同
  • @PeterCordes:在获得真正的汇编程序之前,我学习了 Borland C++ 的 asm {} 块。
猜你喜欢
  • 2021-07-20
  • 2021-01-16
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 2018-03-31
  • 2021-11-26
相关资源
最近更新 更多