Upload
jason-parrish
View
227
Download
2
Tags:
Embed Size (px)
Citation preview
Chapter 4Basic Instructions
4.1 Copying Data
mov Instructions
• mov (“move”) instructions are really copy instructions, like simple assignment statements in a high-level language
• Format: mov destination, source
registerormemory
register,memoryorimmediate
Operand Restrictions
• Operands must be same size• Can’t move from memory to memory
– mov nbr1, nbr2illegal if nbr1 and nbr2 reference doublewords in memory
– Instead use a registermov eax, nbr2mov nbr1, eax
• Can only move one byte, word or doubleword at a time
Effect on Flags
• In general, an instruction may have one of three effects:– no flags are altered– specific flags are given values depending on
the results of the instruction– some flags may be altered, but their settings
cannot be predicted
• No mov instruction changes any flag
Machine Code• Depends on operand type(s), with several
different opcodes used for mov instructions
• Word-size and doubleword-size instructions use same opcodes, but word-size instructions have 66 prefix byte
• Object and source code from listing fileB0 9B mov al, 15566| B8 009B mov ax, 155B8 0000009B mov eax, 155
ModR/M Byte
• Part of the object code for many instructions
• Used to encode specific registers
• Used to distinguish between instructions that share the same opcode
• Used to specify memory modes
ModR/M Fields
• mod (mode), 2 bits
• reg (register), 3 bits
• r/m (register/memory), 3 bits
• Examples of encodings–mod = 00 and r/m = 101 combined always
means direct memory addressing– reg = 011 means the EBX register in a 32-bit
instruction
xchg Instruction
• Swaps the values referenced by its two operands– Can’t have both operands in memory
• Does not alter any flag
4.2 Integer Addition and Subtraction Instructions
add Instruction• Format: add destination, source• The integer at source is added to the
integer at destination and the sum replaces the old value at destination
• SF, ZF, OF, CF, PF and AF flags are set according to the value of the result of the operation– Example: CF = 1 if there is a carry out of the
sum
Addition Example
• BeforeEAX: 00000075ECX: 000001A2
• Instructionadd eax, ecx
• After EAX: 00000217ECX: 000001A2SF=0 ZF=0 CF=0 OF=0
sub Instruction• Format: sub destination, source• The integer at source is subtracted from
the integer at destination and the difference replaces the old value at destination
• SF, ZF, OF, CF, PF and AF flags are set according to the value of the result of the operation– Example: ZF = 1 if the difference is zero
Subtraction Example
• Beforedoubleword at Dbl: 00000100
• Instructionsub Dbl, 2
• After Dbl: 000000FESF=0 ZF=0 CF=0 OF=0
Instruction Encoding
• Opcode depends on operand types
• The ModR/M byte distinguishes– Between operand types– Between add, sub and other operations for
certain operand types
• An small immediate operand is sometimes encoded as a byte even in a 32-bit instruction
Increment and Decrement Instructions
• inc destination– Adds 1 to destination
• dec destination– Subtracts 1 from destination
• Each sets same flags as add or sub except for CF which isn’t changed
neg Instruction
• neg destination• Negates (takes the 2's complement of) its
operand– A positive value gives a negative result – A negative value will become positive– Zero remains 0
• Affects same flags as add and sub
Programming in Assembly Language
• Start with a design
• Plan register usage– Decide what registers will be used for what
variables in the design– There are only a few available registers
• Plan memory usage
4.3 Multiplication Instructions
Multiplication Instruction Mnemonics
• mul for unsigned multiplication– Operands treated as unsigned numbers
• imul for signed multiplication– Operands treated as signed numbers and
result is positive or negative depending on the signs of the operands
mul Instruction Format• mul source • Single operand may be byte, word,
doubleword or quadword in register or memory (not immediate) and specifies one factor
• Location of other factor is implied– AL for byte-size source– AX for word source– EAX for doubleword source– RAX for quadword source
mul Instruction Operation• When a byte source is multiplied by the
value in AL, the product is put in AX• When a word source is multiplied by the
value in AX, the product is put in DX:AX– The high-order 16 bits in DX and the low-order
16 bits in AX
• When a doubleword source is multiplied by the value in EAX, the product is put in EDX:EAX
• Product of two quadwords in RAX:DAX
Double-Length Product• The “double-length” product ensures that
the result will always fit in the destination location
• If significant bits of the product actually “spill over” into the high-order half (AH, DX or EDX), then CF and OF are both set to 1
• If the high-order half is not significant, then CF and OF are both cleared to 0– For unsigned multiplication, this is when the
high-order half is all 0’s
mul Instruction Example
• BeforeEAX: 00000005 EBX: 00000002EDX: ????????
• Instructionmul ebx
• After EAX: 0000000AEBX: 00000002EDX: 00000000CF=OF=0
imul Instruction Formats
• imul source
• imul register, source
• imul register, source, immediate
imul source
• “Single-operand format”
• Similar to mul source except for signed operands
• CF=OF=0 if each bit in the high-order half is the same as the sign bit in the low-order half
• CF=OF=1 otherwise (the bits in the high-order half are significant)
Single-Operand Example
• BeforeAX: ??05 byte at Factor: FF
• Instructionimul Factor
• After AX: FFFBCF=OF=0
imul register,source• “Two-operand format”• Source operand can be in a register, in
memory, or immediate• Register contains other factor, and also
specifies the destination• Both operands must be word-size or
doubleword-size, not byte-size• Product must “fit” in destination register
– CF and OF are cleared to 0 if result fits– CF and OF are set to 1 if it doesn’t fit
Two-operand Example
• BeforeEBX: 0000000A
• Instructionimul ebx, 10
• After EBX: 00000064CF=OF=0
imul register,source,immediate• “Three-operand format”• The two factors are given by source (register
or memory) and the immediate value• The first operand, a register, specifies the
destination for the product• Operands register and source are the same
size, both 16-bit or both 32-bit (not 8-bit)• If the product will fit in the destination
register, then CF and OF are cleared to 0; if not, they are set to 1
Three-Operand Example
• Beforeword at Value: 08F2 BX: ????
• Instructionimul bx, Value, 1000
• After BX: F150CF=OF=1
4.4 Division Instructions
Division Instruction Formats
•idiv sourcefor signed operands
•div sourcefor unsigned operands
• source identifies the divisor– Byte, word, doubleword or quadword– In memory or register, but not immediate
Implicit Dividend for div and idiv
• Byte source divided into word in AX
• Word source divided into doubleword in DX:AX
• Doubleword source divided into quadword in EDX:EAX
• Quadword source divided into RDX:RAX
Results of div and idiv• Byte-size divisor:
quotient in AL and remainder in AH
• Word-size divisor:quotient in AX and remainder in DX
• Doubleword-size divisor: quotient in EAX and remainder in EDX
• Quadword-size divisor: quotient in RAX and remainder in RDX
Results of div and idiv
• All division operations satisfy the relation dividend = quotient*divisor + remainder– For signed division, the remainder will have
same sign as dividend
Flag Settings
• Division instructions do not set flags to any meaningful values
• They may change previously set values of AF, CF, OF, PF, SF or ZF
Unsigned Division Example• Before
EDX: 00 00 00 00EAX: 00 00 00 64EBX: 00 00 00 0D
• Instructiondiv ebx ; 100/13
• After EDX: 00000009EAX: 00000007
100 = 7 * 13 + 9
Signed Division Example• Before
EDX: FF FF FF FFEAX: FF FF FF 9CECX: 00 00 00 0D
• Instructionidiv ecx ; -100/13
• After EDX: FFFFFFF7EAX: FFFFFFF9
–100 = (–7) * 13 + (–9)
Errors in Division
• Caused by– Dividing by 0, or– Quotient too large to fit in destination
• Triggers an exception– The interrupt handler routine that services this
exception may vary from system to system– When a division error occurs for a program
running under Visual Studio, an error window pops up
Preparing for Division
• Dividend must be extended to double length
• Example– Copy a doubleword dividend to EAX– Extend dividend to EDX:EAX
• For unsigned division, use mov edx, 0• For signed division, use cdq instruction
– Finally use div or idiv instruction
Convert Instructions• No operand• cbw
sign extends the byte in AL to the word in AX• cwd
sign extends the word in AX to the doubleword in DX:AX
• cdqsign extends the doubleword in EAX to the quadword in EDX:EAX
• cqosign extends the quadword in RAX to RDX:RAX