Program Flow
The x86 assembly has an unconditional jump operation, jmp
, which can take an immediate address, a register or an indirect address as a parameter (note that most RISC processors only support a link register or short immediate displacement for jumping).
Also supported are several conditional jumps, including jz
(jump on zero), jnz
(jump on non-zero), jg
(jump on greater than, signed), jl
(jump on less than, signed), ja
(jump on above/greater than, unsigned), jb
(jump on below/less than, unsigned). These conditional operations are based on the state of specific bits in the (E)FLAGS register. Many arithmetic and logic operations set, clear or complement these flags depending on their result. The comparison cmp
(compare) and test
instructions set the flags as if they had performed a subtraction or a bitwise AND operation, respectively, without altering the values of the operands. There are also instructions such as clc
(clear carry flag) and cmc
(complement carry flag) which work on the flags directly. Floating point comparisons are performed via fcom
or ficom
instructions which eventually have to be converted to integer flags.
Each jump operation has three different forms, depending on the size of the operand. A short jump uses an 8-bit signed operand, which is a relative offset from the current instruction. A near jump is similar to a short jump but uses a 16-bit signed operand (in real or protected mode) or a 32-bit signed operand (in 32-bit protected mode only). A far jump is one that uses the full segment base:offset value as an absolute address. There are also indirect and indexed forms of each of these.
In addition to the simple jump operations, there are the call
(call a subroutine) and ret
(return from subroutine) instructions. Before transferring control to the subroutine, call
pushes the segment offset address of the instruction following the call
onto the stack; ret
pops this value off the stack, and jumps to it, effectively returning the flow of control to that part of the program. In the case of a far call
, the segment base is pushed following the offset; far ret
pops the offset and then the segment base to return.
There are also two similar instructions, int
(interrupt), which saves the current (E)FLAGS register value on the stack, then performs a far call
, except that instead of an address, it uses an interrupt vector, an index into a table of interrupt handler addresses. Typically, the interrupt handler saves all other CPU registers it uses, unless they are used to return the result of an operation to the calling program (in software called interrupts). The matching return from interrupt instruction is iret
, which restores the flags after returning. Soft Interrupts of the type described above are used by some operating systems for system calls, and can also be used in debugging hard interrupt handlers. Hard interrupts are triggered by external hardware events, and must preserve all register values as the state of the currently executing program is unknown. In Protected Mode, interrupts may be set up by the OS to trigger a task switch, which will automatically save all registers of the active task.
Read more about this topic: X86 Assembly Language
Famous quotes containing the words program and/or flow:
“The man who would change the name of Arkansas is the original, iron-jawed, brass-mouthed, copper-bellied corpse-maker from the wilds of the Ozarks! He is the man they call Sudden Death and General Desolation! Sired by a hurricane, damd by an earthquake, half-brother to the cholera, nearly related to the smallpox on his mothers side!”
—Administration in the State of Arka, U.S. public relief program (1935-1943)
“I candidly confess that I have ever looked on Cuba as the most interesting addition which could ever be made to our system of States. The control which, with Florida, this island would give us over the Gulf of Mexico, and the countries and isthmus bordering on it, as well as all those whose waters flow into it, would fill up the measure of our political well-being.”
—Thomas Jefferson (17431826)