使用nasm以32位保护模式寻址存储器数据

时间:2011-05-24 04:46:14

标签: memory nasm

所以我的书说我可以定义一个像这样的单词表:

表:dw“13,37,99,99”

并且我可以通过将索引增加到表的地址来从表中抢夺值,如下所示:

mov ax,[table + 2];应该给我37

但是它将0x2c33放在ax而不是0x3337

这是因为系统架构的差异?也许是因为这本书适用于386,我正在运行686?

2 个答案:

答案 0 :(得分:1)

0x2C是逗号,,0x33是字符3,它们出现在字符串中的第2和第3位,正如预期的那样。 (我对你的期望感到有些困惑,因为你先说“应该给我37”,然后说“而不是0x3337”。)

答案 1 :(得分:0)

当我怀疑你不是故意的时候,你已经定义了一个字符串常量。以下内容:

dw "13,37,99,99"

将产生以下输出:

Offset    00 01 02 03 04 05 06 07 08 09 0A 0B
          31 33 2C 33 37 2C 39 39 2C 39 39 00

为什么呢?这是因为:

  • 31是'1'
  • 的ASCII码
  • 33是'3'
  • 的ASCII码
  • 2C是','
  • 的ASCII代码
  • ...
  • 39是'9'
  • 的ASCII代码
  • NASM也通过在末尾加上0字节来终止你的字符串(如果你不希望你的字符串被空终止,而是使用单引号,'13,37,99,99'

考虑到ax包含两个字节,并且应该非常清楚ax包含0x2C33的原因。

我怀疑你想要的更多是这一点(没有引号我们使用db表示我们正在声明字节大小的数据,而不是dw声明字大小的数据):

db 13,37,99,99

这仍然会给你0x6363ax保存两个字节/转换99,99到十六进制)。不知道你从哪里获得0x3337

我建议您自己安装一个hex editor并进行实验,检查NASM的输出。