读书人

遇到一个奇怪的有关问题 高手(懂汇编)

发布时间: 2012-02-10 21:27:41 作者: rapoo

遇到一个奇怪的问题 高手(懂汇编)的进来看看 高分奉上 晚上结贴
昨天做一个程序,写了一个代码
TCHAR *szDrive = "A:\\";
szDrive[0] = _T('A')+i; //访问违禁

调试过程中总是出现内存访问违禁 但是改了以后就可以了
TCHAR szDrive[] = "A:\\";
szDrive[0] = _T('A')+i;
就没问题了 请问一下 这是为什么?

汇编代码如下
帮我解释一下
_TCHAR* szDrive = _T("A:\\");
00414280 mov dword ptr [szDrive],offset string L"A:\\" (41781Ch)



_TCHAR szDrive[] = _T("A:\\");
0041428A mov eax,dword ptr [string L"A:\\" (41781Ch)]
0041428F mov dword ptr [ebp-1Ch],eax
00414292 mov ecx,dword ptr ds:[417820h]
00414298 mov dword ptr [ebp-18h],ecx
还有 我学过一点汇编语言 为什么这个反汇编出来的一个也看不懂??有没有什么技巧?

[解决办法]
汇编!!!UP吧
[解决办法]
TCHAR *szDrive = "A:\\"; ----> "A:\\"字符串存储在常量区中,而常量区中的内容是不可以改变的
TCHAR szDrive[] = "A:\\"; ---->"A:\\"字符串存储在栈中,栈中的内容是可以改变的

_TCHAR szDrive[] = _T("A:\\");
0041428A mov eax,dword ptr [string L"A:\\" (41781Ch)]
0041428F mov dword ptr [ebp-1Ch],eax
00414292 mov ecx,dword ptr ds:[417820h]
00414298 mov dword ptr [ebp-18h],ecx
明显有很多栈操作
[解决办法]
第一种写法:
A:\是分配在全局静态内存(只读),第一种写法去写 A:\的地址,当然会访问违规

_TCHAR* szDrive = _T("A:\\");
00414280 mov dword ptr [szDrive],offset string L"A:\\" (41781Ch)
将A:\的地址 填到szDrive 中

第二种写法:

_TCHAR szDrive[] = _T("A:\\");
0041428A mov eax,dword ptr [string L"A:\\" (41781Ch)]
0041428F mov dword ptr [ebp-1Ch],eax
00414292 mov ecx,dword ptr ds:[417820h]
00414298 mov dword ptr [ebp-18h],ecx

把A:\ 拷贝到szDrive[] 数组里面
szDrive 分配在栈上,当然可读写


[解决办法]
up
[解决办法]

C/C++ code
楼主仔细看应该还是能看懂的吧:_TCHAR* szDrive = _T("A:\\"); 00414280  mov        dword ptr [szDrive],offset string L"A:\\" (41781Ch) \\把字串的地址copy给szDrive,dword ptr表示是个双字也就是4个字节,后面括号中的41781c表示\\就是这个常量字串的地址_TCHAR szDrive[] = _T("A:\\"); 0041428A  mov        eax,dword ptr [string L"A:\\" (41781Ch)] \\把41781c地址四个字节的内容copy到cpu寄存器eax0041428F  mov        dword ptr [ebp-1Ch],eax \\把栈指针减1c(实际就是szDrive的栈地址空间,szDrive[0]),copy元素,实际上此时szDrive存储的是A:\\00414292  mov        ecx,dword ptr ds:[417820h] \\取417820地址四个字节的内容copy到ecx寄存器00414298  mov        dword ptr [ebp-18h],ecx \\取ecx赋值给szDrive[4](已经存了4个字节了),实际上此时szDrive[4]存储的是'\0'注意有中括号【】和没有的区别。
[解决办法]
探讨
C/C++ code
楼主仔细看应该还是能看懂的吧:
_TCHAR* szDrive = _T("A:\\");
00414280 mov dword ptr [szDrive],offset string L"A:\\" (41781Ch)
\\把字串的地址copy给szDrive,dword ptr表示是个双字也就是4个字节,后面括号中的41781c表示
\\就是这个常量字串的地址
_TCHAR szDrive[] = _T("A:\\");
0041428A mov eax,dword ptr [string L"A:\\" (41781Ch)]
\\把41781c地址四个字节的内容copy到c…

[解决办法]
http://topic.csdn.net/u/20081210/11/bbd7a422-6121-4984-a847-ed11147876f7.html
[解决办法]


TCHAR *szDrive = "A:\\"; 只是定义了一个指针变量szDrive来保存字符串常量"A:\\"的地址,不允许在程序运行中修改字符串常量,最好写成
const TCHAR *szDrive = "A:\\";

TCHAR szDrive[] = "A:\\"; 则表示定义一个字符数组szDrive,给这个数组中的各个元素中依次放上"A:\\"所包含的全部字符。

在汇编中,
[szDrive]表示一个变量,
[ebp-1Ch]表示栈中的一个地方。
[解决办法]
如果你看汇编码的时候

char *a="abc" 的应该在readonlydata段~


char a[]="abc" 在栈或者Data或者rss段
[解决办法]
up + mark
[解决办法]

又是常量。。。。。。。。。。。。。。
[解决办法]
这个问题嘛。。
char* str = "abc";
最好写成const char* str = "abc";
这里面str所指的内容不能修改。。
而char str[] = "abc";
是初始化一个数组。。。。
数组是可以修改的。
[解决办法]
第一种写法:
A:\是分配在全局静态内存(只读),第一种写法去写 A:\的地址,当然会访问违规

_TCHAR* szDrive = _T("A:\\");
00414280 mov dword ptr [szDrive],offset string L"A:\\" (41781Ch)
将A:\的地址 填到szDrive 中

第二种写法:

_TCHAR szDrive[] = _T("A:\\");
0041428A mov eax,dword ptr [string L"A:\\" (41781Ch)]
0041428F mov dword ptr [ebp-1Ch],eax
00414292 mov ecx,dword ptr ds:[417820h]
00414298 mov dword ptr [ebp-18h],ecx

把A:\ 拷贝到szDrive[] 数组里面
szDrive 分配在栈上,当然可读写

读书人网 >C语言

热点推荐