最近在看C得汇编代码,有些不懂,请指教(关于段得问题)

kobefly 2004-12-07 02:29:55
下边是我跟踪得一个函数得汇编代码(VC6.0)
kobefly = result1(kobefly,x1);
0040B7B8 mov edx,dword ptr [ebp-4]
0040B7BB push edx
0040B7BC sub esp,0Ch
0040B7BF mov eax,esp
0040B7C1 mov ecx,dword ptr [_kobefly (00423790)]
0040B7C7 mov dword ptr [eax],ecx
0040B7C9 mov edx,dword ptr [_kobefly+4 (00423794)]
0040B7CF mov dword ptr [eax+4],edx
0040B7D2 mov ecx,dword ptr [_kobefly+8 (00423798)]
0040B7D8 mov dword ptr [eax+8],ecx
0040B7DB lea edx,[ebp-1Ch]
0040B7DE push edx
0040B7DF call @ILT+5(_result1) (0040100a)

其中这一句
0040B7C7 mov dword ptr [eax],ecx
是做了些什么工作呢?
目标数据使用得是哪个段
我以前只学过8086得些16位得汇编
现在忘得差不多了
记得AX是不可以用作寄存器间接寻址得啊

在32位下,这个是使用得哪个段?
又是如何解释呢?

非常感谢您得帮助
up有分
呵呵
...全文
165 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kobefly 2004-12-09
  • 打赏
  • 举报
回复
好像此论坛不火也

80分都没人理
jsblcg 2004-12-08
  • 打赏
  • 举报
回复
你的代码C部分给的不全,从上面看,kobefly的类型是个结构,x1是个变量,代码很简单,就是在堆栈上创建了一个kobefly结构类型的临时对象,然后将参数kobefly拷贝到这个临时对象,最后调用result函数。这是C中很普通的带结构参数调用,如果为了提高效率,应使用kobefly类型的指针,而不是结构作参数。
kobefly 2004-12-08
  • 打赏
  • 举报
回复
怎么没人帮我顶啊?
郁闷
kobefly 2004-12-08
  • 打赏
  • 举报
回复
楼上得说得是

很感谢
我只是想看一下汇编代码,来确定关于结构体得参数传递
以及参数返回,
编译器是怎么做得
kobefly 2004-12-07
  • 打赏
  • 举报
回复

我明白了一点
谢谢楼上得指点

我有本汇编书得
我们老老师就是杨季文
写<<80X86汇编语言>>得那个

只是时间过去不短了

以前也只学过16位得编程

现在我得工作也不会直接跟汇编打交道
只是想了解C更深一点

谢谢指教
archim 2004-12-07
  • 打赏
  • 举报
回复
在32位保护模式下,cs, ds, es, ss不再表示段地址,而被称为selector,其实就是指向LDT(Local Descriptor Table)或者GDT(Goblal Descriptor Table)的索引。CPU在寻址的时候,先根据selector找到相应的Descriptor,该Descriptor包含了段的基址,基址加上用作间接寻址的寄存器的值,就是最后寻址的结果了。

虽然Descriptor的基址可以是任意的值,但是Windows/Linux在实现的时候都会把基址设成0的。
所以在
mov dword ptr [eax],ecx
中,最终寻址的结果就是eax的值指向的内存单元。

如果还想更深入的了解,自己找本介绍80386保护模式的书看看吧
archim 2004-12-07
  • 打赏
  • 举报
回复
在保护模式下,所有的寄存器都可以用作间接寻址

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧