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

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

2006-5-19 17:35
5418
以前老是搞不清楚它们之间的区别,今天专门研究一下
如有什么错误,请大家指正。
汇编语言:
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 )
在线值:
发帖
回帖
粉丝
2
32位平台下所有的指针都占4个字节。
2006-5-19 17:42
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
3
顶一下,
对于这句mov eax,szText改为mov eax,dword ptr szText就是正确的了
2006-5-19 17:46
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
4
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)
可见中括号在这儿是没有用的
2006-5-20 00:21
0
雪    币: 250
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最初由 thebutterfly 发布
Masm中所有的标号都是地址
但是数据标号在引用的时候会被解析成其中存放的内容

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

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

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


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

例如:
.......

好像开头就说了原因了吧!
2006-5-24 16:55
0
游客
登录 | 注册 方可回帖
返回
//