1 changed files with 241 additions and 0 deletions
			
			
		| @ -0,0 +1,241 @@ | ||||
| # MASM Styleguide and Resource List | ||||
| 
 | ||||
| The Microsoft Assembler (MASM) is a popular assembler for Windows platforms. Unsurprisingly, there has been very few | ||||
| notable projects in MASM in the last decade. Small, fast code just isn't as important as it used to be. Still, it is | ||||
| a very interesting exercise to learn MASM and use it. It's difficult to get binary sizes smaller than you can with | ||||
| raw assembly. Additionally, if you're in the world of reverse engineering, programming in assembly keeps your | ||||
| languages consistent. | ||||
| 
 | ||||
| 
 | ||||
| ## Table of Contents | ||||
| 
 | ||||
| 1. [Getting Started](#getting-started) | ||||
|   1. [The Assembler](#the-assembler) | ||||
|   2. [IDEs](#ides) | ||||
|   3. [VIM Plugins](#vim-plugins) | ||||
|   4. [Visual Studio Code Extensions](#visual-studio-code-extensions) | ||||
| 2. [Tutorials](#tutorials) | ||||
| 3. [Styleguide](#styleguide) | ||||
|   1. [Tabs vs. Spaces](#tabs-vs-spaces) | ||||
|   2. [Line Length](#line-length) | ||||
|   3. [Commenting](#commenting) | ||||
|   4. [Include Ordering](#include-ordering) | ||||
|   5. [Case Sensitivity](#case-sensitivity) | ||||
|   6. [Section Names](#section-names) | ||||
|   7. [Variable Names](#variable-names) | ||||
|   8. [Functions](#functions) | ||||
|   9. [Function Prototypes](#function-prototypes) | ||||
|   10. [Section](#section) | ||||
|   11. [Type Declarations](#type-declarations) | ||||
|   12. [Project Organization](#project-organization) | ||||
| 
 | ||||
| ## Getting Started | ||||
| 
 | ||||
| You're going to want to get some development tools. Of course, it goes without saying you're going to need some flavor | ||||
| of Windows to run this stuff. Once you've acquired Windows, you will need the assembler and an IDE (optionally). | ||||
| 
 | ||||
| 
 | ||||
| ### The Assembler | ||||
| 
 | ||||
| The most popular variant of MASM is [MASM32](http://www.masm32.com). It's more or less an all in one package for | ||||
| coding assembly programs on Windows. One caveat - you'll need Windows 2000 or greater. This guide will focus on | ||||
| MASM32 primarily. Suggestions here should be easily ported to other variants. | ||||
| 
 | ||||
| ### IDEs | ||||
| 
 | ||||
| Thanks to the popularity of MASM, there are a few IDE choices if you choose to go that route. They are helpful, in that | ||||
| they handle assembling and linking for you. However, it's honestly something you can handle with a script. | ||||
| 
 | ||||
| #### WinAsm Studio | ||||
| 
 | ||||
| [WinAsm Studio](http://www.winasm.net) is arguably the most popular IDE for writing assembly code on Windows | ||||
| (as far as I've known). As it stands, I've had difficulty creating a new account on their forum to download the | ||||
| IDE. Unfortunately, they "account wall" the download so if you can't make an account you won't get the download. It's | ||||
| quite silly. | ||||
| 
 | ||||
| #### VisualMASM | ||||
| 
 | ||||
| [VisualMASM](http://www.visualmasm.com/) is another popular IDE. It's tailored to MASM and has the look and feel of | ||||
| a modern IDE. The most frustrating aspect is that there's no option to create a blank project. So if you're using | ||||
| a template, you're going to need to delete the base code that comes with the project to get anywhere. I have | ||||
| [an issue](https://github.com/ThomasJaeger/VisualMASM/issues/5) on the VisualMASM github to address this. | ||||
| 
 | ||||
| ### VIM Plugins | ||||
| 
 | ||||
| VIM has pretty good support for assembly programming out of the box. I couldn't find any plugins that made programming | ||||
| any easier. | ||||
| 
 | ||||
| ### Visual Studio Code Extensions | ||||
| 
 | ||||
| [x86 and x86_64 Assembly](https://marketplace.visualstudio.com/items?itemName=13xforever.language-x86-64-assembly) seems | ||||
| to be the most popular extension for Visual Studio Code when it comes to developing in assembly. | ||||
| 
 | ||||
| ## Tutorials | ||||
| 
 | ||||
| The most popular set of tutorials for MASM32 is [Iczelion's Tutorial Series](http://www.win32assembly.programminghorizon.com/tutorials.html). | ||||
| There is a `.CHM` version of these tutorials available on the [WinAsm website](http://www.winasm.net/iczelion-tutorials.html). | ||||
| 
 | ||||
| ## Styleguide | ||||
| 
 | ||||
| The styleguide is a work in progress. As I find more pretty ways to write assembly code I will put them here. I've | ||||
| gathered over my time writing MASM code that every developer does things differently. This makes it incredibly | ||||
| frustrating to try and read another developer's code. | ||||
| 
 | ||||
| _PS: It would be really cool if someone wrote a linter that checked for these things. Maybe I'll get around to it | ||||
| one of these days._ | ||||
| 
 | ||||
| ### Tabs vs. Spaces | ||||
| 
 | ||||
| TODO | ||||
| 
 | ||||
| ### Line Length | ||||
| 
 | ||||
| Prefer 120 characters. MASM has a hard limit of 255 characters per line according to | ||||
| [this post on MASM Forum](http://www.masmforum.com/board/index.php?topic=12506.msg96273). Many times prototypes and | ||||
| function invocations can have very long line lengths. For these, use `\` to split your code across multiple lines. | ||||
| 
 | ||||
| ### Commenting | ||||
| 
 | ||||
| TODO | ||||
| 
 | ||||
| ### Include Ordering | ||||
| 
 | ||||
| As a matter of style, prefer to put all `.inc` files together and all `.lib` files together. Sort them alphabetically, | ||||
| and separate them by a single blank line. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| ```asm | ||||
| include \masm32\include\kernel32.inc | ||||
| include \masm32\include\user32.inc | ||||
| include \masm32\include\windows.inc | ||||
| 
 | ||||
| includelib \masm32\include\kernel32.lib | ||||
| includelib \masm32\include\user32.lib | ||||
| ``` | ||||
| 
 | ||||
| ### Case Sensitivity | ||||
| 
 | ||||
| *Always* use the `option casemap:none` option. This prevents the assembler from thinking `MyFunction` is the same as | ||||
| `myfunction`, which will save you a lot of headaches. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| ```asm | ||||
| .386 | ||||
| .MODEL flat, stdcall | ||||
| option casemap:none | ||||
| include \masm32\include\windows.inc | ||||
| include \masm32\include\kernel32.inc | ||||
| includelib \masm32\lib\kernel32.lib | ||||
| .DATA | ||||
| .CODE | ||||
| start: | ||||
|   invoke ExitProcess,0 | ||||
| end start | ||||
| ``` | ||||
| 
 | ||||
| ### Section Names | ||||
| 
 | ||||
| Prefer uppercase section names. This will help differentiate them from the rest of the code at a quick glance. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| ```asm | ||||
| .386 | ||||
| .MODEL flat, stdcall | ||||
| option casemap:none | ||||
| include \masm32\include\windows.inc | ||||
| include \masm32\include\kernel32.inc | ||||
| includelib \masm32\lib\kernel32.lib | ||||
| .DATA | ||||
| .CODE | ||||
| start: | ||||
|   invoke ExitProcess,0 | ||||
| end start | ||||
| ``` | ||||
| 
 | ||||
| ### Variable Names | ||||
| 
 | ||||
| TODO - Once this is clarified be sure to update any variable names in every section to reflect this change. | ||||
| 
 | ||||
| 
 | ||||
| ### Functions | ||||
| 
 | ||||
| When writing functions, indent the body of the function so it is easily differentiated from other code levels. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| ```asm | ||||
|    WinMain proc hInst: HINSTANCE, CmdLine: LPSTR, CmdShow: DWORD | ||||
|     ; Code goes here... | ||||
| 
 | ||||
|     Ret | ||||
|   WinMain EndP | ||||
| ``` | ||||
| 
 | ||||
| Additionally, place your functions towards the bottom of your code section. This keeps your actual code uncluttered, | ||||
| and all of your functions in one easy to find place. | ||||
| 
 | ||||
| ### Function Prototypes | ||||
| 
 | ||||
| In order to allow the use of functions at the bottom of your code you need to declare function prototypes above | ||||
| the invoking code. | ||||
| 
 | ||||
| Place prototypes after all includes, and leave two empty lines between the includes and prototypes. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| ```asm | ||||
| include \masm32\include\kernel32.inc | ||||
| include \masm32\include\user32.inc | ||||
| include \masm32\include\windows.inc | ||||
| 
 | ||||
| includelib \masm32\include\kernel32.lib | ||||
| includelib \masm32\include\user32.lib | ||||
| 
 | ||||
| 
 | ||||
| WinMain proto :DWORD, :DWORD, :DWORD, :DWORD | ||||
| ``` | ||||
| 
 | ||||
| ### Function Arguments | ||||
| 
 | ||||
| Whether you are calling a function or writing an implementation, make sure to put a single space after each comma | ||||
| delimited argument. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| ```asm | ||||
|   WinMain proc hInst: HINSTANCE, CmdLine: LPSTR, CmdShow: DWORD | ||||
| ``` | ||||
| 
 | ||||
| ### Sections | ||||
| 
 | ||||
| In order to improve readability, indent the code in each section one level to differentiate it from the section name. | ||||
| This makes it so, when combined with all uppercase section names, It is easier to distinguish where you are in the code. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| ```asm | ||||
| .CODE | ||||
|   start: | ||||
|     invoke ExitProcess, 0 | ||||
|   end start | ||||
| ``` | ||||
| 
 | ||||
| ### Type Declarations | ||||
| 
 | ||||
| Put one space after the `:` in an argument's type declaration in order to improve readability. This goes the same | ||||
| for local variable type declarations. | ||||
| 
 | ||||
| Examples: | ||||
| 
 | ||||
| ```asm | ||||
|   WinMain proc hInst: HINSTANCE, CmdLine: LPSTR, CmdShow: DWORD | ||||
|     LOCAL wc: WNDCLASSEX | ||||
|     ; ... | ||||
| ``` | ||||
| 
 | ||||
| ### Project Organization | ||||
| 
 | ||||
| TODO | ||||
					Loading…
					
					
				
		Reference in new issue