0% found this document useful (0 votes)
4 views26 pages

Basic Assembly Instructions Guide

The document provides basic assembly language instructions for NASM including addition, subtraction, multiplication, division, flags register, jump instructions, conditional constructs, and loop constructs. It explains how to translate common programming constructs like if/else statements and while/until loops into assembly language instructions using flags, jumps, and the RCX register to iterate through loops.

Uploaded by

asasd
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views26 pages

Basic Assembly Instructions Guide

The document provides basic assembly language instructions for NASM including addition, subtraction, multiplication, division, flags register, jump instructions, conditional constructs, and loop constructs. It explains how to translate common programming constructs like if/else statements and while/until loops into assembly language instructions using flags, jumps, and the RCX register to iterate through loops.

Uploaded by

asasd
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Basic Assembly Instructions

SE 2XA3

Term I, 2020/21
Outline

Basic instructions

Addition, Subtraction, Move

Multiplication

Division

FLAGS register

Jump Instructions

Conditional constructs

Loop constructs using RCX

General loops
Basic instructions

I For a complete list of instruction, please see Help,


item x86 and x86-64 instruction reference , or at
[Link]
I For complete NASM manual, please see Help, item
NASM manual, or at
[Link]
Addition, Subtraction, Move

I add dest, source


I dest ← dest+source
I dest is a register or a memory location
I source is a register, a memory location, or
immediate
I sub dest, source
I dest ← dest-source
I mov dest, source
I dest ← source
I dest is a register or a memory location
I source is a register, a memory location, or
immediate
I both cannot be a memory location at the same
time
Multiplication

I mul is for unsigned integers


I imul is for signed integers
I 255 x 255 = 65025 if unsigned
255 x 255 = 1 if signed
I FFh = 1111|1111
as unsigned is 255
as signed is 1|1111111 = -1
I Two’s complement representation
first bit 1 means -; 0 means +
flip all the bits, and then add 1
mul

I mul source
I source can be register or memory
I the other operand is implicit, determined
by the size

source implied operand result


byte AL AX
word AX DX:AX
dword EAX EDX:EAX
qword RAX RDX:RAX
imul

I imul source
I source can be register or memory
I the other operand is implicit
I imul source
I imul source1, source2

source implied operand result


byte AL AX
word AX DX:AX
dword EAX EDX:EAX
qword RAX RDX:RAX
Division

I div is for unsigned integers


I idiv is for signed integers
I both work the same way
I div source
I source can be register or memory

source operation quotient remainder


byte AX/source AL AH
word (DX:AX)/source AX DX
dword (EDX:EAX)/source EAX EDX
qword (RDX:RAX)/source RAX RDX
Do not forget to initialize to 0 the remainder !!!
FLAGS register

I Contains various flags


I cmp a, b
I subtracts a - b
I does not store the result
I sets flags
I For unsigned integers
I ZF so-called zero flag
I CF so-called carry flag
I For signed integers
I ZF so-called zero flag
I OF so-called overflow flag; 1 if results overflows
I SF so-called sign flag; 1 when the result is
negative
cmp

I Unsigned integers
cmp a, b
a-b ZF CF
=0 1 0
>0 0 0
<0 0 1
I Signed integers
cmp a, b
a-b ZF OF SF
=0 1
>0 0 {0,1} SF←OF
<0 0 0 1
Jump Instructions

jump = transfer execution control

I Unconditional jumps
I jmp label
I call label
I Conditional jumps
I jxx label
I checks some flags
I if true, jump to label
I otherwise continue by executing the next
statement
forms of conditional jump

First execute an instruction that sets flags such as


cmp a, b
then use one of the following forms of jxx:
mnemonics
For unsigned integers
je = jump if equal jne = jump if not equal
jb = jump if below jnae = jump if not above or equal
jbe = jump if below or equal jna = jump if not above
ja = jump if above jnbe = jump if not bellow or equal
jae = jump if above or equal jnb = jump if not bellow
jz = jump if zero jnz = jump if not zero
forms of conditional jump

First execute an instruction that sets flags such as


cmp a, b
then use one of the following forms of jxx:
mnemonics
For signed integers
je = jump if equal jne = jump if not equal
jl = jump if less jnge = jump if not greater or equal
jle = jump if less of equal jng = jump if not greater
jg = jump if greater jnle = jump if not less or equal
jge = jump if greater or equal jnl = jump if not less
jz = jump if zero jnz = jump if not zero
forms of conditional jump

if signed unsigned
a=b je je
a!=b jne jne
a<b jl, jnge jb, jnae
a>b jg, jnle ja, jnbe
a>=b jge, jnl jae, jnb
a<=b jle, jng jbe, jna
For additional instructions, see the documentation in the
Help section
If statements

Consider a Python if statement

if <condition>:
statement1
… then-block
statementn
If statements

Can be translated as

;instructions that set flags


;according to the <condition>
;e.g. cmp a,b
jxx end_if
;instructions of then-block
end_if:

where jxx is a suitable jump instruction


If statements

Consider a Python if statement

if <condition>:
statement1
… then-block
statementn
else:
statement1
… else-block
statementm
If statements

Can be translated as

;instructions that set flags


;according to the <condition>
;e.g. cmp a,b
jxx else_block
;instructions of then-block
jmp end_if
else_block:
;instructions of else-block
end_if:

where jxx is a suitable jump instruction


Examples

sum=0
i=i-1
if i>0:
sum=sum+1
Can be translated as
;assume i is in rcx
mov rax, 0 ;sum=0
dec rcx ;i=i-1
cmp rcx, qword 0 ;if i > 0
jbe end_if
inc rax ;sum=sum+1
end_if:
Examples

if rax>=5:
rbx=1
else:
rbx=2
Can be translated as

cmp rax, qword 5


jge then_block
mov rbx, qword 2
jmp next
then_block:
mov rbx, qword 1
next:
Examples

or as

cmp rax, qword 5


jnz else_block
mov rbx, qword 1
jmp next
else_block:
mov rbx, qword 2
next:
Loop constructs using RCX

loop instruction, Example:


sum = 0
for x in range(10, -1, -1):
sum=sum+i

Can be translated as

mov rax, dword 0 ;sum=0


mov rcx, dword 10 ;rcx=10, loop counter
Lstart:
add rax, rcx ;sum=sum+i
loop Lstart ;decrement rcx
;if rcx!=0, then jump
;to Lstart
Loop instructions
loop instruction, Example:
sum = 0
for x in range(1,10):
sum=sum+i

Is the following a correct translation?


mov rbx, qword 1
mov rax, qword 0 ;sum=0
mov rcx, qword 10 ;rcx=10, loop counter
Lstart:
add rax, rbx ;sum=sum+i
inc rbx
loop Lstart ;dec rcx,jump to Lstart
No, it is not correct. The python code loops for x from 1 to 9 and
the sum is 45. The NASM code loops for rcx from 10 to 0 and
the sum is 55
Loop instructions

I loop Lstart same as


I decrement rcx by 1
I if rcx!=0 goto Lstart
I loope Lstart the same as loopz Lstart
I loopz Lstart same as
I decrement rcx by 1
I if rcx!=0 and ZF=1 goto Lstart
I loopne Lstart the same as loopnz Lstart
I loopnz Lstart same as
I decrement rcx by 1
I if rcx!=0 and ZF=0 goto Lstart
ZF unchanged if rcx=0
General loops – while loop

Example
while <continuation-condition>:
statement1
… loop-body
statementn
Can be translated as

while:
;code that sets flags
jxx end_while ;jump if false
;code of loop-body
jmp while
end_while:
General loops – until loop

Example (does not exist in Python)


statement1
… loop-body
statementn
until <termination-condition>
Can be translated as

until:
;code of loop-body
;code that sets flags
jxx end_until ;jump if true
jmp until
end_until:

You might also like