我们知道每条指令都转换为基址+偏移量,并且偏移量最大大小设置为4K(4096)。如果我的程序大小超过 4k 怎么办?
Line 1 : Base + 1 ,
Line 2 : Base + 5 ,
.
.
.
.,
Line x : base + 4090
Run Code Online (Sandbox Code Playgroud)
当指令超出页面大小 4096 时,如何对第 x 行开始进行寻址(如基址 + 偏移量)?
从 X 行开始的指令是如何组装的?我们是否需要将基地址更改为保存指令的下一页的开头?
标题是不言自明的.如何从另一个列表Y(相同的结构)构建一个新的列表X,但结果列表指向内存区域的其他位置,实际上是另一个对象?我尝试使用make-list :initial-element Y或附加到空列表,但我仍然得到相同的对象.谢谢!
我有精神障碍,我知道我应该知道这一点,但我需要一些帮助.
如果我声明一个像这样的字符串变量:
string word = "Hello";
Run Code Online (Sandbox Code Playgroud)
如何找到"Hello"的内存地址?
编辑:这就是我想要做的......
编写一个函数,它接受一个参数,一个字符串的地址,并打印该字符串一次.(注意:您需要使用指针来完成此部分.)
但是,如果提供了第二个参数,类型为int,并且非零,则该函数应该打印该字符串的次数等于该点处调用该函数的次数.(请注意,打印字符串的次数不等于第二个参数的值;它等于到目前为止调用函数的次数.)
我无法弄清楚如何使用带有SOS的WinDBG来获取静态.NET类成员的地址.给定这样的输入程序:
namespace windg_static_test
{
class StaticTest
{
public static bool static_bool_field = true;
public void show_and_set()
{
while (static_bool_field)
{
Console.WriteLine("static_bool_field = " + static_bool_field + "\nEnter new value: ");
static_bool_field = Console.ReadLine()[0] == '0' ? false : true;
}
}
}
class Program
{
static void Main(string[] args)
{
StaticTest st = new StaticTest();
st.show_and_set();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用!name2ee找到EEClass,我可以使用!dumpclass w/name2ee值查看值.
0:004> !dumpclass 1c12e0
Class Name: windg_static_test.StaticTest
mdToken: 02000002
File: C:\Develop\Projects\windg static test\bin\Release\windg static test.exe
Parent Class: 64f84920
Module: 001c2e94 …Run Code Online (Sandbox Code Playgroud) 我有一个堆栈分配std::vector被一些流氓代码覆盖.它不是被覆盖的数据,而是内部状态.我知道这是因为size()成员函数会在程序中返回垃圾值一段时间.它正确初始化.我怀疑代码中的其他地方有一个常见的指针错误.
我正在使用Xcode 4.6.2.我想在内存访问向量的第一个内存位置(向量本身,而不是数据)时设置硬件断点(使用lldb),所以我可以看到覆盖它的内容.根据这个我需要先找到矢量的地址.通常会使用&运算符来获取变量的地址,但由于某种原因,使用lldb这不会返回地址,而是打印某种类型的汇总字符串.
class myClass {
public:
myClass() : myVector(4) {}
private:
std::vector<double> myVector;
double myDouble;
};
Run Code Online (Sandbox Code Playgroud)
在构造完所有内容后,在任意断点处断开之后:
(lldb) frame variable &myObject.myVector
(std::vector<double, std::allocator<double> > *) $7 = size=4
Run Code Online (Sandbox Code Playgroud)
'expr'具有相同的结果:
(lldb) expr &myObject.myVector;
(std::vector<double, std::allocator<double> > *) $8 = size=4
Run Code Online (Sandbox Code Playgroud)
通常我希望看到打印的地址,例如使用此普通数据成员:
(lldb) frame variable &myObject.myDouble
(double *) &myDouble = 0x0000000125589328
Run Code Online (Sandbox Code Playgroud)
我尝试使用'expr'将地址分配给变量,但这也不起作用:
(lldb) expr std::vector<double, std::allocator<double> > * f = &myObject.myVector; f
(std::vector<double, std::allocator<double> > *) $12 …Run Code Online (Sandbox Code Playgroud) 假设我有以下数组:
int list[3]={2,8,9};
printf("%p,%p,%p",(void*)&list[0],(void*)&list[1],(void*)&list[2]);
Run Code Online (Sandbox Code Playgroud)
是否始终保证&list [0] <&list [1] <&list [2]?
在使用C时我曾经认为它是一个严格而快速的规则,但现在必须非常肯定它作为一个OP只是在我回答他的问题时问我这个问题. endianness
什么让我第二个想法是问题.stacks can grow up or down我不是很确定,所以你的严谨答案是值得赞赏的.谢谢.
在NASM汇编器中,可以使用.前缀声明本地标签。
我问是因为有些功能使我感到困惑。这是一个示例代码:
ORG 0x400000 ;origin of address for labels
start: ;address here should be 0x400000
..... ;some code here
.loop ;local label
..... ;some code here
jmp short .loop ;<------- address is not taken as absolute
jmp short start
Run Code Online (Sandbox Code Playgroud)
如果我使用一些普通标签(如start)进行引用,并将其与lea指令一起使用,则地址将被视为相对于原点的普通绝对地址。
short(如最后一行所示),会发生什么情况?是否从绝对地址计算出跳转的偏移量?我之所以这么问,是因为我的代码中有本地标签(.LNXYZ,是随机生成的),并且需要列出地址列表(从这些标签中),该地址列表将包含4字节的元素,其中包含用于跳转的绝对地址。这样有可能吗,还是我必须使用普通标签?有任何指令吗?
我的代码
class Parent { int a; };
class Child { int b; };
struct GrandChild : public Parent, public Child { int a, b, c; };
int main() {
GrandChild GC;
std::cout << "GrandChild's address is at : " <<&GC<<endl;
std::cout << "Child's address is at : " <<static_cast<Child*>(&GC)<<endl;
std::cout << "Parent's address is at : " <<static_cast<Parent*>(&GC)<<endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
GrandChild's address is at : 0077F6F8
Child's address is at : 0077F6FC
Parent's address is at : 0077F6F8
Run Code Online (Sandbox Code Playgroud)
为什么在static_cast之后内存位置有如上所述的不一致?
首先,我在谈论32位架构.我的教授给了我们一个例子,说明如何存储C/C++ 32位整数的地址,并且有一个地址,就像0A0B0C0D整数的第一个字节存储在0x0A,第二个at 0x0B,第三个at 0x0C和第四个at 0x0D.但是,我在C++中尝试了以下代码:
#include <iostream>
int main(){
int a = 5;
std::cout << &a;
}
Run Code Online (Sandbox Code Playgroud)
和我0x7fffba2e6c3c.但是,这看起来像字节是连续的,就像教授给我们的例子一样.我的问题是,为什么编译器不将整数的4个字节存储在连续的内存地址中,而不是将整数中的每个字节存储在不同的地址中?
严格按照C++ 14的规则,至少cppreference.com给出的规则,不是第(1)行是一个常量表达式吗?
constexpr const int* addr(const int& ir) { return &ir; }
constexpr const int* tp = addr(5); // (1)
Run Code Online (Sandbox Code Playgroud)
确实,它不是地址常量表达式,因为&ir它不是静态对象&ir的地址(在此上下文中是临时的地址,在编译时无法知道).
但它是一个核心常量表达式,因为它不违反任何后面列出的核心常量表达式规则,它没有关于获取对象地址的后续规则.