标签: memory-address

在 Irvine32 中使用像 foo[si] 这样的 16 位地址(在 32 位模式下)?

由于某种原因,当我调试时它停在mov al,data1[si]并给了我一个异常

第 5 周 0x00D53668 处抛出异常。exe:0xC0000005:读取位置 0x01AA6000 时发生访问冲突。

我可以知道是什么原因吗?

INCLUDE Irvine32.inc

.data

data1 byte "MILK",0
data2 byte 4 dup('*'),0


.code
main proc

mov CX,4
mov si,0


l1: 
mov al,data1[si]  <<EXCEPTION THROWN AT THIS LINE>>

mov data2[si],al
    
inc si  ; before go in the loop l1, cx will auto deduct by 1, then cx==0?
    
loop l1
    
mov EDX, offset data2
call WriteString
    
exit
main endp
end main
Run Code Online (Sandbox Code Playgroud)

x86 assembly masm memory-address irvine32

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

通过将端口的偏移量添加到基地址来访问端口组合。这将如何运作?

背景:我正在学习嵌入式系统课程https://www.edx.org/course/embedded-systems-shape-the-world-microcontroller-i

在有关位特定寻址的讲座中,他们展示了以下有关“花生酱和果冻端口”的示例。

给定一个基地址为 0x40005000 的端口 PB,您希望从 PB 访问端口 4 和端口 6,分别为 PB6 和 PB4。可以将端口 4 (0x40) 和端口 6 (0x100) 的偏移量添加到基地址 (0x40005000) 并将其定义为新地址 0x40005140。

这就是我感到困惑的地方。如果我想定义 PB6 的地址,它将是基址(0x40005000)+ 偏移量(0x100)= 0x40005100,PB4 的地址将是基址(0x40005000)+ 偏移量(0x40)= 0x40005040。那么,要访问它们,我可以使用 base(0x40005000) + offset(0x40) + offset(0x100) = 0x40005140 吗?对于他们各自来说,这不是一个完全不同的内存位置吗?

另外为什么位 0 表示为 0x004。在二进制中,这将是 0000 0100。我想如果你忽略前两个二进制位,它会代表位 0,但为什么我们要忽略它们呢?

关于位特定寻址的讲义: 在此输入图像描述

embedded port base-address offset memory-address

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

C指针和地址

我一直以为*&p = p =&*p在C.我试过这段代码:

 #include <stdio.h>
 #include <stdlib.h>

 char a[] = "programming";
 char *ap = &a[4];  

int main(void)
{

 printf("%x %x %x\n", ap, &*(ap), *&(ap));   /* line 13 */
 printf("%x %x %x\n\n", ap+1, &*(ap+1), *&(ap+1));   /* line 14 */
}
Run Code Online (Sandbox Code Playgroud)

第一行printf(第13行)给我地址:

40b0a8 40b0a8 40b0a8

这与预期相同.但当我添加第二条printf线时,Borland抱怨道:

"first.c":E2027必须在第14行的函数main中获取存储单元的地址

我期待得到:

40b0a9 40b0a9 40b0a9.

似乎第14行的表达式*&(ap + 1)是罪魁祸首.我认为第14行的所有三个指针表达式都是等价的.为什么我错了?

第二个相关问题:该线

char *ap = a;
Run Code Online (Sandbox Code Playgroud)

指向数组a的第一个元素.我用了

char *ap = &a[4];  
Run Code Online (Sandbox Code Playgroud)

指向数组a的第5个元素.

是表达

char *ap = a;
Run Code Online (Sandbox Code Playgroud)

与表达相同

char *ap = &a[0];
Run Code Online (Sandbox Code Playgroud)

最后一个表达式是否比前一个表达式更冗长?

非常感谢...

c pointers memory-address

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

如何通过C中的套接字发送和接收内存地址?

我想通过C中的套接字发送/接收内存地址.我有以下内容:

void *ptr = malloc(122); /* So the pointer points to some valid address */
unsigned char *socketData = NULL;

socketData = (unsigned char*)malloc(sizeof(void*));
memset(socketData, 0, sizeof(void*));

/* ??? How to get the memory address - where ptr points to - to socketData ??? */
Run Code Online (Sandbox Code Playgroud)

我知道使用打印指针地址的方法printf是使用%p,即

printf("%p", ptr);
Run Code Online (Sandbox Code Playgroud)

但这打印例如0x0021ef1a.我想要的只是以下内容:0021ef1a

在接收方:如何将接收到的字节转换回void*

啊:代码应该适用于32位以及64位系统;)此外代码应该使用-Wall -Werror编译....呵呵

谢谢你的帮助!周末愉快,乔纳斯

c sockets void-pointers memory-address

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

指针 - 查询

#include <stdio.h>
#include <stdlib.h>

int main( void ) {
   char *ptr1 = "Hello World\n";
   char *ptr2;

   ptr2 = ptr1 + 6;
   ptr2 = "Test!\n";

   printf("%s",ptr2);
   printf("%s",ptr1);

   return EXIT_SUCCESS;   
}
Run Code Online (Sandbox Code Playgroud)

输出:

Test!
Hello World
Run Code Online (Sandbox Code Playgroud)

为什么我没有Hello Test!?我以为id会覆盖World-part ptr1.

c pointers memory-address

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

如何通过将其地址向下传递给C中的两个函数来操作main中的Int?

我在main中有一个名为'end'的int.

主函数调用函数,函数本身调用函数.

到目前为止,我能够让第一个函数通过向它发送一个地址并让它期望一个指针来操纵'结束'.然而,我无法将其发送到下一个函数,并让它操纵main中调用的'int'.

到目前为止,我有以下哪个适用于一个功能;

适用于一个功能的缩写代码:

void function(int* end);

int main(void)
{
   end = 0;

   function(&end);
}

void function(int* end)
{
   *end = 1;

   // At this stage I want to call in another function, and have it be able to manipulate 'end'
}
Run Code Online (Sandbox Code Playgroud)

c pointers function memory-address

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

C#读指针地址值

(对不起,我的英语不好 )

如何从C#中的指针读取值地址?

示例:我知道我的指针,但应用程序启动时值会发生变化.

1)开始

(Pointer) 0x0018F36C   =  ( Value) 0x0342AD68
Run Code Online (Sandbox Code Playgroud)

2)重启

(Pointer) 0x0018F36C  = ( Value Changed ) 0x0342AE20
Run Code Online (Sandbox Code Playgroud)

实际上我有一个基址0x0018F36C但需要从指针读取值并保存为long

例:

long addr_base = 0x0018F36C;
long address;  //Obviously I do not know the Address
Run Code Online (Sandbox Code Playgroud)

现在我需要从addr_base读取long值并将值(long)放在地址中

addr_base = memory.ReadAddress(addr_base)
Run Code Online (Sandbox Code Playgroud)

谁知道如何读取存储在名为addr_base的变量中的地址?

c# memory pointers memory-management memory-address

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

在Ada中从System.Address转换为Integer

在下面的例子中,我想知道,为什么line 17不起作用,但是line 18?我可以不System.Address直接转换为Integer(参见line 17)吗?

main.adb

with Ada.Text_IO;
with Ada.Unchecked_Conversion;
with System.Storage_Elements;

procedure Main is
   package SSE renames System.Storage_Elements;

   type Integer_Access is access Integer;
   I1_Access : Integer_Access := new Integer'(42);
   I1_Address : System.Address := I1_Access.all'Address;

   function Convert1 is new Ada.Unchecked_Conversion (System.Address, Integer);
   function Convert2 is new Ada.Unchecked_Conversion (System.Address, Integer_Access);
begin
   Ada.Text_IO.Put_Line (SSE.To_Integer (I1_Access'Address)'Img);
   Ada.Text_IO.Put_Line (SSE.To_Integer (I1_Access.all'Address)'Img);
   Ada.Text_IO.Put_Line (I1_Access.all'Img);
   Ada.Text_IO.Put_Line (Convert1 (I1_Address)'Img);  --  why does this NOT work?
   Ada.Text_IO.Put_Line (Convert2 (I1_Address).all'Img);  -- …
Run Code Online (Sandbox Code Playgroud)

memory-management ada memory-address

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

为什么我可以将对象存储在大小不同的数组中?

例如以下代码:

#include <iostream>
#include <vector>

class VectorContainer
{
public:
  VectorContainer(std::vector<int>::size_type sz)
  {
    foo.reserve(sz);
    for (int i = 0; i < sz; i++) {
        foo.push_back(i);
    }
  }

  std::vector<int> foo;
};


int main(int argc, const char * argv[]) {

  VectorContainer containerOne(0);

  VectorContainer containerTwo(1);

  std::cout << &containerOne << std::endl;

  std::cout << &containerTwo << std::endl;

  VectorContainer arr[2] = {containerOne, containerTwo};

  std::cout << &arr[0] << std::endl;

  std::cout << &arr[1] << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

0x7ffeefbff578
0x7ffeefbff560
0x7ffeefbff5e0
0x7ffeefbff5f8
Run Code Online (Sandbox Code Playgroud)

为什么在这里可以将VectorContainers(大小不同)存储在一个数组中而没有任何负面影响?为什么最后两个地址与前两个地址不同?

我原以为containerOne和containerTwo直接位于数组容器中而没有任何指针.

c++ arrays memory-address

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

结构成员的地址之间的差异作为编译时间常量

struct A {
    int a;
    .
    .
    .
    int b;
} obj;
Run Code Online (Sandbox Code Playgroud)

const ptrdiff_t diff = &obj->b - &obj->a;

diff始终包含一个常量,即使程序运行多次也不会改变?

diff始终是积极的?

有没有办法在编译时获得这种差异?(手动计数除外)

c++ struct compile-time memory-address

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