传奇1.76私服 本站提供sf1.76,1.76老传奇,1.76复古彩票传奇,新开传奇私服1.76版!
传奇外传激活码 阶乘之计算从入门到精通--迷你篇之一 - liangbch的专栏 - 博客频道 - CSDN.NET赵阳的博客 -
文章作者:传奇1.76私服 文章来源:http://SANSUI-IT.COM/ 更新时间:2012-02-23 

要写出尽可能小(可执行文件尽可能小)的程序,需从三个方面考虑。

sub cl,’0’

而通常的作法:mov dx,si sub dx,2 则需5字节。

1.6.一些结构的调整也可以缩减指令条数,如本程序中有一段代码是用来将字符转化为整数的,原来的代码是这样的:

1.程序段前缀PSP(Program Segment Prefix),长度为256个字节。dos在装载com文件时,总是将其装载到地址0x100处,0x100之前的256个字节就是PSP. PSP 中包含了一些和程序运行相关的信息,作为DOS与运行程序的软件接口. 其中本文的第4个程序中用到的命令行参数就来自于PSP,关于PSP更详细的信息,可参阅

8B07 MOV AX,[BX];机器码:2字节

2.1是字符串输出



2. 关于I/O系统调用

4.1 输入部分,从标准输入设备输入一个字符串,将其转化为1个数。其中版本1还会在输入之前显示提示信息。

1. 编程语语言选择,在同样算法的前提下,不同的编程语言在实现同样的功能时,生所的程序文件相差很大。比如写一个大数阶乘的程序,VB生成的程序可能达几兆,TC2.0生成的文件可小至3K中,而用8086汇编语言写的文件可能不到100字节。

当一个寄存器需另作他用时,需要保存寄存器的值,这时一般需要用mov ax,[bp+xx]的方式将其保存在栈中,也可以movbx, varName的形式保存在全局变量。但这些指令字占用空间较大。另一种方法是用push将其值入栈,用pop指令将栈顶中的数取出。对寄存器使用push,pop指令时,仅为1字节。

5.1, 版本1,这个版本是个用户接口最友好的版本,在dos命令行,输入程序文件名和回车,程序首先提示用户输入1个1-17129之间的数。然后用户输入一个数,比如123,那么,这个程序将计算123的阶乘,并将其结果存入文件123!.txt. 这个程序的代码量也是最大的,生成的com文件有161个字节。下面是完整的源代码。

exe2bin %1.exe%1.com

cmp cl,’9’

程序说明:

同样的例子还有:

用Int 21h 的0a号功能来实现,dx=缓冲区的首地址,实际输入的内容将存入地址为dx+2的位置。

4. 程序说明

set path=c:\masm611\bin;c:\windows\system32;C:\PROGRA~1\ULTRAE~1;

mov cl,byte ptr [si]

以上程序中,标号start到convert部分通过的int21 9号功能,显示提示信息,通过10号功能接受用户输入的1个字符串。标号convert到convert_end用户将输入的字符串转化为数。接下来的部分用于生成输出文件名并创建文件。Outside_loop到save_buff_header是程序的核心部分,用于计算n!阶乘,传奇外传激活码,基本结构是一个2重循环。save_buff_header 到程序结束用来输出运算结果到文件并调用int20结束程序。

5.各个版本的源代码和说明

1.本程序中用到的一些代码化化技巧

1.4. push, pop指令

5.3 版本3。和版本1,版本2相比,这个版本直接从命令行参数得到n的值,而不是在运行过程中接受用户输入。用法,在dos命令行,输入程序名和参数n的值。例fac2_3 100回车,那么,这个程序将计算100的阶乘,并将其结果存入文件100!.txt. 命令行参数可从psp得到,在psp 0x80是命令行参数的长度(不包括命令自身),0x81是命令和参数的分割符空格,从0x82开始就是命令行参数了。下面是完整的源代码。

inc ax;机器码:1字节

3.进程的内存空间布局

2.程序的代码和初始化数据,这是程序的核心部分,他的长度等于最终的com文件的大小,装载到内存的起始地址是0x100, 各个版本的长度介于104到161字节。

本程序的特点是尽可能不使用内存变量,数据尽可能可能存储在寄存器,仅在必要时用push,pop指令对传递变量从1个寄存器到另一个寄存器。这样的好处是,目标代码很小。缺点是增加了阅读难度。

add cx,1 ;机器码:3字节

5.4 版本4. 和前3个版本相比。版本4不输出计算结果到文件,而是输出到标准输出设备,目标文件的大小进一步减少到104字节。如果不检查输入的是否超范围,可以减少2条指令,5个字节,从而使得目标文件的大小降低至100个字节以下。下面是完整的源代码。

在计算完成后,将数转化为字符串,并将其存入文件。打开文件用的是Int21 的0c号功能,dx:指向文件名,返回ax为文件名柄。写文件用的是Int21 h的40h功能,bx:文件名柄,dx:缓冲区地址,cx:需写入的字节数。关闭文件用的是Int21 的 3eh号功能,bx:文析句柄。

or ax,ax ; 机器码:2字节

4.2 计算部分,如果输入的数介于1-17129之间,程序会计算这个数的阶乘。对许多人来说,计算部分是难点,要想理解这部分代码,首先必须先弄懂计算n!的算法,算法和语言无关,建议读者先看看大数阶乘之计算-入门篇之一,搞懂其算法,然后再看这部分代码,也就容易理解了

从算法和逻辑结构上讲,本程序和大数阶乘之计算-入门篇之一 相同. 按照功能来划分,程序的代码可分为以下3个部分。

用Int 21H的 9号功能实现,dx=串首地址,字符串必须以$结果

1.5.巧用lea指令

mov ax,0 ;机器码:3字节

add ax,1 ;机器码:3字节

mov cl,byte ptr [si]

lea 是一个很奇妙的指令,他除了计算地址外,还可用一条指令实现一个地存寄存器和立即数相加并赋给另一个寄存器。如 lea dx,[si-2] ,这个指令仅3个字节,

2. 程序的结构,为实现一个同样的功能,不同人写的程序可能有很大的差别,有人写的代码逻辑简单,代码简洁,而另外的人可能正好相反,为了写出一个尽可能小的程序,你必须优化你的逻辑。

2.3. 数的输出:

调整后,裁掉2条指令而功能不变:

jg @20

3. 代码的优化,这是专门针对汇编代码而言的,对高级语言来说,优化是编译器的事。为实现的一个同样的功能,传世私服长期,可能有多种可供选择,有的指令较长,而有的指令却较短,为了使程序最小,你需要精心选择指令。

link %1.obj

ja @120

1.2立即数0的使用尽可能避免,在许多情况有可替代方案。

8B4600 MOVAX,[BP] ;机器码:3字节

jl @20

cmp cl,’0’

关键字: 汇编 阶乘 大数阶乘 优化 空间优化 DOS调用 com文件 PSP

修改后占为4byte

1.1 格式相似的指令,占用空间可能并不同,一般说来,使用寄存器ax的指令可能占用空间更小。


5.2, 版本2。和版本1相比,这个版本不输出提示信息,目标文件的大小从161字节减少到139个字节。用法,在dos命令行,输入com文件名和回车,然后用户输入一个数,比如123,那么,这个程序将计算123的阶乘,并将其结果存入文件123!.txt.下面是完整的源代码。

ml /AT /c%1.asm

6.关于程序的编译和链接

本文给出一个用8086汇编指令写的一个阶乘计算器,可编译成的16位的com程序,它最大可计算出17129的阶乘。和前几篇不同的是,本程序以追求程序尽可能小为主要目标,因此牺牲了程序的可读性和性能。本文将重点计论代码的空间优化,即在不牺牲功能的前提下,如果写出尽可能小的程序。

4.3 输出部分,将计算结果转化为字符串,输出到文件或者标准输出设备。

jz next

笔者使用masm 6.11 来生成.com文件。为止,笔者做作了一个名为ml_makecom.bat批处理文件,内容见下。当然,也可以使用其他汇编器来汇编汇编代码,比如tasm. 说明,我的汇编/链接器器为ml.exe 6.11和16位链接器link.exe,安装在c:\masm611\bin破天一剑sf下,而exe2bin.exe位于c:\windows\system32,我用的编辑器ultredit32位于C:\PROGRA~1\ULTRAE~1破天一剑sf,故仅需要将这3个破天一剑sf加入到搜索路径。

4.栈空间,实验表明,本文各个版本的汇编程序,使用的栈空间均不超过32字节,故保留 0xffe0到0xffff这32字节作为栈空间,dos调用需要稍大的栈空间,而本文的push指令所需的栈空间非常小,以版本1为例,仅需4个字节。

我们需要知道I/0操作方面的知识。本文中,为了计算n!,需要从标准输入设备输入n的值,从标准输出设备或者文件输出运算结果。用c编程时,输入输出常用库函数来实现,如输入一个字符串并转化为一个数可用函数scanf来实现,将一个数转化一个字符串并输出可用printf来实现。而用汇编语言编程,往往需要只能使用系统API,数与字符串直接的转化,也必须自己来实现,传世私服刷元宝。这部分代码往往占很大的比重。本文中用到的I/O有:

0410: ADDAL,10 ;机器码:2字节,

cmp cl,9 ;如果这个字符小于’0’,则减于’0’后,视为无符号数,一定大于9

xor ax,ax ;机器码:2字节

摘要:本文给出用8086汇编语言写的一个阶乘计算器系列程序,其特点是,生成的目标程序很小。4个版本的目标文件为99-161字节。这四个版本的程序可计算出1-17129之间任意一个数的阶乘。本文以目标程序最小化为主要目标,因此本文重点关注代码的空间优化技术,即如何写出尽可能小的程序。

1.3 .Inc,dec具有比add,sub更短的编码,当变量加1,减1时,优先使用inc,dec

如果“悉数变化一漪雨”董事会投票的话,以悉(西医)、数(数学)、变(编译器)、化(化学)为代表的西方科学,必定会一票小胜以一(中医)、漪(周易)、雨(语言)为代表的东方科学。所以我们没有理由妄自菲薄。解析这七个成员,分别是:查杏林(西医)、辨杏林(数学)、杏仁儿(编译器)、析杏林(化学)、验杏林(中医)、悟杏林(周易)、说杏林(语言)。像个变化的魔方:编译器是机,西医、数学、化学、中医、周易、语言...

cmp ax,0 ;机器码:3字节

80C110: ADDCL,10 ;机器码:3字节

2.2 数的输入:

3.计算结果缓冲区,非初始化的数据.存储计算过程中的中间结果和最终结果,长度随着n的值增大而增加,本文设定其长度为1到65084字节,最大可存储17129的阶乘。其末地址固定于0xffde处,末地址存储计算结果的个位数,首地址存储计算结果的最高位,在计算过程中,缓冲区的头指针向下生长,但不能覆盖代码部分。

例如

用法,假如需要汇编源程序fac2_1.asm,则输入ml_makecom.bat fac2_1, 即可生成文件fac2_1.com.


Jz next

com格式的可执行文件,所有数据必须位于1个64K的地址空间。这个64K的空间可划分为4个部分:

inc cx ;机器码:1字节

以下指令序列占用5byte

sub cl,'0'


浏览次数:
最新文章
·传奇外传激活码 阶乘之计算从入门到精通
·动物保护组织“动物保护沙龙”的与会人
·传奇外传私 郑州人一辈子不吃完这些就太
·近期并没有外国媒体的相关报道再回到笑
·传世sf加速外挂 如何将java中的反斜线替
·又是处于数码顶峰的产品那能买得起i产品
·中山破天一剑sf称peoplecnGB1456
·网通传世私服 音频 - szu030606的专栏
·新传奇外传外挂 很经典话,随便一句都可
·仿盛大传世私服 何日君再来 - 在线观看
热门文章
·传奇外传激活码 阶乘之计算从入门到精通
·动物保护组织“动物保护沙龙”的与会人
·传奇外传私 郑州人一辈子不吃完这些就太
·近期并没有外国媒体的相关报道再回到笑
·传世sf加速外挂 如何将java中的反斜线替
·又是处于数码顶峰的产品那能买得起i产品
·中山破天一剑sf称peoplecnGB1456
·网通传世私服 音频 - szu030606的专栏
·新传奇外传外挂 很经典话,随便一句都可
·仿盛大传世私服 何日君再来 - 在线观看
Copyright 2003-2009 传奇1.76私服 http://SANSUI-IT.COM/ All Rights Reserved (注:本站只投放1.76传奇私服)
请使用1024*768分辨率浏览本站以达到最佳视觉效果
备案号:赣ICP备08001576号