Memory 使用nasm在32位保护模式下寻址内存数据

Memory 使用nasm在32位保护模式下寻址内存数据,memory,nasm,Memory,Nasm,所以我的书上说我可以定义这样一个单词表: 表:dw“13,37,99,99” 通过将索引增加到表的地址,我可以从表中获取值,如下所示: 动产最大值[表+2];应该给我37 但它将0x2c33放置在ax中,而不是0x3337中 这是因为系统架构的不同吗?可能是因为这本书是为386编写的,而我正在运行686?0x2C是一个逗号,,0x33是字符3,它们出现在字符串中的位置2和3处,正如预期的那样。(我有点搞不清楚您期望的是什么,因为您先说“应该给我37”,然后说“而不是0x3337”。当我怀疑您不是

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

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

通过将索引增加到表的地址,我可以从表中获取值,如下所示:

动产最大值[表+2];应该给我37

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


这是因为系统架构的不同吗?可能是因为这本书是为386编写的,而我正在运行686?

0x2C是一个逗号
,0x33是字符
3
,它们出现在字符串中的位置2和3处,正如预期的那样。(我有点搞不清楚您期望的是什么,因为您先说“应该给我37”,然后说“而不是0x3337”。

当我怀疑您不是有意的时候,您定义了一个字符串常量。以下是:

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字节放在末尾来终止字符串(如果不希望字符串以null结尾,请使用单引号,
    '13,37,99,99'
考虑到
ax
包含两个字节,应该很清楚为什么
ax
包含
0x2C33

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

这仍然会给您提供
0x6363
ax
保存两个字节/99、99到十六进制的转换)。不确定从何处获得
0x3337

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

db 13,37,99,99