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

学习高手的代码风格之(一)---strlen反汇编分析 [toc] 开个新坑,分析一些高端代码的反汇编程序,先从常见的下手,分析一下strlen。 函数介绍 size_t strlen( const char *string ); 非常常用的一个函数,看起来应该很简单,所以从它下刀子了。 Return Value Each of these functions returns the number of characters in stri... 阅读详情

©CVC电脑病毒论坛 -- 中国毒客的快乐天地  4
作者:Randall HydebxLj
  http://webster.cs.ucr.edu/ 

节选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标准库的高级特性来使得编码更为简单并使得打印输出字符串的语句保持它们的字面意思。

 
 


 

汇编语言代 码 风 格(Code style).chm 代 码 风 格(1) 随着程序功能的增加和版本的提高,程序越来越复杂,源文件也越来越多,风格规范的源程序会对软件的升级、修改和维护带来极大的方便,要想开发一个成熟的软件产品,必须在编写源程序的时候就有条不紊,细致严谨。 在编程中,在程序排版、注释、命名和可读性等问题上都有一定的规范,虽然编写可读性良好的代码并不是必然的要求(世界上还有难懂代码比赛,看谁的代码最不好读懂!),但好的代码风格实际上是为自己将来维护和使用这些代码节省时间。本节就是对汇编语言代码风格的建议。 变量和函数的命名 1. 匈牙利表示法 匈牙利表示法主要用在变量和子程序的命名,这是现在大部分程序员都在使用的命名约定。“匈牙利表示法”这个奇怪的名字是为了纪念匈牙利籍的Microsoft程序员Charles Simonyi,他首先使用了这种命名方法。 匈牙利表示法用连在一起的几个部分来命名一个变量,格式是类型前缀加上变量说明,类型用小写字母表示,如用h表示句柄,用dw表示double word,用sz表示以0结尾的字符串等,说明则用首字母大写的几个英文单词组成,如TimeCounter,NextPoint等,可以令人一眼看出变量的含义来,在汇编语言中常用的类型前缀有: b 表示byte w 表示word dw 表示dword h 表示句柄 lp 表示指针 sz 表示以0结尾的字符串 lpsz 表示指向0结尾的字符串的指针 f 表示浮点数 st 表示一个数据结构 这样一来,变量的意思就很好理解: hWinMain 主窗口的句柄 dwTimeCount 时间计数器,以双字定义 szWelcome 欢迎信息字符串,以0结尾 lpBuffer 指向缓冲区的指针 stWndClass WNDCLASS结构 … 很明显,这些变量名比count1,abc,commandlinebuffer和FILEFLAG之类的命名要易于理解。由于匈牙利表示法既描述了变量的类型,又描述了变量的作用,所以能帮助程序员及早发现变量的使用错误,如把一个数值当指针来使用引发的内存页错误等。 对于函数名,由于不会返回多种类型的数值,所以命名时一般不再用类型开头,但名称还是用表示用途的单词组成,每个单词的首字母大写。Windows API是这种命名方式的绝好例子,当人们看到ShowWindow,GetWindowText,DeleteFile和GetCommandLine之类的API函数名称时,恐怕不用查手册,就能知道它们是做什么用的。比起int 21h/09h和int 13h/02h之类的中断调用,好处是不必多讲的。 2. 对匈牙利表示法的补充 使用匈牙利表示法已经基本上解决了命名的可读性问题,但相对于其他高级语言,汇编语言有语法上的特殊性,考虑下面这些汇编语言特有的问题: ● 对局部变量的地址引用要用lea指令或用addr伪操作,全局变量要用offset;对局部变量的使用要特别注意初始化问题。如何在定义中区分全局变量、局部变量和参数? ● 汇编的源代码占用的行数比较多,代码行数很容易膨胀,程序规模大了如何分清一个函数是系统的API还是本程序内部的子程序? 实际上上面的这些问题都可以归纳为区分作用域的问题。为了分清变量的作用域,命名中对全局变量、局部变量和参数应该有所区别,所以我们需要对匈牙利表示法做一些补充,以适应Win32汇编的特殊情况,下面的补充方法是笔者提出的,读者可以参考使用: ● 全局变量的定义使用标准的匈牙利表示法,在参数的前面加下划线,在局部变量的前面加@符号,这样引用的时候就能随时注意到变量的作用域。 ● 在内部子程序的名称前面加下划线,以便和系统API区别。 如下面是一个求复数模的子程序,子程序名前面加下划线表示这是本程序内部模块,两个参数——复数的实部和虚部用_dwX和_dwY表示,中间用到的局部变量@dwResult则用@号开头: _Calc proc _dwX,_dwY local @dwResult finit fild _dwX fld st(0) fmul ;i * i fild _dwY fld st(0) fmul ;j * j fadd ;i * i + j * j fsqrt ;sqrt(i * i + j * j) fistp @dwResult ;put result mov eax,@dwResult ret _Calc endp 本书中所有的示范源代码采用的都是这样的命名约定。 代码的书写格式 1. 排版方式 程序的排版风格应该遵循以下规则。 首先是大小写的问题,汇编程序中对于指令和寄存器的书写是不分大小写的,但小写代码比大写代码便于阅读,所以程序中的指令和寄存器等要采用小写字母,而用equ伪操作符定义的常量则使用大写,变量和标号使用匈牙利表示法,大小写混合。 其次是使用Tab的问题。汇编源程序中Tab的宽度一般设置为8个字符。在语法上,指令和操作数之间至少有一个空格就可以了,但指令的助记符长度是不等长的,用Tab隔开指令和操作数可以使格式对齐,便于阅读。如: xor eax,eax fistp dwNumber xchg eax,ebx 上述代码的写法就不如下面的写法整齐: xor eax,eax fistp dwNumber xchg eax, ebx 还有就是缩进格式的问题。程序中的各部分采用不同的缩进,一般变量和标号的定义不缩进,指令用两个Tab缩进,遇到分支或循环伪指令再缩进一格,如: .data dwFlag dd ? .code start: mov eax,dwFlag .if dwFlag == 1 call _Function1 .else call _Function2 .endif … 合适的缩进格式可以明显地表现出程序的流程结构,也很容易发现嵌套错误,当缩进过多的时候,可以意识到嵌套过深,该改进程序结构了。 立即下载

相关推荐

如何设计QR反激变换器

摘要:本文分析了基于GaN技术的PD适配器市场现状,重点探讨了准谐振反激变换器(QR Flyback)的工作原理及设计方法。文章首先介绍了反激变换器的三种工作模式(CCM、DCM、CRM/QR)及其特点,指出QR模式通过谷底开通技术能显著降低开关损耗。随后以65W适配器为例,详细阐述了变压器参数设计流程,包括匝比确定、原边电感计算和绕组匝数设计等关键步骤。文章强调QR反激变换器凭借高效率、小体积和低成本优势,已成为20W-65W PD适配器的主流拓扑方案,配合GaN技术进一步提升了功率密度和便携性。

m0_62868254的博客 1499

程序风格总结

1.C语言的编程风格要求: 第一章:缩进格式&nbsp;   Tab是8个字符,于是缩进也是8个字符.有很多怪异的风格,他们将缩进格式定义为4个字符(设置为2个字符!)的深度,这就象试图将PI定义为3一样让人难以接受.&nbsp;   理由是:缩进的大小是为了清楚的定义一个块的开始和结束.特别是当你已经在计算机前面呆了20多个小时了以后,你会发现一个大的缩进格式使得你对程序的理解更容易.&nbsp...

qq_43185543的博客 1357

【生物识别模组介绍】静脉识别模组

静脉识别技术是依据流动的静脉血液中的血红蛋白对近红外光有所吸收,通过近红外光照射手指、手掌、面部、腕部呈现的分布图像,再使用特定的算法对图像进行特征提取、分析比对,从而进行身份认证识别。静脉结构相同几率为34亿分之一,每个人的静脉结构具有独特性,而且静脉特征图像自成年后终身不变,不受外部环境、疾病等影响,是人体最稳定的生物特征之一。商务合作联系:newmagicmission@gmail.com图1.0。

upupDay's blog 902

汇编程序员、机器程序员、系统程序员和应用程序员

汇编程序员、机器程序员、系统程序员和应用程序员。汇编程序员专门使用汇编语言进行编程,负责将汇编语言转换为机器语言指令,并优化和调试代码。机器程序员则直接编写机器语言(二进制代码),但现代计算机编程中已非常罕见,更多是指对计算机底层硬件和机器语言有深入了解的程序员。系统程序员负责设计和开发计算机系统软件,如操作系统、数据库管理系统等,并对系统软件进行调试和优化。应用程序员则负责开发各种应用程序,如办公软件、游戏等,使用高级编程语言进行编程,并持续优化应用程序的性能和用户体验。

buwangchuxinking的博客 958

【谷粒商城】分布式事务与下单

=购物车== 构建gulimall-cart,复制静态资源到nginx,修改网关 购物车分为离线购物车和登录购物车 离线购物车重启浏览器了也还有 1、购物车需求 特点:读多写少,放入数据库并不合适 登录状态:登录购物车 放入数据库 mongodb 放入redis(采用) 登录以后,将离线购物车里合并后清空离线购物车 未登录状态:离线购物车 放入localstorage浏览器的技术 cookie WebSQL 放入redis(采用) 浏览器重启后还在 2、购物车VO (1) 数据结构分析

努力充实,远方可期 1万+

构建具有预测维护能力的AI Agent

随着工业4.0的推进,工业设备的复杂性和自动化程度不断提高,设备的稳定运行对于企业的生产效率和经济效益至关重要。预测维护作为一种先进的设备维护策略,能够通过对设备状态的实时监测和分析,提前预测设备故障,从而避免设备意外停机,降低维护成本。本文的目的是详细阐述如何构建具有预测维护能力的AI Agent,涵盖从数据采集、处理、模型训练到实际应用的整个流程,为企业和开发者提供全面的技术指导。本文将按照以下结构进行组织:首先介绍核心概念与联系,包括预测维护和AI Agent的基本原理和架构;

2501_92132293的博客 943

ExcelCPU汇编程序编写规范:代码组织与最佳实践

ExcelCPU是一个创新的16位CPU模拟器项目,完全在Excel中实现。这个开源项目为学习计算机体系结构和汇编语言编程提供了独特的实践平台。本文将详细介绍ExcelCPU汇编程序的编写规范、代码组织结构和最佳实践方法,帮助开发者编写高质量、可维护的汇编代码。 ## 🎯 项目架构概览 ExcelCPU项目包含多个核心组件,每个部分都有其特定的功能: - **CPU核心定义**:[CPU.

gitblog_00280的博客 1054

Linux ARM平台开发系列讲解(摄像头V4L2子系统) 2.12.5 V4L2 control的原理和实现

既然涉及到视频输入,就会有很多与 相关的效果,比如对比度、饱和度、色温、白平衡等等,这些都是通用的、必须的控制项,并且大多数仅需要设置一个整数值即可。 内核中已经为我们提供了这个控制类型的,我们只需要明确自己需要添加什么控制类型,然后将其添加进内核中即可。该部分摄像头代码一半厂家会提供驱动或者相对应的参数,否则没有图像处理知识很难开发出来。 返回总目录...

DSMGUOGUO的博客 1437

NASM快速入门:5分钟学会你的第一个汇编程序

NASM(Netwide Assembler)是一款功能强大的跨平台x86汇编器,采用类似Intel语法的简洁设计。作为开源汇编工具,NASM支持多种目标文件格式,包括Linux/BSD a.out、ELF、Mach-O、COFF以及纯二进制文件。本指南将带你快速上手NASM,在5分钟内完成你的第一个汇编程序! ## 🚀 为什么选择NASM汇编器? NASM是一个高度可移植的x86/x86-

gitblog_00235的博客 817

【图像超分】论文复现:经典超分 | SAN的Pytorch源码复现,跑通源码,适配高版本的python/pytorch/cuda,使用EDSR-PyTorch进行训练和测试

本文介绍了单幅图像超分辨率重建方法SAN(二阶注意网络)的代码实现。文章详细说明了在高版本Python/Pytorch环境下适配SAN源码的方法,并提供了修改后的完整代码和预训练模型下载链接。 主要亮点包括: 将SAN模型实现整合到EDSR-Pytorch框架中,解决了高版本环境下的兼容性问题 提供了完整的数据集准备指南(DIV2K训练集和5个测试集) 给出了详细的测试命令,涵盖x2、x3、x4不同放大倍率 公开了预训练模型和可视化结果的下载资源 提供了修改后的适配高版本环境的代码。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1414

【TC3xx芯片】TC3xx DMA模块详解

TC3xx DMA模块详解

qq_36056498的博客 5920

一个很简单的Win32汇编程序

写这个程序的目的很明确就是为了学习Win32汇编的,记录下自己的学习过程,感觉学程序设计语言必须学会对比,这样才能够学得更好和更加有目的性,通过对比来发现哪些地方是不足或者是更好的。代码12;文件名msgbox.asm3;作者StudyRush4;创建时间2010-11-145;修改时间2010-11-146;函数功能用于显示一个窗口和在里面显...

weixin_30384031的博客 133

基于STM32的室内环境监测系统设计与实现

摘要 本文设计了一种基于STM32的室内环境监测系统,通过传感器实时采集温湿度、空气质量、烟雾浓度等数据,并利用Wi-Fi模块上传至云服务器。系统采用STM32F103C8T6作为主控芯片,结合DHT11、MQ系列传感器及BMP280气压传感器实现数据采集,通过ESP8266模块实现远程数据传输。用户可通过手机APP实时查看环境参数,并在数据超标时触发报警。实验表明,系统运行稳定,监测精度高,具有低成本、易扩展等特点,为改善室内环境质量提供了有效解决方案。 关键词:STM32;室内环境监测;传感器;Wi-F

3254968421的博客 221

《汇编程序语言》目录

以下是不同版本《汇编语言程序设计》的详细目录:

qq_40844444的博客 572

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C#编码规范

原作者:Mike Krueger  January 4, 2002来  源:在电驴搜索下载得到译  者:jhkdiy  邮  箱:jhkdiy_gzb@21cn.net主  页:http://jhkdiy.icpcn.com    http://jhkdiy.programfan.com   开始时间:2008-2-27结束时间:2008-2-28说明:    C# 的确是.Net开发中的新宠儿,

jhkdiy的优快云 552

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

c++ 初始化列表_进行汇编和 C的混合编程

8051 上使用汇编和 C 1 介绍在一些时候你会发现不得不使用汇编来编写程序 而不是使用高级语言 而大多数情况下 汇编程序能和用 C 编写的程序很好的结合在一起 这章将告诉你如何进行汇编和 C的混合编程 并且如何修改由 C 程序编译后的汇编代码 从而精确的控制时间2 增加段和局部变量要把汇编程序加入到 C 程序中 你必须使你的汇编程序像 C 程序 这就是说要和 C 程序一样有明确的边界...

weixin_39866265的博客 80

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

汇编学习3

前言 和汇编2的所要实现的东西一样,只是换了另外一种实现方法(更简洁),从而学习一些新的知识,新的指令。 代码展示 1 ;代码清单6-1 2 ;文件名:c06_mbr.asm 3 ;文件说明:硬盘主引导扇区代码 4 ;创建日期:2011-4-12 22:12 5 6 jmp near start ;相对偏移,跳到start块地方 7 8 mytext db ‘L’,0x07,‘a’,0x07,...

yangmyangs的博客 1998

C#判断奇偶数的函数

//现代流行的"程序员"publicstaticboolIsOdd(intn){while(true){switch(n){case1:returntrue;case0:returnfalse;}n-=2;}}//中规中矩的程...

weixin_30702413的博客 262

《WINDOWS 环境下32位汇编语言程序设计》第3章 使用MASM

本章主要介绍MASM的使用,内容包括:Win32汇编源程序的结构、调用API、标号,变量和数据结构、使用子程序、高级语法和代码风格。

chenyijun的专栏 976

RARS未来发展路线图:新功能预告与社区贡献指南

RARS(RISC-V Assembler and Runtime Simulator)作为一款面向RISC-V架构的汇编器与运行时模拟器,自2017年从MARS迁移而来,已成为开发者学习和调试RISC-V汇编程序的核心工具。本文将揭秘RARS的未来功能规划,并提供完整的社区贡献指南,帮助开发者快速参与项目共建。 ## 🌟 核心功能演进路线 ### 1. 指令集扩展与架构支持 RARS目前已

gitblog_00663的博客 1141

编程学习基本路线指南(windows)

 1:如果你能够熟练的使用Windows的话,你就可以开始你的程序生涯了!   2:首先从C语言开始。有的朋友可能认为C语言太难了,应该从VB开始。虽然,对于一个初学者来说,用一些控件堆砌成一个小软件,是有一些成就感,但是,基础才是最重要的!C语言对于数据类型的描叙,远...

chenjiuwu6074的博客 1252

如何快速上手RISC-V汇编开发?30分钟入门实战教程

RISC-V汇编开发是进入嵌入式系统和底层编程领域的重要技能。本教程将以**RISC-V Assembly Programmer's Manual**为核心参考,带您在30分钟内掌握基础开发流程,从环境搭建到编写第一个汇编程序,轻松入门RISC-V汇编世界。 ## 📋 准备工作:环境搭建指南 ### 1. 安装RISC-V工具链 首先需要安装RISC-V交叉编译工具链,包含汇编器、链接器和模

gitblog_00573的博客 362
上一篇: 汇编与C配合
下一篇: Bypassing Raw File System I/O Rootkit Detector
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值