Chapter 4 Basic 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 register or memory register, memory or immediate Operand Restrictions • Operands must be same size • Can’t move from memory to memory – mov nbr1, nbr2 illegal if nbr1 and nbr2 reference doublewords in memory – Instead use a register mov eax, nbr2 mov 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 wordsize instructions have 66 prefix byte • Object and source code from listing file B0 9B mov al, 155 66| B8 009B mov ax, 155 B8 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 • Before EAX: 00000075 ECX: 000001A2 • Instruction add eax, ecx • After EAX: 00000217 ECX: 000001A2 SF=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 • Before doubleword at Dbl: 00000100 • Instruction sub Dbl, 2 • After Dbl: 000000FE SF=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 loworder 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 • Before EAX: 00000005 EBX: 00000002 EDX: ???????? • Instruction mul ebx • After EAX: 0000000A EBX: 00000002 EDX: 00000000 CF=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 highorder half are significant) Single-Operand Example • Before AX: ??05 byte at Factor: FF • Instruction imul Factor • After AX: FFFB CF=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 • Before EBX: 0000000A • Instruction imul ebx, 10 • After EBX: 00000064 CF=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 • Before word at Value: 08F2 BX: ???? • Instruction imul bx, Value, 1000 • After BX: F150 CF=OF=1 4.4 Division Instructions Division Instruction Formats • idiv source for signed operands • div source for 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 00 EAX: 00 00 00 64 EBX: 00 00 00 0D • Instruction div ebx ; 100/13 • After EDX: 00000009 EAX: 00000007 100 = 7 * 13 + 9 Signed Division Example • Before EDX: FF FF FF FF EAX: FF FF FF 9C ECX: 00 00 00 0D • Instruction idiv ecx ; -100/13 • After EDX: FFFFFFF7 –100 = (–7) * 13 + (–9) EAX: FFFFFFF9 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 • cdq sign extends the doubleword in EAX to the quadword in EDX:EAX • cqo sign extends the quadword in RAX to RDX:RAX