首页
社区
课程
招聘
汇编语言和C语言字符串的区别
2006-5-19 17:35 4950

汇编语言和C语言字符串的区别

2006-5-19 17:35
4950
以前老是搞不清楚它们之间的区别,今天专门研究一下
如有什么错误,请大家指正。
汇编语言:
szText db 'hello,world',0

mov eax,szText;这是错误的!
mov al,szText;这是正确的,al='h'
mov ebx,offset szText;ebx保存了"hello,world!",0字符串的首地址
mov cl,szText+1;cl='e'

szText表示字符串的第一个字节
offset szText表示该字符串的地址
szText+1表示首地址+1的字节

C语言:
char *s = "hello,world" ;//定义s这个指针变量(4字节)来保存字符串的地址
char str[] = "china" ;//str就是字符串首地址本身

如下:
int main(void)
{
char *s = "hello,world" ;
char str[] = "abc" ;
__asm
{
  mov eax,s//eax就是"hello,world"的地址
  mov bl,byte ptr[eax]
}
}
在堆栈中的情况是
----------
|00636261|--->此栈地址就是字符串的首地址
----------
|xxxxxxxx|--->此栈地址就是s指针变量的地址,内部保存的是"hello,world"字
----------    符串的首地址
|EBP     |
----------
很明显,s在内存中是要占空间的(4 byte),而str就是地址本身,所以不占空间
以上是自己的一些理解,可能会有错误,欢迎大家更正&补充

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (5)
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
prince 16 2006-5-19 17:42
2
0
32位平台下所有的指针都占4个字节。
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
thinkSJ 4 2006-5-19 17:46
3
0
顶一下,
对于这句mov eax,szText改为mov eax,dword ptr szText就是正确的了
雪    币: 291
活跃值: (208)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
thebutterfly 5 2006-5-20 00:21
4
0
Masm中所有的标号都是地址
但是数据标号在引用的时候会被解析成其中存放的内容

例如:
.data
labelA  db  "Hello, world",0
labelB  dd  0
.code
labelC:
     mov   eax, labelA;错误!
     movzx eax, labelA;正确!
     mov   eax, labelB;eax中会存0而不是labelB的地址
     mov   eax, labelC;eax中会存放labelC的地址

值得注意的是这两句:
     mov   eax, labelC
     mov   eax, [labelC]
编译的结果是相同的, 即eax中存放了lableC的地址

这两句也相同
     mov   eax, labelB
     mov   eax, [labelB]
结果eax中都存放了labelB的内容(就是0)
可见中括号在这儿是没有用的
雪    币: 250
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
enbrow 2006-5-21 21:03
5
0
最初由 thebutterfly 发布
Masm中所有的标号都是地址
但是数据标号在引用的时候会被解析成其中存放的内容

例如:
...............

值得注意的是这两句:
mov eax, labelC
mov eax, [labelC]
编译的结果是相同的, 即eax中存放了lableC的地址

这两句也相同
mov eax, labelB
mov eax, [labelB]
结果eax中都存放了labelB的内容(就是0)
可见中括号在这儿是没有用的


能解释一下原因吗?
雪    币: 235
活跃值: (41)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
alpsdew 4 2006-5-24 16:55
6
0
引用: 最初由 thebutterfly 发布
Masm中所有的标号都是地址
但是数据标号在引用的时候会被解析成其中存放的内容

例如:
.......

好像开头就说了原因了吧!
游客
登录 | 注册 方可回帖
返回