由于某种原因,当我调试时它停在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) 背景:我正在学习嵌入式系统课程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,但为什么我们要忽略它们呢?
我一直以为*&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中的套接字发送/接收内存地址.我有以下内容:
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编译....呵呵
谢谢你的帮助!周末愉快,乔纳斯
#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.
我在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#中的指针读取值地址?
示例:我知道我的指针,但应用程序启动时值会发生变化.
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的变量中的地址?
在下面的例子中,我想知道,为什么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) 例如以下代码:
#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直接位于数组容器中而没有任何指针.
struct A {
int a;
.
.
.
int b;
} obj;
Run Code Online (Sandbox Code Playgroud)
const ptrdiff_t diff = &obj->b - &obj->a;
将diff始终包含一个常量,即使程序运行多次也不会改变?
将diff始终是积极的?
有没有办法在编译时获得这种差异?(手动计数除外)