- 论坛徽章:
- 0
|
原帖由 020794 于 2009-10-19 16:51 发表 ![]()
在32bit x86平台,mov ax, [1]具体是怎么处理的?
1. 因为地址为ds:1的word,跨越了word边界,那么其处理方式会不会是:读两次内存,分别把ds:0和ds:2处的word读出来,然后取ds:0的后半部和ds:1的前半部合成 ...
对于以前的 x86 处理器来说:
32 位的地址线,processor 提供的物理接口只有 30 条线,分别是 A31 ~ A2,即:Address[31:2],地址线 A0 和 A1 被强制为 0
也就是说只有:00000000h、00000004h、00000008 ~ 依次到 FFFFFFC0h,从而形成了 dword 边界
processor 提供 32 位的数据线,分 4 组分别是:D0[7:0]、 D1[15:8]、 D2[23:16] 和 D3[31:24]
同时 processor 提供了4个字节使能线(Byte Enable),分别是:BE0#、BE1#、BE2# 和 BE3#
这 4 个 Byte Eable 信号用来控制访问相应的 bytes,
BE0# -----> D0[7:0]
BE1# -----> D1[15:8]
BE2# -----> D2[23:16]
BE3# -----> D3[31:24]
以你说的这条指令 mov ax, [0001h] 为例:它访问 2 个 bytes
processor 将地址 0000h 送上地址线,同时使 BE0# = 1, BE1# = 0, BE2# = 0,BE3# = 1
从而使数据送到 D1 和 D2 ,这样来访问 word
2、如果指令 mov ax, [0003h]
则是跨 dword 边界,需要做两次读内存
(1) 读 0000h 地址的 D3[31:24] 使 BE3# = 0, BE2# = BE1# = BE1# =1
(2) 读 0004h 地址的 D0[7:0] 使 BE0# = 0, BE1# = BE2# = BE3# =1 |
|