Title: ECE291 Computer Engineering II Lecture 6
1ECE291Computer Engineering IILecture 6
Lecture 7
- Dr. Zbigniew Kalbarczyk
- University of Illinois at Urbana- Champaign
2Outline
- Program organization
- MASM directives
- Multiplication
- Division
3Program Organization
- Create block structure and/or pseudocode on paper
to get a clear concept of program control flow
and data structures - Break the total program into logical
procedures/macros - Use jumps, loops, etc. where appropriate
- Use descriptive names for variables
- noun_type for types
- nouns for variables
- verbs for procedures/functions
4Debugging Hints
- Good program organization helps
- Programs do not work the first time
- Strategy to find problems
- Use DEBUG breakpoints to check program progress
- Use COMMENT to temporarily remove sections of
code - "print" statements announce milestones in program
- Test values/cases
- Try forcing registers/variables to test output of
a procedure - Use "print" statements to display critical data
- Double-check your own logic (Did you miss a
special case?) - Try a different algorithm, if all else fails...
5MASM Directives
- General
- TITLE my_program.asm
- Includes drive\path\filename
- Definitions
- DB define byte (8bits)
- DW define word (16 bits)
- DD define doubleword (32 bits)
- EQU names a constant
- Labels
6MASM Directives
- Macros
- Instead of using procedures, which require both
stack and time resources, macros are fast and
flexible - Advantages
- speed no call instruction
- readability - easier to understand program
function - Drawbacks -
- space using the MACRO multiple times duplicates
the code - tricky to debug (in particular when you have
nested MACROs) - Procedures
- name PROC NEAR/FAR
- ENDP
7MASM Directives (cont.)
- References to procedures
- EXTERN name NEAR/FAR/BYTE/WORD
- PUBLIC name
- Segment definition
- SEGMENT name PUBLIC/STACK
- ENDS
- Segment register Hooks
- ASSUME CSCSEG DESCSEG SSSTACK
8Example Program Structure
- TITLE ECE291MPXXX
- COMMENT In this MP you will develop program
which take input from the keyboard -
- Constants
- ASCII values for common characters
- CR EQU 13
- LF EQU 10
- ESCKEY EQU 27
- Externals
- -- LIB291 Routines
- extrn dspmsgnear, dspoutnear, kbdinnear
- extrn rsavenear, rrestnear, binascnear
9Example Program Structure (cont.)
- LIBMPXXX Routines (Your code will replace
calls to these functions) - extrn LibKbdHandlernear
- extrn LibMouseHandlernear
- extrn LibDisplayResultnear
- extrn MPXXXXITnear
- Stack
- stkseg segment stack
STACK SEGMENT - db 64 dup ('STACK ') 648
512 Bytes of Stack - stkseg ends
- Begin Code/Data
- cseg segment public 'CODE'
CODE SEGMENT - assume cscseg, dscseg, ssstkseg,
esnothing
10Example Program Structure (cont.)
- Variables
- inputValid db 0 0 InputBuffer
is not ready - 1 InputBuffer
is ready - -1 Esc key
pressed -
- operandsStr db 'Operands ',''
- OutputBuffer db 16 dup(?),'' Contains
formatted output - (Should be
terminated with '')
- MAXBUFLENGTH EQU 24
- InputBuffer db MAXBUFLENGTH dup(?),''
Contains one line of user input - include graphData.dat data
- PUBLIC OutputBuffer, inputValid, operandsStr
- PUBLIC graphData
11Example Program Structure (cont.)
- Procedures
- KbdHandler PROC NEAR
- ltYour code heregt
- KbdHandler ENDP
- MouseHandler PROC NEAR
- ltYour code heregt
- MouseHandler ENDP
- DisplayResult PROC NEAR
- ltYour code heregt
- DisplayResult ENDP
12Example Program Structure (cont.)
- Main Procedure
- MAIN PROC FAR
- MOV AX, CSEG Use common code and
data segment - MOV DS, AX
- MOV AX, 0B800h Use extra segment to
access video screen - MOV ES, AX
- lthere comes your main proceduregt
-
- CALL MPXXXXIT Exit
to DOS - MAIN ENDP
- CSEG ENDS
- END MAIN
13Multiplication
- The product after a multiplication is always a
double-width product, e.g, - if we multiply two 16-bit numbers , they generate
a 32-bit product - unsigned (216 - 1) (216 - 1) (232 - 2 216
1 lt (232 - 1) - signed (-215) (-215) 230 lt (231 - 1)
- overflow cannot occur
- Modification of Flags
- Most flags are undefined after multiplication
- O and C flags clear to 0 if the result fit into
half-size register - e.g., if the most significant 16 bits of the
product are 0, both flags C and O clear to 0
14Multiplication (cont.)
- Two different instructions for multiplication
- MUL Multiply unsigned
- IMUL Integer Multiply (2s complement)
- Multiplication is performed on bytes, words, or
double words - Which operation to perform depends on the size of
the multiplier - The multiplier can be any register or any memory
location -
- mul cx AX CX (unsigned result in
DX--AX)imul BYTE PTR si AX word
contents of memory location addressed by
SI (signed product in DX--AX)
15Multiplication(16 bit)
- The use of the AX (and DX) registers is
implied!!!!! - Multiplicand AX
- Multiplier (16-bit register,
- 16-bit memory variable)
- DX, AX PRODUCT
- (High word in DX Low word in AX)
16Multiplication (cont.)
- 8086/8088 microprocessors do not allow to perform
immediate multiplication - 80286, 80386, and 80486 allow the immediate
multiplication by using a special version of the
multiply instruction - Immediate multiplication must be signed
multiplication and contains three operands - 16-bit destination register
- register or memory location that contains 16-bit
multiplicand - 8-bit or 16-bit immediate data used as a
multiplier - mul cx, dx, 12h multiplies 12h DX and
leaves 16-bit signed product in CX
17Multiplication
- 8-bit multiplication
- Multiplicand AL
- Multiplier (8-bit register,
- 8-bit memory variable)
- AX PRODUCT
- 32-bit multiplication
- Multiplicand EAX
- Multiplier (32-bit register,
- 32-bit memory variable)
- EDX, EAX PRODUCT (High word in EDX Low word
in EAX) - 32-bit multiplication is available only on 80386
and above
18Binary Multiplication
- Long Multiplication is done through shifts and
additions - This works if both numbers are positive
- To multiply a negative numbers, the CPU will
store the sign bits of the numbers, make both
numbers positive, compute the result, then negate
the result if necessary
0 1 1 0 0 0 1 0 (98)
x 0 0 1 0 0 1 0 1 (37) --------------------
----- 0 1 1 0 0 0 1 0 0
1 1 0 0 0 1 0 - - 0 1 1 0 0 0 1 0 - - -
- - (3626)
19Division
- X / Y Q R
- X Dividend
- Y Divisor
- Q Quotient
- R Remainder
- Note Remainder has the same
- sign as X (Dividend)
Examples (Signed Integers) X /
Y Q R 9 / 4 2 1 -9 / 4 -2 -1 9 / -4 -2 1 -9
/ -4 2 1
20Division (cont.)
- Two different instructions for division
- DIV Division unsigned
- IDIV Integer Division (2s complement)
- Division is performed on bytes, words, or double
words - Which operation to perform depends on the size of
the divisor - The dividend is always a double-width dividend
that is divided by the operand (divisor) - The divisor can be any register or any memory
location -
-
21Division(32-bit/16-bit)
- The use of the AX (and DX) registers is
implied!!!!! - Dividend DX, AX (high word in DX, low word in
AX) - Divisor (16-bit register, 16-bit memory
variable) - Quotient AX
- Remainder DX
22Division (cont.)
- 16-bit/8-bit
- Dividend AX
- Divisor (8-bit register, 8-bit memory variable)
- Quotient AL
- Remainder AH
- 64-bit/32-bit
- Dividend EDX, EAX (high double word in EDX, low
double word in EAX) - Divisor (32-bit register, 32-bit memory
variable) - Quotient EAX
- Remainder EDX
- Available on 80386 and above
23Division (cont.)
- Division of two equally sized words
- Prepare the dividend
- Unsigned numbers move zero into high order-word
- Signed numbers use signed extension (implicitly
uses AL, AX, DX registers) to fill high-word with
once or zeros - CBW (convert byte to word)
- AX xxxx xxxx snnn nnnn (before)
- AX ssss ssss snnn nnnn (after)
- CWD (convert word to double)
- DXAX xxxx xxxx xxxx xxxx snnn nnnn nnnn nnnn
(before) - DXAX ssss ssss ssss ssss snnn nnnn nnnn nnnn
(after) - CWDE (convert double to double-word extended) -
80386 and above
24Division (cont.)
- Flag settings
- none of the flag bits change predictably for a
division - A division can result in two types of errors
- divide by zero
- divide overflow (a small number divides into a
large number), e.g., 3000 / 2 - AX 3000
- Devisor is 2 gt 8 bit division is performed
- Quotient will be written to AL gt but 1500 does
not fit into AL - consequently we have divide overflow
- in both cases microprocessor generates interrupt
(interrupts are covered later in this course)
25Division (Example)
- Division of the byte contents of memory NUMB by
the contents of NUMB1 -
Unsigned MOV AL, NUMB get
NUMB MOV AH, 0 zero extend DIV NUMB1 MOV
ANSQ, AL save quotient MOV ANSR, AH
save remainder
Signed MOV AL, NUMB get NUMB CBW
signed-extend IDIV NUMB1 MOV ANSQ,
AL save quotient MOV ANSR, AH
save remainder
26Division (cont.)
- What do we do with remainder after division?
- use the remainder to round the result
- drop the remainder to truncate the result
- if the division is unsigned, rounding requires
that remainder is compared with half the divisor
to decide whether to round up the quotient - e.g., sequence of instructions that divide AX by
BL and round the result
DIV BL ADD AH, AH double remainder CMP AH,
BL test for rounding JB NEXT INC AL NEXT