• Tidak ada hasil yang ditemukan

Introduction to 8086 Assembly

N/A
N/A
Protected

Academic year: 2024

Membagikan "Introduction to 8086 Assembly"

Copied!
61
0
0

Teks penuh

(1)

Introduction to 8086 Assembly

Lecture 6

Working with memory

(2)

Why use memory?

(3)

3

Why use memory?

● Store program code

jmp 1012 add eax,eax mov eax, 1

memory

1008 1006 1001

xor eax,eax

1010

sub eax,303

1012 1006

EIP

CPU

(4)

Why use memory?

● Store program code

● Registers are limited in number and size

● Program data

(5)

5

Why use memory?

● Store program code

● Registers are limited in number and size

● Program data

○ Numbers, pointers, arrays, structures, data structures,

○ Text

○ Photos

○ Audio

○ Video

(6)

Why use memory?

● Store program code

● Registers are limited in number and size

● Program data

○ Numbers, pointers, arrays, structures, data structures,

○ Text

○ Photos

○ Audio

○ Video

● Memory-mapped IO

(7)

7

The data segment (section)

segment .data

dd 1234

dw 13

db -123

(8)

How to access data?

segment .data dd 1234 dw 13 db -123

But how to access data?

(9)

9

How to access data? Labels!

segment .data

l1: dd 1234

dw 13

db -123

(10)

How to access data?

segment .data l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, l1 call print_int call print_nl mov eax, [l1]

call print_int call print_nl

memory1.asm

(11)

11

How to access data?

segment .data l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, l1 call print_int call print_nl mov eax, [l1]

call print_int call print_nl

memory1.asm

(12)

How to access data?

nasm -f elf -d ELF_TYPE asm_io.asm &&

gcc -m32 -c driver.c &&

nasm -f elf $1.asm &&

gcc -m32 -o $1 driver.c $1.o asm_io.o &&

./$1

run.sh segment .data

l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, l1 call print_int call print_nl mov eax, [l1]

call print_int call print_nl

memory1.asm

(13)

13

How to access data?

nasm -f elf -d ELF_TYPE asm_io.asm &&

gcc -m32 -c driver.c &&

nasm -f elf $1.asm &&

gcc -m32 -o $1 driver.c $1.o asm_io.o &&

./$1

run.sh segment .data

l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, l1 call print_int call print_nl mov eax, [l1]

call print_int call print_nl

memory1.asm

(14)

How to access data?

nasm -f elf -d ELF_TYPE asm_io.asm &&

gcc -m32 -c driver.c &&

nasm -f elf $1.asm &&

gcc -m32 -o $1 driver.c $1.o asm_io.o &&

./$1

run.sh segment .data

l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, l1 call print_int call print_nl mov eax, [l1]

call print_int call print_nl

memory1.asm

(15)

15

Reading data from memory

segment .data l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, l1 call print_int call print_nl mov eax, [l1]

call print_int call print_nl

memory1.asm

(16)

segment .data l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, asm_main call print_int

call print_nl

mov eax, [asm_main]

call print_int call print_nl

Data labels vs. Code labels

memory2.asm

(17)

17

Data labels vs. Code labels

segment .data l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, asm_main call print_int

call print_nl

mov eax, [asm_main]

call print_int call print_nl

memory2.asm

(18)

l1: db 123 l2: dw 1000 l3: db 11010b l4: db 12o l6: dd 1A92h l7: dd 0x1A92 l8: db 'A' l9: db "B"

Putting data in memory

(19)

19

l1: db 123 l2: dw 1000 l3: db 11010b l4: db 12o l6: dd 1A92h l7: dd 0x1A92 l8: db 'A' l9: db "B"

Putting data in memory

data size (not data type!)

(20)

Putting data in memory

db 1 byte dw 2 bytes dd 4 bytes dq 8 bytes dt 10 bytes l1: db 123

l2: dw 1000 l3: db 11010b l4: db 12o l6: dd 1A92h l7: dd 0x1A92 l8: db 'A' l9: db "B"

data size (not data type!)

(21)

21

Putting data in memory

mov eax, l1 call print_int call print_nl

mov eax, l2 call print_int call print_nl

mov eax, l3 call print_int call print_nl

mov al, [l8]

call print_char call print_nl

l1: db 123 l2: dw 1000 l3: db 11010b l4: db 12o l6: dd 1A92h l7: dd 0x1A92 l8: db 'A' l9: db "B"

data size

(22)

Putting data in memory

mov eax, l1 call print_int call print_nl

mov eax, l2 call print_int call print_nl

mov eax, l3 call print_int call print_nl

mov al, [l8]

call print_char call print_nl

l1: db 123 l2: dw 1000 l3: db 11010b l4: db 12o l6: dd 1A92h l7: dd 0x1A92 l8: db 'A' l9: db "B"

data size

(23)

23

Definitions in the book

Carter, PC Assembly Language, 2007.

(24)

Putting data in memory

Where are the variables?

l1: db 123 l2: dw 1000 l3: db 11010b l4: db 12o l6: dd 1A92h l7: dd 0x1A92 l8: db 'A' l9: db "B"

data size

(25)

25

Putting data in memory

High-level languages (like C)

● Variables

Low-level language (assembly)

● Labels (Symbols, Addresses) l1: db 123

l2: dw 1000 l3: db 11010b l4: db 12o l6: dd 1A92h l7: dd 0x1A92 l8: db 'A' l9: db "B"

data size

(26)

segment .data

l1: dd 11, 12, 13, 14, 15, 16

Putting data in memory

mov eax, [l1]

call print_int call print_nl mov eax, [l1+1]

call print_int call print_nl mov eax, [l1+2]

call print_int call print_nl mov eax, [l1+3]

call print_int call print_nl mov eax, [l1+4]

call print_int call print_nl

(27)

27

segment .data

l1: dd 11, 12, 13, 14, 15, 16

Putting data in memory

mov eax, [l1]

call print_int call print_nl mov eax, [l1+1]

call print_int call print_nl mov eax, [l1+2]

call print_int call print_nl mov eax, [l1+3]

call print_int call print_nl mov eax, [l1+4]

call print_int call print_nl

(28)

segment .data

l1: dd 11, 12, 13, 14, 15, 16 l2: dd 8, 8, 8, 8, 8, 8, 8, 8, 8 l3: times 9 dd 8

l4: resd 9 l5: resw 18 l6: resb 36

Putting data in memory

(29)

29

Argument types

segment .data

l1: dd 11, 12, 13, 14, 15, 16 segment .text

mov eax, [l1]

mov [l1+4], ebx mov eax, ebx mov eax, l1 mov eax, 123

memory

immediate (constant)

register

(30)

Invalid mem,mem assembly commands

segment .data

l1: dd 11, 12, 13, 14 l2: dd 100

segment .text

mov [l1], [l2]

add [l1], [l2]

sub [l1], [l2]

adc [l1], [l2]

sbb [l1], [l2]

cmp [l1], [l2]

and [l1], [l2]

or [l1], [l2]

xor [l1], [l2]

(31)

31

Invalid mem,mem assembly commands

segment .data

l1: dd 11, 12, 13, 14 l2: dd 100

segment .text

mov [l1], [l2]

add [l1], [l2]

sub [l1], [l2]

adc [l1], [l2]

sbb [l1], [l2]

cmp [l1], [l2]

and [l1], [l2]

or [l1], [l2]

xor [l1], [l2]

invalid!

(32)

Operation size

segment .data

l1: dd 11, 13, 14 l2: dd 100

segment .text

mov [l1], eax add eax, [l2]

sub eax, 44 mov [l1], 44

(33)

33

Operation size

segment .data

l1: dd 11, 13, 14 l2: dd 100

segment .text

mov [l1], eax add eax, [l2]

sub eax, 44 mov [l1], 44

mov dword [l1], 44 mov word [l1], 44 mov byte [l1], 44

(34)

Operation size

segment .data

l1: dd 11, 13, 14 l2: dd 100

segment .text

mov [l1], eax add eax, [l2]

sub eax, 44 mov [l1], 44

mov dword [l1], 44 mov word [l1], 44 mov byte [l1], 44

What happens when we write dword?

(35)

35

Operation size

segment .data

l1: dd 11, 13, 14 l2: dd 100

segment .text

mov [l1], eax add eax, [l2]

sub eax, 44 mov [l1], 44

mov dword [l1], 44 mov word [l1], 44 mov byte [l1], 44

(36)

What is the difference?

segment .data l1: dd 1324 segment .text

segment .data l1: resd 1 segment .text

mov dword [l1], 1324

(37)

37

Assembly command formats

● List of x86 instructions

○ http://www.felixcloutier.com/x86/

○ https://c9x.me/x86/

○ https://zsmith.co/intel.html

(38)

Storing multibyte data

segment .data

a: dd 16753508

segment .text : :

mov eax, 0

mov al, [a]

call print_int call print_nl

endianness1.asm

(39)

39

Storing multibyte data

00 FF A3 64 16753508

segment .data

a: dd 16753508

segment .text : :

mov eax, 0

mov al, [a]

call print_int call print_nl

endianness1.asm

(40)

Storing multibyte data

00 FF A3 64 16753508

MSB LSB

segment .data

a: dd 16753508

segment .text : :

mov eax, 0

mov al, [a]

call print_int call print_nl

endianness1.asm

(41)

41

Storing multibyte data

00 FF A3 64 16753508

MSB LSB

0 255 163 100 decimal

segment .data

a: dd 16753508

segment .text : :

mov eax, 0

mov al, [a]

call print_int call print_nl

endianness1.asm

(42)

Storing multibyte data

00 FF A3 64 16753508

MSB LSB

0 255 163 100 decimal

2091 2090 2089 2088

Memory

2092 segment .data

a: dd 16753508

segment .text : :

mov eax, 0

mov al, [a]

call print_int call print_nl

endianness1.asm

(43)

43

Storing multibyte data

00 FF A3 64 16753508

MSB LSB

decimal

0

2091 2090 2089 2088

Memory

2092 segment .data

a: dd 16753508

segment .text : :

mov eax, 0

mov al, [a]

call print_int call print_nl

endianness1.asm

0 255 163 100

(44)

Storing multibyte data

00 FF A3 64 16753508

MSB LSB

0 255 163 100 decimal

255 0

2091 2090 2089 2088

Memory

2092 segment .data

a: dd 16753508

segment .text : :

mov eax, 0

mov al, [a]

call print_int call print_nl

endianness1.asm

(45)

45

Storing multibyte data

00 FF A3 64 16753508

MSB LSB

0 255 163 100

decimal 163

255 0

2091 2090 2089 2088

Memory

2092 segment .data

a: dd 16753508

segment .text : :

mov eax, 0

mov al, [a]

call print_int call print_nl

endianness1.asm

(46)

Storing multibyte data

00 FF A3 64 16753508

MSB LSB

0 255 163 100 decimal

100 163 255 0

2091 2090 2089 2088

Memory

2092 segment .data

a: dd 16753508

segment .text : :

mov eax, 0

mov al, [a]

call print_int call print_nl

endianness1.asm

(47)

47

Storing multibyte data

00 FF A3 64 16753508

MSB LSB

0 255 163 100 decimal

100 163 255 0

2091 2090 2089 2088

Memory

2092 segment .data

a: dd 16753508

segment .text : :

mov eax, 0

mov al, [a]

call print_int call print_nl

endianness1.asm

(48)

48

Endianness

segment .data

a: dd 16753508 segment .text

:

mov eax, 0 mov al, [a]

call print_int call print_nl mov al, [a+1]

call print_int call print_nl mov al, [a+2]

call print_int call print_nl mov al, [a+3]

call print_int

00 FF A3 64 16753508

MSB LSB

0 255 163 100 decimal

100 163 255 0 Memory

0 255 163 100 Memory

Big Endian

Little Endian (e.g. x86)

(49)

49

Endianness

00 FF A3 64 16753508

MSB LSB

0 255 163 100 decimal

100 163 255 0 Memory

0 255 163 100 Memory

Big Endian

Little Endian (e.g. x86)

segment .data

a: dd 16753508 segment .text

:

mov eax, 0 mov al, [a]

call print_int call print_nl mov al, [a+1]

call print_int call print_nl mov al, [a+2]

call print_int call print_nl mov al, [a+3]

call print_int

call print_nl endianness2.asm

(50)

Checking endianness in C

1A 2B 3C 4D Big Endian

4D 3C 2B 1A

Little Endian (e.g. x86)

1032 1032

a: 1032 p:

a: 1032 p:

unsigned int a = 0x1A2B3C4D;

printf("%X\n", a);

unsigned char *p = (unsigned char *)(&a);

printf("%X\n", *p);

printf("%X\n", *(p+1));

printf("%X\n", *(p+2));

printf("%X\n", *(p+3));

test_endianness.c

(51)

51

Checking endianness in C

1A 2B 3C 4D Big Endian

4D 3C 2B 1A

Little Endian (e.g. x86)

1032 1032

a: 1032 p:

a: 1032 p:

test_endianness.c unsigned int a = 0x1A2B3C4D;

printf("%X\n", a);

unsigned char *p = (unsigned char *)(&a);

printf("%X\n", *p);

printf("%X\n", *(p+1));

printf("%X\n", *(p+2));

printf("%X\n", *(p+3));

test_endianness.c

(52)

Change endianness

AX:

1A 2B 3C 4D Big Endian

4D 3C 2B 1A

Little Endian (e.g. x86)

(53)

53

Change endianness

AX:

xchg ah, al ; 16 bit

1A 2B 3C 4D Big Endian

4D 3C 2B 1A

Little Endian (e.g. x86)

(54)

Change endianness

AX:

xchg ah, al ; 16 bit

EAX:

1A

2B 3C 4D Big Endian

4D 3C 2B 1A

Little Endian (e.g. x86)

(55)

55

Change endianness

AX:

xchg ah, al ; 16 bit EAX:

bswap eax ; 32 bit

1A 2B 3C 4D Big Endian

4D 3C 2B 1A

Little Endian (e.g. x86)

(56)

Change endianness

AX:

xchg ah, al ; 16 bit EAX:

bswap eax ; 32 bit

bswap rax ; 64 bit (x64 only)

1A 2B 3C 4D Big Endian

4D 3C 2B 1A

Little Endian (e.g. x86)

(57)

57 segment .data

l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, asm_main call print_int

call print_nl

mov eax, [asm_main]

call print_int call print_nl

Remember: Data labels vs. Code labels

memory2.asm

(58)

Remember: Data labels vs. Code labels

segment .data l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, asm_main call print_int

call print_nl

mov eax, [asm_main]

call print_int call print_nl

memory2.asm

(59)

59

Remember: Data labels vs. Code labels

segment .data l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, asm_main call print_int

call print_nl

mov eax, [asm_main]

call print_int call print_nl

memory2.asm

(60)

Remember: Data labels vs. Code labels

segment .data l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, asm_main call print_int

call print_nl

mov eax, [asm_main]

call print_int call print_nl

memory2.asm

(61)

61

Remember: Data labels vs. Code labels

segment .data l1: dd 1234

segment .text

global asm_main asm_main:

enter 0,0 pusha

mov eax, asm_main call print_int

call print_nl

mov eax, [asm_main]

call print_int call print_nl

memory2.asm

Referensi

Dokumen terkait

TITLE: EFFECT OF ASSEMBLY LINE AND NORMAL WORKING ENVIRONMENT TO CYCLE TIME.. This report submitted in accordance with requirement of the

1) Change the PrintIntArray subprogram so that it prints the array from the last element to the first element. Translate this pseudo code into MIPS assembly. This is a problem if

One advantage of learning assembly language programming is that it directly exposes many of the types of memory heap, static data, text, stack and registers used in a program, and

CSE444: Introduction to Robotics Lesson 5a: Working with Sensors ALL Follows Summer 2019... Properties of Measurement System DSAH@DIU, Summer 2019

Column-major ● What does row-major and column-major mean?. ○ Matlab vs Numpy

● Does not matter when 2's complement signed integers are used ● Not the case for multiplication and division... Overflow ● carry flag CF: unsigned ● overflow flag OF:

pushf and popf ● push and pop FLAGS/EFLAGS register ● some assemblers use pushf/pushfd/pushfq, etc... the CALL instruction CALL is merely a form of