| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2209 人关注过本帖
标题:[讨论]exit function的一点疑问
只看楼主 加入收藏
multiple1902
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:4881
专家分:671
注 册:2007-2-9
收藏
得分:0 
以下是引用Joforn在2007-8-14 19:51:23的发言:

  这个问题与面对对象和面向过程好像没多大的关系。
  Exit Function(Exit sub其实是一样的,只是一个东西两种不同的写法,唯一有一点区别的是Exit Function代表将返回值到AX寄存器中),其作用是通知CPU执行POP命令,将先前堆栈的地址弹出并跳转到所弹出的地址上开始执行(在你调用函数或过程时都使用了隐含的语句CALL,CALL的作用就是将当前指令的地址PUSH到堆栈区,然后跳转到CALL后面所指向的地址开始执行)。

抱歉刚才瞎扯了……

不过我以为VB如此伪编译的东西真正运行的时候不会认真到如此简单地操作寄存器吧(今天刚在书店看了本单片机的书……)

要是说错了就当我继续扯淡吧……

2007-08-14 20:31
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
收藏
得分:0 
以下是引用multiple1902在2007-8-14 20:31:51的发言:

抱歉刚才瞎扯了……

不过我以为VB如此伪编译的东西真正运行的时候不会认真到如此简单地操作寄存器吧(今天刚在书店看了本单片机的书……)

要是说错了就当我继续扯淡吧……

这是一个在工程中的模块,模块中只有一个Main函数,一个简单的加法函数
Sub Main()
Dim X As Long
X = Add1(1, 1)
End Sub

Private Function Add1(ByVal NUM1 As Long, ByVal NUM2 As Long) As Long
Add1 = NUM1 + NUM2
End Function

'下面是VB生成的List文件(汇编格式)
TITLE I:\Text\Module1.bas
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
text$1 SEGMENT PARA USE32 PUBLIC ''
text$1 ENDS
; COMDAT ?Main@Module1@@AAGXXZ
text$1 SEGMENT PARA USE32 PUBLIC ''
text$1 ENDS
; COMDAT ?Add1@Module1@@AAGXXZ
text$1 SEGMENT PARA USE32 PUBLIC ''
text$1 ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC ?Main@Module1@@AAGXXZ ; Module1::Main
PUBLIC ?Add1@Module1@@AAGXXZ ; Module1::Add1
; COMDAT ?Main@Module1@@AAGXXZ
text$1 SEGMENT
?Main@Module1@@AAGXXZ PROC NEAR ; Module1::Main, COMDAT

; 5 : Dim X As Long
; 6 : X = Add1(1, 1)

push 1
push 1
call ?Add1@Module1@@AAGXXZ ; Module1::Add1

; 7 : End Sub

ret 0
?Main@Module1@@AAGXXZ ENDP ; Module1::Main
text$1 ENDS
EXTRN __imp____vbaErrorOverflow:NEAR
; COMDAT ?Add1@Module1@@AAGXXZ
text$1 SEGMENT
_NUM2$ = 12
_NUM1$ = 8
?Add1@Module1@@AAGXXZ PROC NEAR ; Module1::Add1, COMDAT

; 10 : Add1 = NUM1 + NUM2

mov eax, DWORD PTR _NUM1$[esp-4]
mov ecx, DWORD PTR _NUM2$[esp-4]
add eax, ecx '将ECX中的值与EAX的值相加,存入EAX
jo SHORT $L23

; 11 : End Function

ret 8
$L23:
call DWORD PTR __imp____vbaErrorOverflow
?Add1@Module1@@AAGXXZ ENDP ; Module1::Add1
text$1 ENDS
END

你自己对比一下两段代码吧

[此贴子已经被作者于2007-8-14 21:28:14编辑过]


VB QQ群:47715789
2007-08-14 21:24
multiple1902
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:4881
专家分:671
注 册:2007-2-9
收藏
得分:0 
汇编我才刚刚学……


果然如此哦 那让人怎么相信VB的执行的确是低效率的呢?
2007-08-14 21:26
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
收藏
得分:0 
以下是引用multiple1902在2007-8-14 21:26:01的发言:
汇编我才刚刚学……


果然如此哦 那让人怎么相信VB的执行的确是低效率的呢?

VB低效主要在于:
一、VB在初始化程序时会自动为所有的程序初始一大堆的东西(有很多可能你那个程序没有用到的);
二、VB中没有真正的指针,所以在内存处理时白白耗去了一大堆的时间;
三、VB默认在编译时会自动设置错误陷井,并使用了错误处理类(这样是保证了你的程序不容易出现“内存不允许读取”之类的错误,但也是相当的耗时的),不知道你有没有注意到上面call DWORD PTR __imp____vbaErrorOverflow这条?
四、VB在处理数据时会自动检测数据的正确性,并试图自动转化数据类型,如果不能转换则又开始错误处理(天啊,这能不耗时吗?)。
五、…………

[此贴子已经被作者于2007-8-14 21:41:12编辑过]


VB QQ群:47715789
2007-08-14 21:39
multiple1902
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:4881
专家分:671
注 册:2007-2-9
收藏
得分:0 
这样啊 谢谢


听说VB中可以用API CopyMemory实现伪指针 效率的确更高
2007-08-14 21:43
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
收藏
得分:0 
以下是引用multiple1902在2007-8-14 21:43:23的发言:
这样啊 谢谢


听说VB中可以用API CopyMemory实现伪指针 效率的确更高

呵,比VB快,但和C比…………
VB调用API也要初始化、堆栈、访问数据(API函数中还有一大堆的初始化语句)、还原堆栈、返回函数,而C仅仅是改变指针、访问内存。
你就想像一下你要进到一万个房间里拿东西,用C的方法是打开门->拿上东西放在自己的包里->再开下一个门->再拿东西->……,而用VB就是找到门->在门口把手上的东西放下->拿上东西->放入自已的包里->再关上门->再找下一个门->………


VB QQ群:47715789
2007-08-14 21:52
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
收藏
得分:0 
天哪,汇编=天书~完全不懂

偶学编程,也许本身就是一个错。。。
2007-08-14 23:55
multiple1902
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:4881
专家分:671
注 册:2007-2-9
收藏
得分:0 
以下是引用Joforn在2007-8-14 21:52:33的发言:

呵,比VB快,但和C比…………
VB调用API也要初始化、堆栈、访问数据(API函数中还有一大堆的初始化语句)、还原堆栈、返回函数,而C仅仅是改变指针、访问内存。
你就想像一下你要进到一万个房间里拿东西,用C的方法是打开门->拿上东西放在自己的包里->再开下一个门->再拿东西->……,而用VB就是找到门->在门口把手上的东西放下->拿上东西->放入自已的包里->再关上门->再找下一个门->………

您休息会吧……看得出来除了说明了问题……逻辑有点混乱……

2007-08-15 08:13
快速回复:[讨论]exit function的一点疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024720 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved