|   | 
	
	
		|   | 
	
	
		| Assembly Programming: A Beginners Guide | 
	
	
		| Author:
		Amit Malik  | 
	
	
		|   | 
	
	
		|   | 
	
	
		|   | 
	
	
		
	
			  |   
	
		
	
		| 
		
	 | 
	
	
		|   | 
	
	
		|   | 
	
	
		|   | 
	
	
	
		
	
			  |   
	
	
		 | 
	
	
		|   | 
	
	
		|   | 
	
	
		
	
		  |  	
		| 
		
	
			This article is specially designed to help beginners to understand 
			and develop their first Assembly Program from 
			scratch. Through step by step instructions it will help you to use 
			tools, setup the environment and then build sample 'Hello 
			World' program in Assembly language with detailed 
			explaination.  | 
	
		|   | 
	
		| 
		 | 
	
		|  
		
		 | 
	
	
		
		
			This article is the part of our free "Reverse Engineering & Malware 
			Analysis Course" [Reference 4]. It is written as pre-learning guide 
			for our session on 'Part 4 - Assembly Programming Basics' where in 
			we are going to cover Assembly Programming from the reverse 
			engineering perspective.
  Here along with programming assignment experts from  AssignmentCore we will be demonstrating 
			Assembly programming using MASM as it is the Microsoft assembler and 
			provide much flexibility when it comes to development on Windows 
			environment over various other assemblers like NASM etc. | 
	
	
		|  
		
			 | 
	
	
		|  
		
			 | 
	
	
	
		|  
		
			 | 
	
	
	
		
	
	
	  |  	
	
	
		
		
			- MASM [Reference 2] - MASM is a Microsoft 
			assembler.
 
			- WinAsm [Reference 3] 
			- WinAsm is IDE. It provides a nice interface for coding and 
			moreover you don't have to type different-2 command for assembler 
			and linker to compile a binary, with one click it will generate EXE for you.
 
		 
		 | 
	
	
	
		|  
		
			 | 
	
	
	
		
	
	  |  	
	
		
		
			- MASM - By default MASM tries to install itself 
			in windows drive mostly c drive but you can install it in any 
			Drive/directory. We need the full path of MASM installation to 
			configure WinAsm so note down the drive/directory where you 
			installed MASM.
 
			- WinAsm - Download and extract the WinAsm 
			package. WinAsm comes with all files you require so you don't have 
			to install it. Just copy the folder to "c:\program files\" and make 
			a shortcut to desktop so that you can access directly from desktop.
 
		 
		 | 
	
	
	
		|   | 
	
	
	
		
	
	
  |  	
	
	
		Launch WinAsm by double clicking on the shortcut created on the 
		desktop. In order to integrate it with MASM we need to setup the MASM 
		path in WinAsm configurations. Here are the steps,
  | 
	
	
	
		
		
			- Click on the tools tab 
 
			- In tools click on options
 
			- In options click on file & path tab
 
			- Change the all entries with path to MASM installation 
			folder
 
			- Click on Ok.
 
		 
		 | 
	
	
	
		
		  | 
	
	
	
		|   | 
	
	
	
		| After this you should be able to write programs in WinAsm. | 
	
	
	
		|   | 
	
	
	
		|   | 
	
	
	
		|   | 
	
	
	
		
	
	
  |  	
	
	
		| Launch the WinAsm window, click on the "file" tab. Then click on the 
		new projects and it will show you couple of options as shown below.  | 
	
	
	
		|  
		 | 
	
	
	
		
		  | 
	
	
	
		|   | 
	
	
	
		
		
			- Console Application - For creating 
			console (command-line) applications
 
			- Standard EXE -  For creating GUI based 
			applications
 
		 
		 | 
	
	
	
		| Here we willl use Standard EXE because we want to 
		make a GUI Application. Now you will see the editor window in which you 
		can write your programs. | 
	
	
	
		|   | 
	
	
	
		|   | 
	
	
	
		|   | 
	
	
	
		
	
	
  |  	
	
	
		| Here is a typical assembly program 
		structure,  | 
	
	
	
		
		
			- Architecture - Define the architecture because assembly is 
			Hardware (processor) dependent language so you have to tell to 
			assembler the architecture for which you are writing your program.
 
			- Data Section - All your initialized and uninitialized 
			variables reside in data section.
 
			- Code Section - Entire code of your program reside in this 
			section.
 
		 
		 | 
	
	
	
		| Now we will write a program that will display the message box saying 
		"Hello World!" | 
	
	
	
		|   | 
	
	
	
		Code: 
  
		;------------Block 1---------- .386 .model flat,stdcall option 
		casemap:none
 
  ;------------Block 2---------- include 
		windows.inc include user32.inc includelib user32.lib include 
		kernel32.inc includelib kernel32.lib
 
  ;------------block 
		3---------- .data szCaption db "Hello",0 szMsg db "Hello 
		World!",0
 
  ;------------Block 4---------- .data? 
		retvalue dd ?
 
  ;------------Block 5---------- .code 
		start: invoke MessageBox,NULL,addr szMsg,addr szCaption,MB_OK mov 
		retvalue,eax xor eax,eax invoke ExitProcess,eax end start 
      
		 | 
	
	
	
		|   | 
	
	
	
		| I divided the above code in 5 blocks. 
		Below I will explain the purpose and functionality of each block. | 
	
	
	
		 | 
	
	
	
		|   | 
	
	
	
		
	
	
	
		|   | 
	
	
	
		1).386 2).model 
		flat,stdcall 3)option casemap:none | 
	
	
	
		|   | 
	
	
	
		#1 - This line defines the architecture for which we want to make 
		this program. (.386) represent Intel architecture #2 - This line 
		defines the model and the calling convention that we want to use for 
		this program. We will explain it in detail in our "Assembly Basics" 
		session. #3 - function names, variable names etc. are case sensitive | 
	
	
	
		 All these three lines are required in each program. | 
	
	
	
		|   | 
	
	
	
		
	
	
		|   | 
	
	
	
		1)include windows.inc 
		2)include user32.inc 3)includelib user32.lib 4)include 
		kernel32.inc 5)includelib kernel32.lib  | 
	
	
	
		|   | 
	
	
	
		include and includelib are two keywords. Include is used with .inc 
		files while includelib is used with .lib files.
  .inc files are header 
		files. for eg: windows.inc is windows.h, you can convert any .h file 
		into .inc file using H2INC utility that comes with MASM.
  .lib files 
		are required by linker to link the used functions with the system dlls. 
		In our program we used two .lib files (user32.lib & kernel32.lib). For 
		each .lib file we have to include its corresponding .inc file. | 
	
	
	
		|   | 
	
	
	
		
	
	
	
		|   | 
	
	
	
		1).data 2)szCaption 
		db "Hello",0 3)szMsg db "Hello World!",0  | 
	
	
	
		|   | 
	
	
	
		| .data is the section for initialized variables. Every initialized 
		variable should be initialized in this section. In our code we have two 
		variables of char type <string>. | 
	
	
	
		|   | 
	
	
	
		| Syntax: <variable_name> 
		<type> <value> | 
	
	
	
		|   | 
	
	
	
		For eg: in #2 szCaption is the variable name, db is the type means 
		char type, "Hello", 0 is the value. 
  Here important point to note is that 
		every char or string value should be terminated with zero (0).
  | 
	
	
	
		|   | 
	
	
	
		
	
	
	
		|   | 
	
	
	
		1).data? 2)retvalue 
		dd ?
  | 
	
	
	
		|   | 
	
	
	
		| .data? is the section for uninitialized variables. Every 
		uninitialized variable should be declared in this section. | 
	
	
	
		|   | 
	
	
	
		
	
	
	
		|   | 
	
	
	
		1).code 2)start: 
		3)invoke MessageBox,NULL,addr szMsg,addr szCaption,MB_OK 4)mov 
		retvalue,eax 5)xor eax,eax 6)invoke ExitProcess,eax 7)end start | 
	
	
	
		|   | 
	
	
	
		.code represents the start of code. All your code should be written 
		in this section
  #2 start:  It is a label and it is like main 
		function. You can name it anything but you have to use the same name in 
		#7 otherwise linker will generate an error.
  For e.g.:  main: 
		... 
		end main
  #3 invoke - is the keyword, its operation is similar to 
		"call". But in call you have to manually push parameters on the stack 
		while invoke will do everything for you.
 
  | 
	
	
	
		Syntax: function_name 
		parameter1, parameter2, parameter3, etc.
  | 
	
	
	
		|   | 
	
	
	
		In our code MessageBox is the API from user32.dll and it requires 4 
		arguments.
  Here important point to note is that we used "addr" with 
		some of our variables. addr will give address of the variable instead of 
		its value, it is like pointer in c. 
  #7 end start - it says the end 
		of the code and file.  | 
	
	
	
		|   | 
	
	
	
		
	
	
	
		|   | 
	
	
	
		Now paste the above code in WinAsm and click 
		on "make" tab, in "make" click on "Assemble".  
		After that click on "link" which will be the executable for 
		this program. 
  Finally run the EXE file by double clicking on it, it should display "Hello World!". | 
	
	
	
		|   | 
	
	
	
		|   | 
	
	
	
		| This is a basic program to help you to learn Assembly Language in 
		most easier way. For more advanced details refer/attend our FREE 
		Reversing/Malware Analysis course [Reference 4]  | 
	
	
	
		|   | 
	
	
	
		|   | 
	
	
	
		|   | 
	
	
	
		
	
	  |   
	
	
		
		
			- 
			Icezelion's Win32 Assembly Tutorials
 
			- MASM - http://www.masm32.com/
 
			- WinASM - 
			http://www.winasm.net/
 
			- Reverse Engineering & Malware 
			Analysis Course 
 
		 
		 | 
	
	
		|   | 
	
	
		
	
		|   | 
	
	
	
		
	
			  |   
	
		
	
		| 
		
	 | 
	
	
		|   | 
	
	
		|   | 
	
	
		|   | 
	
	
		|   | 
	
	
		|   | 
	
	
		|   | 
	
		|   |