.. Registers: storing data in the CPU
emu8086 does NOT use 32 bit registers (eax, ebx, etc...)
Where do we store values? How much storage? What type of binary coding?
What are REGISTERS?
Advantages in using?
Are they necessary?



Examples: moving data into registers
MOV al, 255
MOV ax, 0f54ah
MOV bx, -1
MOV bh, 11010101b
Are these different from each other?
MOV ah, -1
MOV ah, 0ffh
MOV ah, 11111111b
MOV ah, 255
ugh...
MOV ax, 1110001101011101b
What are STATUS FLAGS?

Sign: result is negative
Zero: result is zero
Carry: unsigned arithmetic out of range
Overflow: signed arithmetic out of range
MOV al, 0ffh
ADD al, 1
problem? when? how do we know???
Can't we just store everything in registers? Why not?
.. emu 8086: registers & memory (RAM)
.. Data Definitions: storing data in RAM
Better than registers?
======================
Where do we store values? How much storage do we use?
What type of binary coding? How do we define storage?
RAM
Data definition statement sets aside storage in memory.
May optionally assign a name (label) to the data
Syntax: [name] directive initializer [,initializer] . . .
price DW 0
fname DB "Joseph",0


DB 8-bit unsigned & signed integer
DW 16-bit unsigned & signed integer
DD 32-bit unsigned & signed integer
first DB 10, 32, 41h
second DB 0Ah, 20h, ‘A’
third DB ?
---------------------------------------------
How many bytes? How organized?
How represented? Draw it! Symbol Table?
value1 DB 'A' ; character constant
value2 DB 0 ; smallest unsigned byte
value3 DB 255 ; largest unsigned byte
value4 DB -128 ; smallest signed byte
value5 DB +127 ; largest signed byte
value6 DB ? ; uninitialized byte
list1 DB 10, 32, 41h, 00100010b
list2 DB 0Ah, 20h, 'A', 22h
array1 DB 20 DUP(0)
greeting1 DB "Good afternoon", 0
A string is stored as a sequence of bytes - why ZERO at end?
Labels let you use symbolic names for memory locations!
The offset of a byte in storage is the distance from the beginning of
the segment (.data) to the first byte of the variable.
Remember this one?
first db 10, 32, 41h
second db 0Ah, 20h, ‘A’
third db ?
---------------------------------------------
How represented? Draw it! Symbol Table?
Memory Symbol Table****
0 - 0A first = 0
1 - 20 second = 3
2 - 41 third = 6
3 - 0A
4 - 20
5 - 41
6 - ??
; how else could you write this?
Var1 db 'ABC'
Var2 db "DEFG"
The offset of Var1 ('A') is 0
‘B’ is at offset Var1 + 1 = 1
‘D’ is at offset Var2 or at Var1+3 = 3
‘F’ is at offset Var2+2 or at Var1+5 = 5
; how else could you write this?
Var1 db 3, 7
Var2 db 4, 25
The offset of Var1 (3) is 0
7 is at offset Var1 + 1 = 1
4 is at offset Var2 or at Var1+2 = 2
25 is at offset Var2+1 or at Var1+3 = 3
String Examples:
str1 DB "Enter your name",0
str2 DB 'Error: halting program',0
str3 DB 'A','E','I','O','U'
greeting1 BYTE "Welcome to assembly "
BYTE "language", 0Dh,0Ah, 0
0Dh is what? 0Ah is what?
DUP does what?
var1 DB 20 DUP(0) ; 20 bytes, all equal to zero
var2 DB 20 DUP(?) ; 20 bytes, uninitialized
var3 DB 10, 13, 65, 3 DUP(0), 20 ;
; ----------------- Word Values ---------------------
=======================================================
word1 DW 65535 ; largest unsigned value
word1 DW 0 ; smallest unsigned value
word2 DW 32767 ; largest signed value
word2 DW -32768 ; smallest signed value
word3 DW ? ; uninitialized
What is "little Endian?
Intel’s x86 are little endian processors: the lowest order byte
(of a word or double word) is stored at the lowest address.
X DW 1234h ; 2 bytes at X
-------------------------
offset: value:
0 34h - least significant byte
1 12h - most
X DW 256 ; 2 bytes at X
-------------------------
offset: value:
0 00h - least significant byte
1 01h - most
X DW 256, 1234h ; 4 bytes at X
-------------------------
offset: value:
0 00h - least significant byte
1 01h - most
2 34h - least significant byte
3 12h - most
If a value fits into a byte, it will be stored in
the lowest ordered one available.
Ex:
init DW ‘A’ ;ascii code 41h
the value will be stored as:
-------------------------
offset: value:
0 41h - least significant byte
1 00h - most
init DW ‘AB’ ; ascii codes 41h, 42h
-------------------------
offset: value:
0 41h - least significant byte
1 42h - most
.. Constants data: =, EQU and $
= Symbolic Constant
name = expression
expression is a 32-bit integer
MAY be redefined
prod = 10 * 5 ; Evaluates an expression
maxInt = 7FFFh ; Maximum 16-bit signed value
minInt = 8000h ; Minimum 16-bit signed value
maxUInt = 0FFFFh ; Maximum 16-bit unsigned value
string = ‘XY’ ; Up to two characters allowed
count = 500
WHY? good programming??
NO STORAGE ALLOCATED!!
^^
EQU
Define a symbol as either an integer OR text expression.
May NOT be redefined
PI EQU <3.1416>
pressKey EQU <"Press any key to continue...",0> ;NO STORAGE ALLOCATED!!
^^
prompt DB pressKey ; storage IS allocated here...
^^
.. The location counter: $
$
Location counter
used at assembly time
tracks the offset from 0 (start) of
where each byte of the program is stored as it is generated
Program counter
used at run time
tracks the instruction address of the next executable instruction
$ operator returns the current value of LOCATION COUNTER.
Use it to compute the string length at assembly time.
list DB 10,20,30,40
ListSize = ($ - list)
so the value of List Size is ??
-----------------------------------
list DB 10,20,30,40, 50, 60, 70
ListSize = ($ - list)
so the value of List Size is ??
-----------------------------------
LongString db 'This is a piece of text that I'
db 'want to type on 2 separate lines'
LongString_length = ($ - LongString)
Offset of ‘w’(in want) = 1 + offset of ‘I’
Note: do not need to put a label on every line...
in fact everything could be an offset from a label at ZERO - why bad?
.. Little Endian Order
Little Endian Order
===================
Little endian order refers to the way Intel stores integers in memory.
Multi-byte integers are stored in reverse order, with least
significant byte stored at lowest address
For example, the doubleword 12345678h would be stored as:
DD 12345678h
PTR can also be used to combine elements of a smaller data type
and move them into a larger operand.
myBytes DB 12h,34h,56h,78h
mov ax, DW PTR [myBytes] ;AX = 3412h
mov ax, DW PTR [myBytes+1] ;AX = 5634h
mov ax, DW PTR [myBytes+2] ;AX = 7856h
mov eax, DD PTR myBytes ;EAX = 78563412h
varB DB 65h, 31h, 02h, 05h
varW DW 6543h, 1202h
varD DD 12345678h
mov ax, WORD PTR [varB+2] ; a. 0502h
mov bl, BYTE PTR varD ; b. 78h
mov bl, BYTE PTR [varW+2] ; c. 02h
mov ax, WORD PTR [varD+2] ; d. 1234h
mov eax, DWORD PTR varW ; e. 12026543h