Assembly Language x86-32 and x86-64
In development...Assembly Language Documentation:
Randall Hyde "The Art of Assembly Language"
Duntemann "Assembly Language: Step-by-Step"
Jorgensen "Assembly Language Programming with Ubuntu"
Carter "PC Assembly Language"
Dandamudi "Guide to Assembly Language Programming in Linux"
Kusswurm "Modern X86 Assembly Language Programming"
"Assembly language tutorial"
"Assembly Language Programming"
"Assembly Language Programming"
Assembly Language examples:
How to compile these examples: gcc main.c func.s######################################################################
# f000.s
.text
.globl f000
f000:
movl $12345, %eax
ret
--------------------------------- ----------------------------------------------------------
// main000.c
#include <stdio.h>
int f000(void);
void main(void)
{
int m;
m=f000();
printf("%d\n", m);
}
######################################################################
.text
.globl f003
f003:
movl %ecx, %eax
imull %ecx, %eax
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
int f003(int);
void main(void)
{
int k=1213, m;
m=f003(k);
printf("%d\n", m);
}
######################################################################
.text
.globl f005
f005:
addss %xmm1, %xmm0
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
float f005(float, float);
void main(void)
{
float fa, fb, fc;
fa=1.123456;
fb=6.778899;
fc=f005(fa, fb);
printf("%f + %f = %f\n", fa, fb, fc);
}
######################################################################
.text
.globl f007
f007:
movl $0, %eax
loop:
addl %ecx, %eax
decl %ecx
jnz loop
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
int f007(int);
void main(void)
{
int k=100, m;
m=f007(k);
printf("sum of first %d integers = %d\n", k, m);
}
######################################################################
# sum of %ecx and %edx
.text
.globl f009
f009:
movl %ecx, %eax
addl %edx, %eax
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
int f009(int, int);
void main(void)
{
int k=120, m=155, n;
n=f009(k, m);
printf("%d + %d = %d\n", k, m, n);
}
######################################################################
.text
.globl f012
f012:
movl %ecx, %eax
cmpl %edx, %eax
jg .L2
movl %ecx, %eax
jmp .L3
.L2:
movl %edx, %eax
.L3:
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
int f012(int, int);
void main(void)
{
int k=120, m=155, n;
n=f012(k, m);
printf("%d , %d min = %d\n", k, m, n);
}
######################################################################
.text
.globl f015
f015:
movq %rcx, %rax
imulq %rdx, %rax
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
long long f015(long long, long long);
void main(void)
{
long long k=120123, m=999999, n;
n=f015(k, m);
printf("%lld * %lld = %lld\n", k, m, n);
}
######################################################################
.text
.globl f017
f017:
movq %rcx, %rax
movq %rdx, %r9
cqto # sign extend rax to rdx:rax
idivq %r9
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
long long f017(long long, long long);
void main(void)
{
long long k=12201230123, m=999999, n;
n=f017(k, m);
printf("%lld / %lld = %lld\n", k, m, n);
}
######################################################################
.text
.globl f018
f018:
movq %rcx, %rax
movq %rdx, %r9
cqto # sign extend rax to rdx:rax
idivq %r9
movq %rdx, %rax
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
long long f018(long long, long long);
void main(void)
{
long long k=12201230123, m=999999, n;
n=f018(k, m);
printf("%lld residual %lld = %lld\n", k, m, n);
}
######################################################################
.text
.globl f020
f020:
movl %ecx, %eax
andl %edx, %eax
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
int f020(int, int);
void main(void)
{
int k=122, m=999999, n;
n=f020(k, m);
printf("%x & %x = %x\n", k, m, n);
}
######################################################################
.text
.globl f021
f021:
movl %ecx, %eax
orl %edx, %eax
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
int f021(int, int);
void main(void)
{
int k=122, m=999999, n;
n=f021(k, m);
printf("%x | %x = %x\n", k, m, n);
}
######################################################################
.text
.globl f022
f022:
movl %ecx, %eax
notl %eax
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
int f022(int);
void main(void)
{
int m=999999, n;
n=f022(m);
printf(" ~%x = %x\n", m, n);
}
######################################################################
.text
.globl f023
f023:
sall $3, %ecx
movl %ecx, %eax
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
int f023(int);
void main(void)
{
int m=999999, n;
n=f023(m);
printf(" %x <<3 = %x\n", m, n);
}
######################################################################
.text
.globl f024
f024:
sarl $3, %ecx
movl %ecx, %eax
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
int f024(int);
void main(void)
{
int m=999999, n;
n=f024(m);
printf(" %x >>3 = %x\n", m, n);
}
######################################################################
.text
.globl f027
f027:
cmpl $0, %ecx
je .L2
cmpl $0, %edx
je .L2
movl $1, %eax
jmp .L3
.L2:
movl $0, %eax
.L3:
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
int f027(int, int);
void main(void)
{
int k=1, m=2, n;
n=f027(k, m);
printf("%d && %d = %d\n", k, m, n);
}
######################################################################
.text
.globl f028
f028:
cmpl $0, %ecx
jne .L2
cmpl $0, %edx
je .L3
.L2:
movl $1, %eax
jmp .L4
.L3:
movl $0, %eax
.L4:
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
int f028(int, int);
void main(void)
{
int k=1, m=0, n;
n=f028(k, m);
printf("%d || %d = %d\n", k, m, n);
}
######################################################################
.text
.globl f050
f050:
movq %rcx, %rdi
movl $0, %esi
.L2:
movl %esi, %edx
movq %rdi, %rax
addq %rdx, %rax
movzbl (%rax), %eax
testb %al, %al
je .L3
incl %esi
jmp .L2
.L3:
movl %esi, %eax
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
unsigned int f050(char*);
void main(void)
{
char buf[50] = {'a', 'b', 'c', 'd', 'e', 'f', 0};
int n;
n=f050(buf);
printf("length = %d\n", n);
}
######################################################################
.text
.globl f080
f080:
addsd %xmm1, %xmm0
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
double f080(double, double);
void main(void)
{
double fa, fb, fc;
fa=1.123456;
fb=6.778899;
fc=f080(fa, fb);
printf("%f + %f = %f\n", fa, fb, fc);
}
######################################################################
.text
.globl f082
f082:
mulsd %xmm1, %xmm0
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
double f082(double, double);
void main(void)
{
double fa, fb, fc;
fa=1.123456;
fb=6.778899;
fc=f082(fa, fb);
printf("%f * %f = %f\n", fa, fb, fc);
}
######################################################################
.text
.globl f084
f084:
divsd %xmm1, %xmm0
ret
------------------------------------------- ----------------------------------------------------------
#include <stdio.h>
double f084(double, double);
void main(void)
{
double fa, fb, fc;
fa=1.123456;
fb=6.778899;
fc=f084(fa, fb);
printf("%f / %f = %f\n", fa, fb, fc);
}
Pure Assembly
Here are programs purely in Assembly that aren't compiled into executables with c code.To compile these programs: gcc prog.s
######################################################################
# simplest assembly program
# which is compiled and run
.text
.globl main
main:
ret
######################################################################
# simplest assembly program
# which is compiled and run
.text
.globl main
main:
call __main # call next instruction
nop
ret
######################################################################
# string definition and print
.text
.globl main
main:
pushq %rbp
movq %rsp, %rbp
subq $24, %rsp # reserve frame in stack for variables
call __main
leaq .LC0(%rip), %rcx
call puts
addq $24, %rsp
popq %rbp
ret
.LC0:
.ascii "ABCDEFGHIJK\0"
######################################################################
.text
.globl main
main:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp # reserve frame in stack for variables
call __main # call next instruction
nop
addq $32, %rsp # free frame in stack
popq %rbp
ret
######################################################################
.section .rdata,"dr"
.LC0:
.ascii "ABCDEF\0"
.text
.globl main
main:
pushq %rbp
movq %rsp, %rbp
subq $48, %rsp # reserve frame in stack for variables
call __main
leaq .LC0(%rip), %rcx
call puts
nop
addq $48, %rsp
popq %rbp
ret
######################################################################
.section .rdata,"dr"
.LC0:
.ascii "%d\12\0"
.text
.globl main
main:
pushq %rbp
movq %rsp, %rbp
subq $48, %rsp
call __main
movl $123, -4(%rbp)
movl -4(%rbp), %eax
movl %eax, %edx
leaq .LC0(%rip), %rcx
call printf
nop
addq $48, %rsp
popq %rbp
ret
######################################################################
.text
.globl main
main:
pushq %rbp
movq %rsp, %rbp
subq $48, %rsp
call __main
leaq -16(%rbp), %rdx
movq $123, %rax
movq $10, %r8d
movq %rax, %rcx
call itoa
leaq -16(%rbp), %rax
movq %rax, %rcx
call puts
nop
addq $48, %rsp
popq %rbp
ret
######################################################################
.global main
.text
main: # This is called by C library's startup code
mov $message, %rdi # First integer (or pointer) parameter in %rdi
call puts # puts(message)
ret # Return to C library code
message:
.asciz "Hola, mundo" # asciz puts a 0 byte at the end