【问题标题】:Assembly Question Regarding defining words using NASM关于使用 NASM 定义单词的装配问题
【发布时间】:2011-07-03 00:17:30
【问题描述】:

这是我的汇编程序的摘录

First: dw 0xaabbccdd

现在我意识到这在逻辑上是不正确的,我希望编译器要么吐出一个错误 (nasm),要么只创建两个并排的单词。

为什么这没有产生错误,为什么这只是截断了双字的前半部分?换句话说,在小端中,这会在内存中打印到更高的地址0xdd 0xcc。如果我写了First: dw 0xccdd,这将是有道理的,但不是因为我写的。在此先感谢:-)。

【问题讨论】:

  • 有趣,我在文档中也找不到任何关于此的内容。
  • 这真的不是问题,因为 NASM 会向您显示以下警告:> 警告:字数据超出范围

标签: assembly nasm


【解决方案1】:

汇编程序是正确的。 文字值是 32 位长,但转换为 dw 会将值截断为 16 个最低有效 位:0xaabbccdd 将被截断为 0xccdd。

Little-endian 格式意味着无论该值是 16 位还是 32 位,该值始终存储在 LSB 之前。所以...

  • 0xccdd 将作为0xdd 0xcc 存储在内存中
  • 0xaabbccdd 将作为0xdd 0xcc 0xbb 0xaa 存储在内存中

因此,如果值被截断没有区别 - 内存中的前两个字节是相同的。

正如 André Laszlo 指出的那样,NASM 会针对这种情况生成警告。

【讨论】:

    猜你喜欢
    • 2011-07-09
    • 2011-01-15
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多