从本质上讲,4Gb如何变成4GB?如果内存是寻址字节,那么可能性不是2 (32/8)?
在http://en.wikipedia.org/wiki/Addressing_mode中
索引绝对
Run Code Online (Sandbox Code Playgroud)+------+-----+-----+--------------------------------+ | load | reg |index| address | +------+-----+-----+--------------------------------+(有效地址=地址+指定索引寄存器的内容)
请注意,这与基本加偏移量寻址模式大致相同,只是在这种情况下偏移量足以解决任何内存位置.
我还是不明白偏移和索引之间有什么区别?基本加偏移寻址模式和索引绝对寻址模式之间的区别?
谢谢.
假设我有一个Data.Array.IO.IOArray i e(来自array包),我想从中读取元素,根据一些索引顺序在 IO 中一个一个地处理每个元素:
arr :: IOArray I E
ordering :: [I]
processElement :: I -> E -> IO ()
Run Code Online (Sandbox Code Playgroud)
(正如我们所见,一切都是单态的)。
有两种明显的方法可以做到这一点:
freeze首先将数组放入不可变数组中,然后使用!运算符:
do
arr' <- freeze arr
forM_ ordering $ \i -> processElement i (arr' ! i)
Run Code Online (Sandbox Code Playgroud)
readArray'ing 原始可变数组中的每个元素:
forM_ ordering $ \i -> do
e <- readArray arr i
processElement i e
Run Code Online (Sandbox Code Playgroud)
中的索引ordering是“密集”的,因为大多数索引arr出现在 中ordering。
哪一种更有效率?此外,答案是否取决于以下因素:
ordering有重复索引?ordering是否单调递增?我的问题是:当我有这样的事情时:
lea rax, rbp - 8
Run Code Online (Sandbox Code Playgroud)
//也许这是我的堆栈上的一个int,因为我的代码中有一个本地"int"变量.当我这样做时,CPU如何知道数据的位置:
mov qword [rax], 14
Run Code Online (Sandbox Code Playgroud)
我的意思是,这只是一个地址......如果我保留记忆2^64 - x怎么办?
不能分配的内存有这种地址吗?
或者如果堆栈增长直到它与您分配的内存具有相同的地址呢?
那会发生吗?
汇编程序不知道rax中的数字是什么,所以它不能是MOVstack和MOVheap,就像远近的JMP一样.
我正在关注Jack Crenshaw的编译器教程(如果你看一下我的个人资料,这就是我所有的问题都是关于大声笑的)并且它刚刚到了引入变量的地步.他评论说68k要求所有东西都是"与位置无关"的,这意味着它是"PC相对的".我得到的PC是程序计数器,在x86上它是EIP.但他使用的语法就像MOVE X(PC),D0X是一个变量名.我已经阅读了一点,之前没有说明在.data中声明一个变量.这是如何运作的?为了在x86中工作,我将用什么替换X(PC)MOV EAX, X(PC)?
说实话,我甚至不确定这是否应该输出正常工作的代码,但到目前为止它已经和我已经添加了代码到我的编译器,添加了相应的标题等和批处理文件来汇编,链接和运行结果.
如果该位为零,那么存储器是逐字节寻址的?如果它是1,那么内存是通过4Kb寻址4Kb的?
因此,例如,如果将该位设置为0,并且我寻址了内存位置a000h,那么我将在该位置寻址该字节吗?如果我寻址下一个位置a001h,那将是内存中的下一个字节,对吗?
但是,如果该位为1,我是否要寻址4Kb块?
那么寻址a000h会给我一个4Kb的块,而给a001下一个4Kb的内存吗?
我有如下的小代码片段:
char global=100;
void main()
{
char p = NULL;
printf("%p\n", &p);
printf("%p\n", &global);
}
Run Code Online (Sandbox Code Playgroud)
在编译并生成二进制可执行映像之后,在每次执行相同的二进制可执行文件时,我会看到本地变量的不同虚拟内存地址p.
但是,全局变量的虚拟内存地址global保持不变.我理解C内存布局; 并且我希望在每次执行时使用相同的二进制图像为给定变量提供相同的内存位置.
在运行时为本地变量分配的虚拟地址的原因是什么?
只有一个功能,没有机会改变功能的执行顺序,从而改变堆栈存储器布局.
运行此程序4次的结果:
0x7fff181b4b2f
0x601034
0x7ffe34abd62f
0x601034
0x7ffe2813b98f
0x601034
0x7fffcef6b52f
0x601034
Run Code Online (Sandbox Code Playgroud) 我们在用户输入期间使用&符号(&)运算符。这意味着我们将特定值分配给特定变量的内存地址。但是在赋值期间,我们不需要&符号。在没有任何内存地址规范的情况下如何传递值?下面给出了示例代码。
#include<stdio.h>
int main()
{
int a, b, total;
scanf("%d%d", &a, &b); //& for memory address
total = a+b; //how the value is being tranfarred to total without any memory address?
printf("%d", total);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在x86汇编程序中,假设你有
为什么需要索引和基指针寻址模式?据我所知,每个都可以用循环代替.
间接模式似乎也没有太大用处,因为您可以简单地使用直接模式来引用内存地址.首先访问寄存器的目的是什么,然后包含指向存储器地址的指针?
简而言之,哪些寻址方式确实是必要的?
我有一个结构保持条件信息.
private struct hintStructure
{
public string id;
public float value;
public bool alreadyWarned;
}
private List<hintStructure> hints;
Run Code Online (Sandbox Code Playgroud)
每当我的程序更改一个值时,就会发送一个事件并检查条件列表是否符合条件.
public void EventListener (string id)
{
CheckHints(id); //id of the updated element
}
private void CheckHints(string _id)
{
foreach (hintStructure _h in hints)
if (_h.id == _id) CheckValue(_h);
}
private void CheckValue(hintStructure _h)
{
float _f = GetValue(_h.id);
if (_f < _h.value)
{
ActivateHint(_h);
_h.alreadyWarned = true;
}
else
_h.alreadyWarned = false;
}
private void ActivateHint(hintStructure _h)
{
if(_h.alreadyWarned == false) …Run Code Online (Sandbox Code Playgroud)