标签: memory-address

cpu如何在实模式下计算20位地址

我知道它使用物理地址=段寄存器<< 4 +偏移寄存器.虽然这两个寄存器是16位,8086如何处理20位加法操作?

x86 real-mode memory-address

5
推荐指数
1
解决办法
2219
查看次数

查询C++中的类变量声明

我有一个类来表示浮动的3D矢量:

class Vector3D
{
    public:

    float x, y, z;
    float * const data;

    Vector3D() : x(0.0), y(0.0), z(0.0), data(&x) {}
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:x,y和z是否会在内存中顺序分配,这样我就可以将x的地址分配给数据,然后使用数据上的下标运算符来作为数组访问矢量组件?

例如,有时我可能想直接访问矢量组件:

Vector3D vec;
vec.x = 42.0;
vec.y = 42.0;
vec.z = 42.0;
Run Code Online (Sandbox Code Playgroud)

有时我可能想通过偏移来访问它们:

Vector3D vec;
for (int i = 3; i--; )
    vec.data[i] = 42.0;
Run Code Online (Sandbox Code Playgroud)

第二个示例是否与第一个示例具有相同的效果,或者我是否存在覆盖除x,y和z浮点数以外的内存的风险?

c++ arrays variables subscript memory-address

5
推荐指数
1
解决办法
511
查看次数

如何在位级表示变量的名称/内存地址?

这可能是一个愚蠢的问题,但我对编程很新,所以请耐心等待.

让我们说为了论证我正在谈论用C编码...

我理解(系统相关)一个int占用4个字节,或32位内存.

但是,这里有两件事让我感到困惑.这段内存有一个与之关联的特定内存地址(也就是说也是32位),如果将这个int存储在一个变量中,那么它也有一个与之关联的名称.

例如int myInt = 5;

我的问题是 - 在位级表示的内存地址和变量名称的方式和位置是什么?在编译代码时,编译器是否基本上说:"好的myInt引用地址0xffffff"并且基本上替换机器代码中的内存地址?即使是这种情况,我仍然对如何表示内存地址本身感到困惑...

我希望我的困惑在哪里清楚!

c variables memory-address

5
推荐指数
2
解决办法
1420
查看次数

如果加载到应用程序中,DLL中的函数地址是否可以更改?

我反汇编了一个DLL并看到了一些函数.我找到了我需要的功能,它的地址是0x10001340.

如果我将这个dll加载到我的应用程序中,这个地址是否会保持不变?那么我可以通过我的应用程序中的地址调用该函数吗?

我问,因为我不确定:如果加载此dll时,主应用程序中的某些功能已经具有相同的地址?所以也许dll中的函数可以在加载等时更改地址.

c++ dll function memory-address

5
推荐指数
1
解决办法
1146
查看次数

C++ - 获取特定内存地址的值

我想知道是否有可能做这样的事情:

unsigned int address = 0x0001FBDC; // Random address :P
int value = *address; // Dereference of address
Run Code Online (Sandbox Code Playgroud)

意思是,是否可以在内存中获取特定地址的值?

谢谢

c++ memory pointers memory-address dereference

5
推荐指数
1
解决办法
3万
查看次数

如何使用atos手动表示崩溃日志

在搜索了整个互联网以找到一种方式来表示我从Apple收到的崩溃日志之后,我终于想出了如何在终端中使用atos命令来表示崩溃日志.我有dSYM文件,.app文件和崩溃日志在同一个文件夹中,使用atos -arch armv7 -o APPNAME我已经能够输入内存地址,有时(但很少)一个方法名称出现了.说实话,我对终端或崩溃日志没有多少经验.不幸的是,试图用Xcode的组织者来表示崩溃日志已经完全没有了,并且尝试symbolicatecrash在Xcode的包内容中使用该文件也失败了.所以我在这里,留下了我所知道的唯一其他选择.

现在,我的问题是:如何制作这些内存地址的正面或反面?我必须输入哪些地址才能到达应用程序崩溃的位置?我90%的方式在那里,我只是不知道哪些地址会给我有价值的信息或哪些是无用的.这里附有一张崩溃日志的图片:

在此输入图像描述

任何帮助是极大的赞赏.

terminal xcode memory-address crash-log symbolicatecrash

5
推荐指数
1
解决办法
2万
查看次数

用于迭代像数组一样的struct成员的C方法?

假设我有一个矢量类:

typedef struct vec3_s
{
    float x, y, z;
}
vec3;
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够迭代它而不将其转换为浮点数组.虽然在这种情况下演员阵容是可以接受的,但我很想知道C++中的任何功能是否都可以在C语言中完成.例如,在C++中,由于std::vector< T >下标[]运算符被重载,我可以传递其地址一个函数的第一个索引void*.

void do_something_with_pointer_to_mem( void* mem )
{
    // do stuff
}

int main( void )
{
    std::vector< float > v;

    // fill v with values here

    // pass to do_something_with_pointer_to_mem

    do_some_with_pointer_to_mem( &v[ 0 ] );

    return;
}
Run Code Online (Sandbox Code Playgroud)

另一个更具体的例子是在OpenGL中使用glBufferData(...)时(使用C++时):

glBufferData( GL_ARRAY_BUFFER, sizeof( somevector ), &somevector[ 0 ], GL_STREAM_DRAW );

那么,是否有可能使用下标运算符在C中完成类似的事情?如果没有,并且我必须编写一个函数(例如float vec3_value_at( unsigned int i )),那么static inline …

c iteration vector subscript memory-address

5
推荐指数
2
解决办法
2万
查看次数

fork()之后的地址,值和指针会发生什么

我正在研究一个问题,我fork()在C语言调用之前和之后检查值和地址.我的方法是显示变量值和地址,假设看到后面的地址有差异fork().令我惊讶的是,所说的变量仍然是相同的.

我的问题是他们为什么一样?如果我改变孩子的变量会怎么样?父母和孩子都会改变吗?如果没有,我如何能够更改该地址中的值,而父地址和子地址的地址相同.

代码(供参考):

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
  int status;
  pid_t pid;

  int a = 123456;
  float b = 123.456;
  char c = 'Z';
  int *e;
  e=&a;

  //Retriving address's
  void *ap=&a, *bp=&b, *cp=&c, *ep=&e;

    printf("Parent Before Fork:\n");
    printf("Integer a: \tvalue = %d, \taddress = %p\n", a, ap);
    printf("Float b: \tvalue = %f, \taddress = %p\n", b, bp);
    printf("Char c: \tvalue = %c, \t\taddress = %p\n", c, cp);
    printf("Pointer e: \tvalue …
Run Code Online (Sandbox Code Playgroud)

c fork parent-child virtual-memory memory-address

5
推荐指数
1
解决办法
697
查看次数

指针(星号)的目的究竟是什么?

我是编程的新手,我正试图围绕"指针"的想法.


int main()
{
    int x = 5;
    int *pointerToInteger = & x;
    cout<<pointerToInteger;

}
Run Code Online (Sandbox Code Playgroud)

为什么当我 cout << pointerToInteger;输出是十六进制值时,但是当我使用cout << *pointerToInteger;输出时是5(x = 5).

c++ pointers memory-address dereference

5
推荐指数
3
解决办法
1万
查看次数

MOV Moffs32在64位模式下地址的符号扩展还是零扩展?

让我们MOV EAX,[0xFFFFFFFF]64位模式将指令编码为67A1FFFFFFFF(有效地址大小由67前缀从默认的64位切换为32位)。

英特尔指令参考手册(从2015年12月起,文档订购号:325383-057US)在第Vol。2A 2-11说:

2.2.1.3
64位模式下的位移寻址使用现有的32位ModR / M和SIB编码。ModR / M和SIB大小不变。它们保留为8位或32位,并被符号扩展为64位。

这表明应该对32bit位移进行符号扩展,但是我不确定这是否也涉及特殊的moffs寻址模式。英特尔在下一页上说:

2.2.1.6 RIP相对寻址

RIP相对寻址是通过64位模式而不是64位地址大小启用的。地址大小前缀的使用不会禁用RIP相对寻址。地址大小前缀的作用是将计算的有效地址截断并将其零扩展为32位。

这表明在相对寻址模式下,将disp32符号扩展到64位,再添加到RIP,然后截断并进行零扩展。但是,我不确定同一规则是否适用于绝对寻址模式,MOV moffs操作就是这种情况。

从A)FFFFFFFFFFFFFFFF或B)00000000FFFFFFFF将EAX加载到哪个地址?

64-bit x86 assembly x86-64 memory-address

5
推荐指数
1
解决办法
848
查看次数