home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
CTFASMTT.ZIP
/
LESSON5.DOC
< prev
next >
Wrap
Text File
|
1994-10-30
|
3KB
|
99 lines
LESSON5 - FLAGS AND JUMPS
in the last chapter we talked about fixed points and their limitations
(assembly has integers you just have to give them neg value)
of shr,shl,ror,rol and the need to detect zero so what we have is
flags, 16 bit register the each bit is a different status of something
that happed.
major flags :
CF - Carry flag is set when there is a borrow in some command lets say
"sub ax,13" and ax is 21 so a borrow will apear.
PF - Parity flag is set when the LSB of the operation is even,
lets say "add ax,11" and ax is 11 so the flag will be set (even)
ZF - Zero flag is set when the operation is zero lets say "dec ax" and ax
is now 0 so ZF will be set.
OF - Overflow flag is set when the operation is beyond the limitation of
the register lets say "add ax,65535" (ax=100) so the flag will be
set.
there are more flags but much of them aren't used so (if you want to know
open a book or norton guides to assembler)
now before anything else a most important command is :
CMP register,value - Compare a register to a certain value and set all
needed flags.
lets say "cmp ax,0" and ax is 0 so the ZF will be set.
but (you may ask) how do we use those flags well the answer is
conitional jumps !!
JNE - Jump if not equal
JZ - Jump if zero
JE - Jump if equal
JB - Jump if below
JA - Jump if above
JAE - Jump if above and equal
JBE - Jump if below and equal
JC - Jump if carry
JNC - Jump if not carrt
JS - Jump if sign
JNS - Jump if not sign
JMP - Unconditional jump
note : all of these conditional jumps (not jmp) can jump only in the range
of near (256/0ffh bytes) and only jmp can jump to the entire code !!!
use - JMP label
example :
mov ax,10
mov cx,20
mov dx,0
div cx ; does 10/20 result is 0 (if you don't know that so go back
; and repeat the commands.
cmp ax,0 ; is ax 0
jz @iszero ; then it is so jump to label
mov cx,ax
mov dx,0
div cx ; it will never reach it cause it will never be larger then
; zero (if you comment the jz so you will get divide by 0)
@iszero : ; this is a label the "@" before the label is optional
mov ax,4c00h ; terminate
int 21h
now lets get back to our fixed points that we want to convert :
mov ax,100 ; our circle radios
mov cx,181 ; 181/256 is 0.707 (sin(45))
mul cx ; multiply (result : 18,100)
cmp ax,0 ; is ax 0
jb @neg1 ; jmp below so if neg jump to label
shr ax,8
jmp @done ; don't want to get with the div
@neg1 :
mov dx,0
mov cx,256
idiv cx ; ax/256 just use idiv it's a div for integers
@done :
mov ax,4c000h ; terminate
int 21h
so that's about it in jumps and flags, I sugest that you will train a bit
about all the stuff that you have learned in those chapters cause
it is very important to understand those (those are the needed basic)
in the next chpaters we will start transfering memory blocks,
and use graphics.