当内存“包裹”在IA-32支持机器上时会发生什么?

时间:2014-06-18 13:47:05

标签: memory ia-32

我正在创建一个64位的IA-32模型,并将内存表示为基于0的2**64字节数组(我使用的语言{{1}作为指数运算符)。这意味着数组中的有效索引是从**0。现在,为了模拟访问该存储器的可能模式,可以将一个元素视为8位数,将两个元素视为(小端)16位数等等。

我的问题是,如果他们要求位置2**64-1的16位(或32位等)数字,我的模型应该怎么做?现在,模型所做的就是说返回的值是2**64-1。我没有更新任何标志(感觉不对)。像这样包装是正确的行为吗?包裹发生时我应该设置任何标志吗?

我有一份英特尔-64-ia-32-ISA.pdf的副本,我将其用作参考,但它的1,479页,我很难找到这个特定问题的答案。

2 个答案:

答案 0 :(得分:2)

答案在第3A卷第5.3节:"限制检查。"

对于ia-32:

  

当有效限制为FFFFFFFFH(4 GBytes)时,这些访问[延伸超出段的末尾]可能会也可能不会导致指示的异常。行为是特定于实现的,可能因执行而异。

对于ia-64:

  

在64位模式下,处理器不对代码或数据段执行朗姆限制检查。但是,处理器确实检查了描述符表限制。

答案 1 :(得分:1)

我使用此代码对64位数字进行了测试(有人期望吗?)

mov dword [0], 0xDEADBEEF
mov dword [-4], 0x01020304
mov rdi, [-4]
call writelonghex

在自定义操作系统中,根据需要映射页面,在VirtualBox中运行。 writelonghex只是将rdi写为16位十六进制数字。结果:deadbeef01020304

所以是的,它只是包装。没有什么好笑的。

没有标志应该受到影响(虽然手册没有说不应该为地址包装设置标志,但它确实说mov reg, [mem]不会影响它们永远,并且包括这种情况),没有中断/陷阱/无论发生什么(除非当然没有触及一页或两页)。