博文

目前显示的是 七月, 2007的博文

Linux汇编语言开发初探(2)

上述输出信息的第一列是指令对应的地址码,利用它可以设置在程序执行时的断点: ald> break 0x08048088 Breakpoint 1 set for 0x08048088     断点设置好后,使用 run 命令开始执行程序。ALD 在遇到断点时将自动暂停程序的运行,同时会显示所有寄存器的当前值: ald> run Starting program: hello Breakpoint 1 encountered at 0x08048088 eax = 0x00000004 ebx = 0x00000001 ecx = 0x08049098 edx = 0x0000000F esp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000 ds  = 0x0000002B es  = 0x0000002B fs  = 0x00000000 gs  = 0x00000000 ss  = 0x0000002B cs  = 0x00000023 eip = 0x08048088 eflags = 0x00000246 Flags: PF ZF IF 08048088  CD80                       int 0x80     如果需要对汇编代码进行单步调试,可以使用 next 命令: ald> next Hello, world! eax = 0x0000000F ebx = 0x00000000 ecx = 0x08049098 edx = 0x0000000F esp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000 ds  = 0x0000002B es  = 0x0000...

Linux汇编语言开发初探(1)

一、简介     作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。     大多数情况下 Linux 程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在 Linux 操作系统中也可以用完全用 C 语言来实现,再加上 GCC 这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在一边了。但实现情况是 Linux 程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:精简、高效和 libc 无关性。假设要移植 Linux 到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。     汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点: 能够直接访问与硬件相关的存储器或 I/O 端口; 能够不受编译器的限制,对生成的二进制代码进行完全的控制; 能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁; 能够根据特定的应用对代码做最佳的优化,提高运行速度; 能够最大限度地发挥硬件的功能。     同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点: 编写的代码非常难懂,不好维护; 很容易产生 bug,难于调试; 只能针对特定的体系结构和处理器进行优化; 开发效率很低,时间长且单调。     Linux 下用汇编语言编写的代码具有两种不同的形式。第一种是完全的汇编代码,指的是整个程序全部用汇编语言编写。尽管是完全的汇编代码,Linux 平台下的汇编工具也吸收了 C 语言的长处,使得程序员可以使用 #include...

贝叶斯定律通俗理解 (Z)

18世纪,英国学者贝叶斯(1702~1761)曾提出计算条件概率的公式用来解决如下一类问题:假设H[,1],H[,2]…互斥且构成一个完全事件, 已知它们的概率P(H[,i],i=1,2,…,现观察到某事件A与H[,1],H[,2]…相伴随而出现,且已知条件概率P(A/H[,i]),求 P(H[,i]/A)。贝叶斯公式(发表于1763年)为: P(H[,i]/A)=P(H[,i])P(A/H[,i])/[P(H[,1])P(A/H[,1]) P(H[,2])P(A/H[,2])…]   这就是著名的“贝叶斯定理”,一些文献中把P(H[,1])、P(H[,2])称为基础概率,P(A/H[,1])为击中率,P(A/H[,2])为误报率[1]。现举一个心理学研究中常被引用的例子来说明:   参加常规检查的40岁的妇女患乳腺癌的概率是1%。如果一个妇女有乳腺癌,则她有80%的概率 将接受早期胸部肿瘤X射线检查。如果一个妇女没有患乳腺癌,也有9.6%的概率将接受早期胸部肿瘤X射线测定法检查。在这一年龄群的常规检查中某妇女接受 了早期胸部肿瘤X射线测定法检查。问她实际患乳腺癌的概率是多大?   设H[,1]=乳腺癌,H[,2]=非乳腺癌,A=早期胸部肿瘤X射线检查(以下简称“X射 线检查”),已知P(H[,1])=1%,P(H[,2])=99%,P(A/H[,1])=80%,P(A/H[,2])=9.6%,求P(H[,1] /A)。根据贝叶斯定理,P(H[,1]/A)=(1%)(80%)/[(1%)(80%) (99%)(9.6%)]=0.078 其实,即使我们没有学过贝叶斯定律,也可以解决上述的问题。 如果患病和没有患病的人概率分别问 1%和 99%, 患病检查的概率和没有患病但是也检查的概率分别为80%和 9.6%。 那么我们做如下假设: 有10000个人, 其中100个为患病者;有80+950.4的人接受了检查,其中950.4为9900人中接受检查的人。 那么我们可以知道对于这10000人里面的一个, 如果她是来接受检查的1030人里面的一个,那么她属于患病的80人中的一个的概率就是80\1030,而这,就是贝叶斯定律给我们的答案。