论坛: 编程破解 标题: 《汇编程序员之代码风格指南》全部翻译完毕并提供下载。 复制本贴地址    
作者: jhkdiy [jhkdiy]    版主   登录
Style Guidelines for Assembly Language Programmers
汇编程序员之代码风格指南


作者:Randall Hyde
  http://webster.cs.ucr.edu/  
译者:jhkdiy
        http://jhkdiy.icpcn.com     or  http://www.20cn.net    
e-mail:jhkdiy_gzb@21cn.net
译期:开始于06年7月4号。结束于8月31日
原文总页数:42页。译文总页数:60页。
   

    大家知道这位作者吗?不知道?晕••••。那看过《The Art of Assembly Language》一书吗?该书的作者就是Randall Hyde。
这本书在国外有很高的评价,以至于国内也有了翻译的版本:《汇编语言编程艺术》。由陈曙晖翻译,我买了但还没看^_^!。这份代码风格指南是我在作者主页里找到的,有空就去浏缆一下吧,或许有意外收获哦!
    在这漫长的翻译旅途中,自己也是一边翻译一边学习该文档的。翻译完后觉得要写出一个易读的程序其实并不容易,但也不是很难,只要自己坚持遵循该文档的话就可以尽能地做到程序易读了。自己学习汇编语言也有一段时间了,却很少在网上的论坛见到过非常易读的汇编程序,绝大一部分是没有任何注释、带有一大堆a、b、d等变量名的难读程序,有一次看到有人特意将整个C语言源代码改成像文字画一样我就跟他吵了起来。无论是汇编也好、C语言或其它语言也好,很多编程的朋友都不把代码的易读性放在眼里,有的甚至从来不考虑,只要代码能执行起来,程序运行起来就算完事了。更有的程序员为编写难读的代码而自我臭美。而大学里教授编程语言的时候,很少有老师对程序的易读性做过教导或建议,以至于学生们从一开始便没有编写易读代码的意识,这在一定程度上增加了编写难读程序的人员。代码是拿来读的,为了能更快更容易地阅读代码,我们必定要遵循一定的规则。
    我真心希望越来越多的朋友能写出可读性好的代码,就算将代码发表到全世界,只要学过该语言的人都能看懂中国人编写的程序,因为它深具可读性,读代码像读诗篇一样流畅而自然。希望这一天早日到来!
                                              jhkdiy
                                                  2006-8-31


《汇编程序员之代码风格指南》

目录:

1.0简介

          1.1 ADDHEX.ASM

          1.2 Graphics Example

          1.3 S.COM 例子

          1.4本文面向的读者

          1.5可读性标准

          1.6怎样做到可读性

          1.7这份文档的组织

          1.8指导、 规则、强制性规则、和例外

          1.9 涉及的语言

2.0程序组织

              2.1库函数

              2.2公共目标模块

              2.3局部模块

              2.4程序的make文件

3.0 模块组织

              3.1模块属性

              3.1.1模块内聚性

              3.1.2模块耦合性

              3.1.3模块的物理组织

              3.1.4模块接口

4.0程序单元组织

              4.1例程内聚性

                            4.1.1例程耦合性

                            4.1.2例程大小

              4.2主过程和数据的安排

5.0语句组织

6.0注释

              6.1什么是一个坏注释?

              6.2什么是一个好注释?

              6.3行终止注释VS独立注释

              6.4未完成的代码

              6.5代码交叉参考到其它文档

7.0名称、指令、操作数和操作                   

        7.1名称

                            7.1.1命名约定

                            7.1.2字母大小写考虑

                            7.1.3缩略语

                            7.1.4标志符内的成分位置

                            7.1.5要避免的名称

              7.2指令、伪指令和伪操作码

                            7.2.1选择最好的指令序列

                            7.2.2控制结构

                            7.2.3同意义的指令



8.0数据类型     

              8.1用TYPEDEF定义新的数据类型

              8.2创建数组类型

              8.3在汇编语言里声明结构体

              8.4数据类型的UCR标准库




因该网站使用了防止盗链技术,请下载文件的朋友使用下载工具进行下载,切勿使用右键另存为!

 
高清晰PDF文件下载
 



[此贴被 jhkdiy(jhkdiy) 在 08月31日14时02分 编辑过]

地主 发表时间: 06-08-18 14:16

回复: jhkdiy [jhkdiy]   版主   登录
节选1.0 和 1.1:
1.0简介
        许多人认为汇编程序难于阅读。虽然大家有这种感觉有许多原因,但最主要的还是汇编语言难以使得程序员写出易读的程序。这并不表示不可能编写出易读的程序,只是它要花费汇编程序员一部分额外的工作来写出易读代码。
    为了示范汇编程序的一些公共问题,决定使用下面的程序或程序段。这些都是在Internet上找到的真正用汇编语言编写的程序。每个例子都示范了一个单独的问题。(顺便一提:选择这些程序并不是有意让原作者难吭。这些程序都是在网上找到的汇编代码特例)。

代码:

1.1ADDHEX.ASM
%TITLE "两个16进制数相加"
        IDEAL
        DOSSEG
        MODEL  small
        STACK  256
        DATASEG
exitCode        db      0
prompt1        db      'Enter value 1: ', 0
prompt2        db      'Enter value 2: ', 0
string          db      20 DUP (?)
        CODESEG
        EXTRN  StrLength:proc
        EXTRN  StrWrite:proc, StrRead:proc, NewLine:proc
        EXTRN  AscToBin:proc, BinToAscHex:proc
Start:
        mov    ax,@data
        mov    ds,ax
        mov    es,ax
        mov    di, offset prompt1
        call    GetValue
        push    ax
        mov    di, offset prompt2
        call    GetValue
        pop    bx
        add    ax,bx
        mov    cx,4
        mov    di, offset string


        call    BinToAscHex
        call    StrWrite
Exit:
        mov    ah,04Ch
        mov    al,[exitCode]
        int    21h
PROC    GetValue
        call    StrWrite
        mov    di, offset string
        mov    cl,4
        call    StrRead
        call    NewLine
        call    StrLength
        mov    bx,cx
        mov    [word bx + di], 'h'
        call    AscToBin
        ret
ENDP    GetValue
        END    Start


    好了,这个程序的最大问题还是相当明显的-除了标题之外完全没有其它注释(译注:国内有太多这样没注释的程序了)。另一个实际的问题则是用来提示用户的字符串出现在程序的一端但用来打印这些字符串的调用代码却出现在另外一个地方(译注:即指代码中的StrWrite等三个函数)。尽管这是个经典的汇编语言编程方法,但却导致了代码难于阅读。另外,相对次要的一个问题是该程序使用了TASM的 “less-than”IDEAL
语法(注:一些一直使用TASM的人会认为这没什么不好。但个别人就不这么认为了,由于他们不熟悉TASM的古怪语言,有时会导致被程序中的几条语句搞混淆)
    这个程序也使用了MASM/TASM的“简单化”段定义。微软声称的这个典型特性却给一个“简单”的工程增加了复杂性。如果该程序转换为标准的段定义格式将会更加易读。
(注:使用简单段定义虽然更容易编写高级语言接口的汇编程序,但无论如何,他们都只会使单一的程序问题变得复杂)
    在扔掉它之前,该程序还是有两点值得称赞的(遵循了可读性)。第一,该程序员为过程名和本程序使用的变量选择了一组合理的名称(我假定这段代码的作者同时也是该程序调用的库的作者)。程序另一个值得肯定的是助记性好和操作数之间有良好的对齐。
    OK,在抱怨这份代码如何难读后,为什么不来个更易读的版本?下面的程序便是,可证明,该版本比上面的版本更加易读。可证明,因为该版本使用了UCR标准库v2.O
并假定读者熟悉该库的细节和特性。
代码:

;**************************************************
;
; AddHex-
;
; 这个简单的程序从用户那里获取两个整数值,计算它们的和,
; 并在屏幕上打印结果。
;
; 这个例子使用了“80x86汇编程序员的UCR标准库v2.0”
;
; Randall Hyde
; 12/13/96
                title          AddHex
                .xlist
                include        ucrlib.a
                includelib      ucrlib.lib
                .list
cseg            segment para public 'code'
                assume  cs:cseg
; GetInt-
;
; 这个函数从键盘读取一个整数并将结果返回到AX寄存器中
;
; 该程序捕获无效的值(太大或无效数字)并需要用户重新输入一个数值。
;

GetInt          textequ <call GetInt_p>
GetInt_p        proc
                push    dx              ;DX 保存错误代码
GetIntLoop:    mov    dx, false      ;假定没错误
                try                    ;捕获任何可能的错误
                FlushGetc              ;清空输入来换新行
                geti                    ;读入整数值
                except  $Conversion    ;捕获错误字符
                print  "Illegal numeric conversion, please re-enter", nl
                mov    dx, true
               
                except  $Overflow      ;捕获数值太大
                print  "Value out of range, please re-enter.",nl
                mov    dx, true
                endtry
                cmp    dx, true
                je      GetIntLoop
                pop    dx
                ret
GetInt_p        endp

Main            proc
                InitExcept
                print  'Enter value 1: '
                GetInt
                mov    bx, ax
                print  'Enter value 2: '
                GetInt
                print  cr, lf, 'The sum of the two values is '
                add    ax, bx
                puti
                putcr
Quit:          CleanUpEx
                ExitPgm                ;退出程序的DOS宏
Main            endp

cseg            ends

sseg            segment para stack 'stack'
stk            db      256 dup (?)
sseg            ends


zzzzzzseg      segment para public 'zzzzzz'
LastBytes      db      16 dup (?)
zzzzzzseg      ends
                end    Main







    这里要特别指出的是这份代码比原来的那个AddHex程序要大一点。在细节上,它验证用户的输入;而在原程序上并没有这么做。如果那位想更严密地模范原程序,下面的简单代码即是:
代码:

                print  nl, 'Enter value 1: '
                Geti
                mov    bx, ax
                print  nl, 'Enter value 2: '
                Geti
                add    ax, bx
                putcr
                puti
                putcr


在这个例子中,两个简单的解决方案改良了程序的可读性:增加注释、将程序格式化得更好点,而且使用了UCR标准库的高级特性来使得编码更为简单并使得打印输出字符串的语句保持它们的字面意思。




[此贴被 jhkdiy(jhkdiy) 在 08月18日14时32分 编辑过]


[此贴被 jhkdiy(jhkdiy) 在 08月18日15时07分 编辑过]

B1层 发表时间: 06-08-18 14:23

回复: jhkdiy [jhkdiy]   版主   登录
1.5可读性标准
    有人会问“如何使得一个程序比其它程序更易读?”,换句话说,我们应该如何来衡量一个程序的“可读性”?常规的度量,“我看到一个写得很好的程序”并不是适当的;对许多人来说,这也可以转换为“如果你的程序看起来跟我的好程序很像,那么它们就是易读的,或者它们没有比我的更好”。很明显,这种琐碎的评价标准会因人而异。
    为了开发一个测量汇编语言程序可读性的标准,我们第一个要问的就是“为什么可读性如此重要?”这个问题有一个简单(虽然有点轻率)的答案:可读性很重要是因为程序是拿来读的(而且,一行代码被典型地阅读10次比写一行代码更常见)。进一步来说,考虑到许多程序都需要被其他程序员阅读和维护的事实(Steve McConnell 声称在一个真实的程序世界里程序员需要10次以上的代码维护工作,直到它们被重写;而且,他们算出在他们的工作中有60%的工作是花费在代码简单性上的)。你的程序更易读,其他人就可以用更少的时间来领会你的程序在做什么。也就是说,他们可以集中在增加新功能或纠正代码缺点上。
    为了这份文档的目的,我们定义一个“易读”程序有下列特性:
    *一个“易读”程序是一个能让有能力的程序员(一个熟悉解决程序问题的人)在没有看程序之前就能理解,而且能在最短的时间内就能完全理解整个程序。

那是个高要求!这个定义并不是说非常难达到,而一些不平凡的程序也确实达到了这个要求。该定义提出一个适当的程序员(也就是经常尝试解决程序问题的人)用他们常规的阅读方法阅读(只是一次)就能理解一个程序,并能完全理解该程序。任何小于该要求的都不是一个“易读”的程序。
    当然,在现实中,当很少程序能达到这个目标后该定义就不能用了。部分问题是因为程序倾向于相当长和需要一些人有在同一时间里在他们脑中管理大量细节的能力。而且,也不晓得一个写的好的程序会是怎样的,“一个有能力的程序员”也没有提出程序员的IQ需要高到阅读一个语句就能完全明白它的意思而无需想太多。因此,我们必须定义可读性,这并不是一个真假事实,而是一个衡量范围。尽管存在真正难读的程序,也有许多“易读”程序比其它程序难读的情况。因此,或许下面的定义更现实一点:
    * 一个由一个或多个模块组成的易读程序。符合要求的程序能做到随便选取程序中的一个模块,对程序中的每条语句平均花费不到1分钟就能理解80%。

    80%的理解程度意味着程序员能修正程序的错误和增加程序的功能而不会因为对手头上代码的误解而犯错误。


1.6怎样做到可读性
    可读程序的“我看见一个就明白一个”的度量提供了一个关于如何编写可读性好的程序的提示。在指明之前,“当我看见它就明白它的意思”的度量暗示了如果这个程序跟那个特定的人所写的(好)程序很相像,那他会个人认为这个程序可读性好。这也暗示了一个重要特性-可读性程序必须具备:一致性。如果所有的程序员都使用一致的风格来编写程序,他们会发现其他人写的程序跟自己的很相似,而且,因为这样而更易读。这个目标也是这篇文章的主要目的-建议一个所有人都会跟随的一致性标准。
    当然,一致性本身并不足够。一致性不好的程序也特别难读。因此,当个人考虑定义一个包含所有标准的准则时必须特别小心。这篇文章的目标就是创建这样一个标准。无论如何,不要因为在此时听起来不错或因为一些个人喜好而觉得出现在这篇文章中的资料很简单。这篇文章中的资料都是来自几个主题上的软件工程原文(包括《单元编程风格》、 《代码大全》、和《编写可靠代码》(译注1)),来自将近20多年的个人汇编语言编程经验,和一套从信息管理系研究得出的常规编程准则也包括在内。
    这份文档假定它的读者有一致的使用习惯。因此,它集中了许多会影响一个程序可读性的机械化的和心理上的论点。例如,大写字母要比小写字母难读(在心理学上是众所周知的结果)。它要花费人们较长的时间来认识大写字母,所以,一般人都要花费更多的时间来阅读全部用大写字母写的文章。因此,该文档建议在程序中避免使用大写字母串。许多出现在该文档的其它论点也使用相似的方式告知;这些论点建议你在写程序时可能要作些小更改来使得它更容易被其他人理解你的代码结构,以此来帮助理解程序。

-----------------------------------------------------------------------------
译注1:中文书名纯粹是我个人翻译的。包括:《Elements of Programming Style》,《Code Complete》, and 《Writing Solid Code》,我在网上查了一下,国内只出版了《Code Complete》的译本,名为《代码大全》,其它的找不到中译本,只搜索到有繁体版的《Writing Solid Code》,名为《完美程式设计指南》


[此贴被 jhkdiy(jhkdiy) 在 08月18日14时42分 编辑过]


[此贴被 jhkdiy(jhkdiy) 在 08月18日14时46分 编辑过]

B2层 发表时间: 06-08-18 14:39

回复: xsky007 [xsky007]   论坛用户   登录
哈哈,,,不错,我找了很久了,自己学汇编也有段时间了,老是觉得自己写出来的汇编很乱...
谢谢啦~~~

B3层 发表时间: 06-10-09 16:06

回复: jhkdiy [jhkdiy]   版主   登录
终于有人回贴了

B4层 发表时间: 06-10-10 00:39

回复: 月之御者 [kert_t8]   论坛用户   登录


B5层 发表时间: 06-10-24 17:53

回复: jhkdiy [jhkdiy]   版主   登录
准备翻译有关FPU的主题了。

B6层 发表时间: 06-11-05 00:45

回复: jijian1985 [jijian1985]   论坛用户   登录
顶一下!
虽然自己只学过C,但好东西就应该

B7层 发表时间: 07-02-24 21:23

回复: 子木 [lwei889]   论坛用户   登录
好久没来 ,要顶下

B8层 发表时间: 07-03-03 22:53

回复: rshu [rshu]   论坛用户   登录
几乎一年没来了,见了好东东,吐个泡泡

B9层 发表时间: 07-07-01 00:07

回复: jhkdiy [jhkdiy]   版主   登录
呵呵,谢谢支持!

B10层 发表时间: 07-07-02 01:14

回复: chenghui [chenghui]   论坛用户   登录
  好      顶             

B11层 发表时间: 07-07-07 16:30

回复: 阿茵 [good5842]   论坛用户   登录
我还是看不懂,我对编程是一无所知啊!有没有一本针对刚入门的人的编程书呢

B12层 发表时间: 07-07-10 09:44

回复: jhkdiy [jhkdiy]   版主   登录
to:阿茵
真的想学的话可以选择一门比较容易入门的编程语言,如VB,有基础后就可以学C语言。
现在市面上有很多入门书,自己感觉吧,大多数都是一样的。

B13层 发表时间: 07-07-10 12:59

回复: xqd2814 [xqd2814]   论坛用户   登录
我也想学!

B14层 发表时间: 07-07-26 23:58

回复: lateskycn [lateskycn]   论坛用户   登录
很想学习 谢谢

B15层 发表时间: 08-02-28 16:25

回复: rainer009 [rainer009]   论坛用户   登录
顶下

B16层 发表时间: 08-03-26 20:14

回复: 太阳雨 [ggmmdd]      登录
下下来学习一下

B17层 发表时间: 08-08-19 09:02

回复: zongbing [zongbing]   论坛用户   登录
顶啊

B18层 发表时间: 09-04-14 23:20

回复: 色狼 [mw28628332]   论坛用户   登录
这个好像失效咯哦

B19层 发表时间: 09-10-19 01:21

回复: heyc [hyc723]   论坛用户   登录
下不了了 发个给我吧 想学 422844202@qq.com  XX

B20层 发表时间: 12-05-08 18:20

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号