Memory 使用nasm在32位保护模式下寻址内存数据
所以我的书上说我可以定义这样一个单词表: 表:dw“13,37,99,99” 通过将索引增加到表的地址,我可以从表中获取值,如下所示: 动产最大值[表+2];应该给我37 但它将0x2c33放置在ax中,而不是0x3337中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”。当我怀疑您不是
这是因为系统架构的不同吗?可能是因为这本书是为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