Fibonacci Program in Assembly Language

Here’s how to write a Fibonacci sequence program in Assembly language from scratch for the x86-64 processor. Also includes instructions on how to install the Flat Assembler.


First, let’s install the Flat Assembler. You can download the program from here:

Doesn’t need Windows setup/installation. Simply download the zip file and extract it to your preferred location.

Personally I extracted mine here: C:\Users\sanjib\bin\fasmw17330

Location of the Flat Assembler program on my machine

Environment Variables

We need to set 2 environment variables:

  • Set the INCLUDE variable to the INCLUDE folder in your fasm folder (where you extracted the Flat Assembler program): this will allow you to include additional assembly files in your assembly program. Mine was: C:\Users\sanjib\bin\fasmw17330\INCLUDE
  • Add to the Path variable your fasm folder (where you extracted the Flat Assembler program): this will allow you to call the fasm.exe program from anywhere in your machine. I added C:\Users\sanjib\bin\fasmw17330
The INCLUDE environment variable on my machine
The Path environment variable on my machine

Download the file

Download the file from here:

We need to download this file at put it in the INCLUDES folder of your fasm directory.

We need this file as we are going to include it in our Fibonacci program. This program allows user input and output to the console.

How my INCLUDE folder looks like

Fibonacci Program in Assembly Language

This is how the Fibonacci program looks like in Assembly language. Please read the inline comments which explains all the lines of code. Also watch the video that shows from the beginning to end on how to install the Flat Assembler and write the program from scratch.

I mention x and y below as if they were variables. But these are just imaginary variables to explain Fibonacci algorithm.

We are using 4 registers as follows:

  • eax: to store the x value
  • ebx: to store the y value
  • ecx: as the counter
  • edx: as the tmp value during the swap
format PE console       ; tells the assembler that this is a console program
entry start             ; marks the start of the program, see the start: label below

include ''    ; includes the file necessary for Windows operating system
include ''  ; includes the file to call read_hex and _print_eax instructions

start:                  ; the entry-point of the program
    call    read_hex    ; reads user input and stores it in the eax register
    mov     ecx, eax    ; move content eax to ecx, will use ecx as the counter n

    mov     eax, 0      ; now set eax to 0 (initial value of let's say x)
    mov     ebx, 1      ; set ebx to 1 (initial value of let's say y)

    ; the 3 lines below are the fibonacci algorithm: sets x to y, and y to x+y
    mov     edx, eax    ; store value of eax in edx (used as a tmp area)
    mov     eax, ebx    ; move content of ebx to eax (sets x)
    add     ebx, edx    ; sum ebx with value of edx (what used to be eax, sets y to x+y)

    jc      fib_carry   ; register 32-bits, not big enough to calculate over 30 hex

    dec     ecx         ; decrease counter
    jz      exit        ; jump to exit: if ecx reaches 0

    jmp     fib         ; jump back to fib: label, creates the loop

    mov     eax, -1     ; carry over occurred, mark it with value ffffffff

    call    print_eax   ; print answer

    push    0           ; exit console program
    call    [ExitProcess]

Download a File Using Go

Downloading a file from the Internet using Go is remarkably easy. Especially coupled with concurrency it makes downloading multiple files fast. The following code below shows how to download a single file using Go.

Goal: Download a test image file, the Google logo

  1. First get the file using http.Get
  2. Extract the filename from the URL by splitting it with “/”, then get the last part
  3. Create an empty file with the filename
  4. Dump the data into the file from the “res” object in step 1
package main

import (

func main() {
	// 1. Get the file
	url := ""
	res, err := http.Get(url)
	if err != nil {

	// 2. Extract filename
	parts := strings.Split(url, "/")
	filename := parts[len(parts)-1]

	// 3. Create an empty file
	file, err := os.Create(filename)
	if err != nil {

	// 4. Dump the data
	defer res.Body.Close()
	n, err := io.Copy(file, res.Body)
	if err != nil {

	fmt.Printf("wrote: %q, size: %.2f kb\n", filename, float64(n)/1024)

Send Email With Go and MailJet

The following steps show how to send mail with Go using the standard smtp package. To test I used MailJet as the mail server but you can also use Mandrill or SendGrid.

First let’s setup MailJet as the mail server. Then write the Go code and send a test email.

MailJet Setup

After creating your free MailJet account, you should make sure you complete the 2 steps below (under Account Settings):

  • Add a Sender Domain or Address
  • Setup SPF/DKIM Authentication

Personally, I found validating an entire domain very convenient. That way I can use the domain for all my projects mail sending requirements. For example:

But you don’t have to use a custom domain if you don’t want to. You can add a single sender email address from which the mail will be sent from.

Next, you need to setup an API key and Secret – these will be the username and password in Go code. You can set the API key and Secret under Account Settings:

Go Code

Please make sure you specify the following constants and variables with your own:

  • username, password: These are your API key and secret
  • host, port: the port should be 587, you can find your host under your account settings:
  • from: the email address from which mail will be sent from. I presume you have set this in the steps above under MailJet account settings: Add a Sender Domain or Address, Setup SPF/DKIM Authentication.
  • to: you can specify any address that you own for testing. The test email will be sent to this address. I specified my own personal email address which you should replace with your own.

Type the following code in your favorite editor, then run the code in a terminal: go run main.go

package main

import (

func main() {
	const (
		username = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // your 32 digit API key
		password = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // your 32 digit secret
		host     = ""                  // your MailJet host
		port     = "587"                              // recommended port for TLS
		from     = "FROM-EMAIL@YOUR-VALID-DOMAIN.COM" // your validated domain
		addr     = host + ":" + port

	to := []string{
	subject := "Test mail using Go with MailJet"
	message := fmt.Sprintf(`Subject:%s

This is a test message sent with Go and MailJet.


Sent on %v`, subject, time.Now())

	auth := smtp.PlainAuth("", username, password, host)
	err := smtp.SendMail(addr, auth, from, to, []byte(message))
	if err != nil {
		log.Println("send mail:", err)
	fmt.Println("mail sent successfully")

If you configured everything correctly and ran the code, you should receive an email like the one shown in the screenshot below. I received my test email at my personal Gmail address. My from address was: “”

Here is a video of the code in action where I configure the code, run it and receive a test mail.

Create a Self-signed Certificate on Windows for Local Development

We need to a create self-signed certificate for local development so that the local development server behaves similar to a live production server. Additionally the certificate must not generate warnings in the browser (Chromium based browsers only) that the certificate is self-signed and can’t be trusted.

Developing locally with plain http is just fine. But sometimes we need to mimic development with production so that TLS encryption via https is available also on our development machines. We also don’t want to see ugly security warnings from browsers. The following article shows how to create self-signed certificates on Windows that doesn’t generate browser warnings on Chrome and other Chromium based browsers.

The article is a bit long but please grab a coffee and follow along. The result is worth the effort as you only need to generate the certificate once in a very long time. I set the expiry date 10 years in the future for the domains I create for local development.

Goal: Create an imaginary domain pdb.oak.san with a self-signed certificate that works on major browsers (except Firefox) without generating a warning. Works great on Chromium based browsers like Chrome, Canary, Microsoft Edge and Opera, IE.

Step 1: Setup hostname

  • Open Notepad in Administrator mode: Click Windows Start icon in task bar and start typing Notepad, right click the Notepad icon and click Run as administrator
  • Inside Notepad, open the file: C:\Windows\System32\drivers\etc\hosts
  • We want to create an imaginary domain: pdb.oak.san, add the following line to the hosts file:    pdb.oak.san
  • Save the file and close

Step 2: Create a client-side self-signed certificate

  • Open PowerShell in Administrator mode: Click Windows Start icon in task bar and start typing PowerShell, right click the PowerShell icon and click Run as administrator
  • Type the following to generate a self-signed certificate for domain pdb.oak.san with friendly name pdb.oak.san that expires after 10 years:
New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "pdb.oak.san" -FriendlyName "pdb.oak.san" -NotAfter (Get-Date).AddYears(10)
  • You should get the following output

Step 3: Copy the certificate created in Step 2 to Trusted Root Certification Authorities, then export it

  • Open Management Console for Certificates: Click Windows Start icon and start typing certificates, click Manage computer certificates
  • On the left panel, click Personal -> Certificates, you should see the client-side certificate for pdb.oak.san created above in Step 2
  • On the left panel, open the tree for (but don’t left click the folder) Certification Authorities -> Certificates
  • With the right mouse button, drag and drop the certificate to the location opened in the previous step
  • Now export the certificate: right-click the certificate, All Tasks -> Export…
  • Welcome screen appears, click Next
  • Select Yes, export the private key, click Next
  • Keep the default values for .PFX, click Next
  • Type a password for the private key, click Next
  • Browse for a location and give the certificate a name (cert.pfx), click Next
  • Finally click Finish
  • You will get a notice that the export was successful

Step 4: Create the server-side certificate and key

  • Pre-requisite: you need to have OpenSSL installed. Since you are a developer and on Windows, it’s highly likely you already have installed, so you should also have OpenSSL installed. Otherwise we recommend installing Git for Windows with Git Bash support – this will automatically also install OpenSSL.
  • Open Command Prompt and change directory to the location where you exported the certificate with .PFX extension cert.pfx in Step 3 above.
  • Type the following commands in the Command Prompt one by one. When prompted for password, type the password you used in Step 3 above when exporting the .PFX certificate.
$ openssl pkcs12 -in cert.pfx -nocerts -out key.pem -nodes
$ openssl pkcs12 -in cert.pfx -nokeys -out cert.pem
$ openssl rsa -in key.pem -out server.key
  • You should now have the following files in the folder, we will be using the cert.pem and server.key files. You can delete the other files if you want to.
cert.pem    --> KEEP
server.key  --> KEEP

Step 5: Test

  • You can use Apache or Nginx to test the https connection for the pdb.oak.san domain. We will create a simple Go server as it can be created really fast with a few lines of code. Create a file called main.go and type the code below. Make sure cert.pem and server.key is in the same folder as the main.go file.
package main

import (

func handleHome(w http.ResponseWriter, r *http.Request) {
    _, _ = fmt.Fprintln(w, "Home page to test the TLS cert and secure https connection")

func main() {
    http.HandleFunc("/", handleHome)
    _ = s.ListenAndServeTLS("cert.pem", "server.key")
  • Build and run the Go server: go build main.go, then run the resulting executable program main.exe
  • Now if we visit https://pdb.oak.san/ in a browser, we can see the home page with the following content: “Home page to test the TLS cert and secure https connection”
  • We can also check the certificate by clicking on the lock icon in the browser address bar:

For Nginx Users

To test on Nginx instead of writing Go code, you can use the configuration below.

  • Make sure to copy your cert.pem and server.key to the locations for ssl_certificate and ssl_certificate_key.
  • Folder paths like C:\Users\sanji\pdn\pdb.oak.san\www should of course match the locations in your own computer.
server {
    listen          443 ssl;

    server_name     pdb.oak.san;
    root            C:\Users\sanji\pdn\pdb.oak.san\www;
    access_log      C:\Users\sanji\pdn\pdb.oak.san\logs\access.log;
    error_log       C:\Users\sanji\pdn\pdb.oak.san\logs\error.log;
    index           index.html;

    ssl_certificate     C:\Users\sanji\pdn\pdb.oak.san\ssl\cert.pem;
    ssl_certificate_key C:\Users\sanji\pdn\pdb.oak.san\ssl\server.key;

The video below shows the steps I took to setup SSL on an imaginary domain on my local machine. The video is 20 minutes; maybe I could have been done the video in 10 minutes or less. But here I am showing the actual problems I am running into and the steps I am taking to solve them.

Setting up domains, servers and certificates in real-life is not without problems. This is not a scripted video. It shows the problems I face and how I resolve them.

This a scenario where you have created personal certificates and digitally signed them on your own and now you want them available and trusted on another machine.

The Definitive 4-Step Short Guide to Implementing WordPress Language Files

WordPress: 5.5.1

The reason to call this post “definitive” is because it contains the exact information (without adding anything extra) for implementing WordPress language files (aka internationalization).

The 4-Steps

1. The plugin entry point “.php” file needs the following Text Domain WordPress directive, considering foo-bar as the plugin name:

* Text Domain: foo-bar

Where is the The Text Domain used? For example, in the 2nd argument of _e() and __() functions.

The Domain Path directive didn’t need to be specified even though the plugin wasn’t part of the official WordPress plugin directory as specified here:

2. Create a “lang” folder (to put all your .mo and .po translation files) under your plugin folder:


Folder name “lang” is preferred to “languages” because it’s shorter.

3. Create the .mo and .po language translation files via PoeEdit and make sure to prefix them with the plugin name:

  • foo-bar-en_US.po
  • foo-bar-fr_FR.po

PoeEdit is a bit awkward to use at first, but it gets the job done. Beginners need to refer to a quick-guide on how to generate the .mo and .po files.

4. Load the language translation files from the plugin entry point “.php” file like this (the folder pointing to the language files is a relative path):

add_action('plugin_loaded', function () { 
    load_plugin_textdomain('foo-bar', false, 'foo-bar/lang'); 

For better code organization a static function under a class is highly recommended, instead of the anonymous function above (the 2nd argument to add_action).

2 Common Mistakes to Avoid

  • Don’t forget to prefix the language files with the plugin name (see step 1 above).
  • Don’t forget to specify relative folder and not absolute folder (see step 4 above).

Getting Started with Phaser 3

A barebones Phaser 3 getting started demo.

5 Easy Steps

See the comments in index.html in the Github repo.

  1. Include the JS file phaser-arcade-physics.min.js
  2. Declare the config var
  3. Create a new Phaser.Game
  4. Preload the 4 game assets (images) in preloadFoo() function
  5. Create the game in createFoo() function
    • add background image
    • create a particles emitter
    • create the ball boss
    • attach the emitter to the boss

For more information see the official Getting Started page here:

Write a list comprehension that finds all the Pythagorean triples for right triangles with sides shorter than 100

Write a list comprehension that finds all the Pythagorean triples for right triangles with sides shorter than 100. A Pythagorean triple is three integers a, b, and c, where a² + b² = c².

In Elixir it takes a line of code with pattern-matching to produce this.

Note the 3 patterns below, nested loops, scary I know. But at least rather than starting from 1 each time, we loop through 1 more than the last value of the outer loop.

  • a<-1..99,
  • b<-(a+1)..99,
  • c<-(b+1)..99

And the final pattern which make it all work like magic:

a*a + b*b == c*c

File: pythag.exs

for a<-1..99, b<-(a+1)..99, c<-(b+1)..99, a*a + b*b == c*c, do: IO.puts "#{a}² + #{b}² = #{c}²"

Output: console

> elixir pythag.exs
3² + 4² = 5²
5² + 12² = 13²
6² + 8² = 10²
7² + 24² = 25²
8² + 15² = 17²
9² + 12² = 15²
9² + 40² = 41²
10² + 24² = 26²
11² + 60² = 61²
12² + 16² = 20²
12² + 35² = 37²
13² + 84² = 85²
14² + 48² = 50²
15² + 20² = 25²
15² + 36² = 39²
16² + 30² = 34²
16² + 63² = 65²
18² + 24² = 30²
18² + 80² = 82²
20² + 21² = 29²
20² + 48² = 52²
21² + 28² = 35²
21² + 72² = 75²
24² + 32² = 40²
24² + 45² = 51²
24² + 70² = 74²
25² + 60² = 65²
27² + 36² = 45²
28² + 45² = 53²
30² + 40² = 50²
30² + 72² = 78²
32² + 60² = 68²
33² + 44² = 55²
33² + 56² = 65²
35² + 84² = 91²
36² + 48² = 60²
36² + 77² = 85²
39² + 52² = 65²
39² + 80² = 89²
40² + 42² = 58²
40² + 75² = 85²
42² + 56² = 70²
45² + 60² = 75²
48² + 55² = 73²
48² + 64² = 80²
51² + 68² = 85²
54² + 72² = 90²
57² + 76² = 95²
60² + 63² = 87²
65² + 72² = 97²

Write a function even_length? that uses pattern matching only to return false if the list you pass it has an odd number of elements, true otherwise.

Write a function even_length? that uses pattern matching only to return false if the list you pass it has an odd number of elements, true otherwise.

This is a fun little exercise in Elixir. First we match a single item in the list (odd number) which is false. Then match exactly two items (even number) and return true. Then the 3rd function matches the first 2 elements (as throwaway) and recursively tails the list to match the first two patterns.

defmodule Lists do
  def even_length?([_a]), do: false
  def even_length?([_a, _b]), do: true
  def even_length?([_a, _b | t]), do: even_length?(t)

Some testing below in IEx:

iex> Lists.even_length? [1]
iex> Lists.even_length? [1, 2]
iex> Lists.even_length? [1, 2, 3]
iex> Lists.even_length? [1, 2, 3, 4]