请教:用C语言向安全空间写入从"a"到"h"的8个字符

[复制链接]
查看11 | 回复9 | 2021-1-27 06:49:42 | 显示全部楼层 |阅读模式
我学习王爽老师编写的《汇编语言》时,后面综合研究里对C语言进行了深入介绍,其中“研究实验4不用main函数编程”中有一道例题使我感觉很困惑,希望大家能帮帮我。
#defineBuffer((char*)*(intfar*)0x20000000)
voidmain()
{
Buffer=0;
Buffer[10]=0;
while(Buffer[10]!=8)
{
Buffer[Buffer[10]]='a'+Buffer[10];
Buffer[10]++;
}
}
问题:
1、#defineBuffer((char*)*(intfar*)0x20000000)
*(intfar*)0x20000000表示一个段地址为20000,偏移地址为0000的内存单元,第一个*号表示内存空间,第二个*号表示后面为内存地址,int表示该空间的每个单元占2个字节(TC中,int占2B),如果地址中既有段地址又有偏移地址,则需要加上far。但我不明白的是为什么要在这句话的前面加上(char*)?还有为什么*(intfar*)0x20000000,重要指定为int。
2、Buffer看上去就像一个数组名,Buffer[10]访问数组中下标为10的内存空间,理论上讲应该是这样理解,但不知道实际上对不对。
3、将其编译为.exe文件后,使用debugf.exe调式发现内存2000:0000处并未存放'a'~'h'这8个字符。不明白到底问题出在哪里?



分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:49:42 | 显示全部楼层
这个要到实模式下去调试的。
回复

使用道具 举报

千问 | 2021-1-27 06:49:42 | 显示全部楼层
从0x20000000看,是win32的汇编吧
回复

使用道具 举报

千问 | 2021-1-27 06:49:42 | 显示全部楼层
((char*)*(intfar*)0x20000000)这样写表示的是取2000:0000中的WORD作为char型指针,应该改成((charfar*)0x20000000),这样才表示把2000:0000这个地址作为char型远指针来使用。
回复

使用道具 举报

千问 | 2021-1-27 06:49:42 | 显示全部楼层
哈哈,你真够好学的,我也看看!
回复

使用道具 举报

千问 | 2021-1-27 06:49:42 | 显示全部楼层
非常感谢大家的帮忙,特别感谢3楼的提醒,我发现书上给出的代码有错误,如果要向安全空间2000:0000写入字符'a'~'h'这8个字符,应改为:
#defineBuffer((charfar*)0x20000000)//修改
voidmain()
{
//Buffer=0;//删除这条语句
Buffer[10]=0;
while(Buffer[10]!=8)
{
Buffer[Buffer[10]]='a'+Buffer[10];
Buffer[10]++;
}
}
这样我运行后就得到了正确结果。
看来有很多问题还需要不断探索、专研才可以,以后多向大家学习哦!

回复

使用道具 举报

千问 | 2021-1-27 06:49:42 | 显示全部楼层
对了,#defineBuffer((charfar*)0x20000000)
相当于定义一个指针
char*p;
p=0x20000000;注意这里只是一种语义的描述,实际上在TC编译器中并不识别这种写法。

回复

使用道具 举报

千问 | 2021-1-27 06:49:42 | 显示全部楼层
accessvilation!
怎么调的?
回复

使用道具 举报

千问 | 2021-1-27 06:49:42 | 显示全部楼层
偶是菜鸟,飘过学习
回复

使用道具 举报

千问 | 2021-1-27 06:49:42 | 显示全部楼层
学习下,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行