以前写的,怕烂在电脑里,就拿出来晒晒吧~
因为数字不好,里面直线没画好,谁有兴趣可以把直线画规矩点
算法部分:
WenW64Gua proc Hwnd,IXI
local hdc,ps:PAINTSTRUCT,Penhandle,hMemDC,rect:RECT,bitmap,Brush
local yx,yy,x[4]:DWORD ,y[4]:DWORD ,r,g,hd:REAL8,fc
local Wx,Nx,yg,i,s,ii,XX,iii;外爻,内爻,卦
invoke GetDC,Hwnd
mov hdc,eax
invoke CreateCompatibleDC,hdc ;创建内存DC
mov hMemDC,eax
invoke GetClientRect,Hwnd,addr rect
mov eax,rect.bottom
sub eax,rect.top ;高
mov ecx,rect.right
sub ecx,rect.left ;宽
push eax
push ecx
push hdc
mov yy,400;圆心y
mov yx,400;圆心x
mov r,300 ;半径
mov g,6 ;高度初始化
mov fc,64*2
;弧度 = 3.1415926535 ÷ (64 × 2)
finit ;初始化FPU
fild fc ;128 把圆分成128*2分
FLDPI ;将pi装入
FDIV st,st(1) ; PI/128
FST hd ;结果保存到弧度
mov yg,0;卦初始化值
call CreateCompatibleBitmap;创建位图
mov bitmap,eax
invoke SelectObject,hMemDC,bitmap
invoke CreatePen,PS_SOLID,2,0
mov Penhandle,eax
invoke SelectObject,hMemDC,eax
invoke SetBkMode,hMemDC,TRANSPARENT
invoke CreateSolidBrush,00808080H;设置位图背景色
mov Brush,eax
invoke SelectObject,hMemDC,eax
invoke FloodFill,hMemDC,NULL,NULL,255;;设置位图背景色
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
mov i, 4 ;初始计次值
mov s,0
j1:
cmp s,64
je j2
inc s
mov eax,yg
push eax
and eax,7
mov Wx,eax
pop eax
shr eax,3
mov Nx,eax
mov ii,0
j3:
cmp ii,6 ;循环6次
je j4
invoke DeleteObject,Penhandle ;删除原来的画笔
mov eax,offset Xsb
.if ii <=2
mov ecx,Wx
.else
mov ecx,Nx
.endif
invoke CreatePen,PS_SOLID,2,[eax+ecx*4]
mov Penhandle,eax
invoke SelectObject,hMemDC,eax
mov eax,yg
mov ecx,ii
shr eax,cl
and eax,1
mov XX,eax;爻
mov iii,0
j5:
cmp iii,4
je j6
; X [iii] = 圆心X + (半径 + G × (6 - ii)) × 求正弦 ((i + IXI - iii) × 弧度)
; Y [iii] = 圆心Y + (半径 + G × (6 - ii)) × 求余弦 ((i + IXI - iii) × 弧度)
push 0 ;计次
j7:
cmp BYTE ptr[esp],2
je j8
mov eax,i
add eax,IXI
sub eax,iii
dec eax
push eax ;(i + IXI - iii)
finit
fild WORD ptr [esp]
pop eax
fld hd
fmul st,st(1)
.if BYTE ptr [esp]==0
fsin ;求正弦 ((i + IXI - iii) × 弧度
.else
fcos;求余弦 ((i + IXI - iii) × 弧度)
.endif
mov eax,6
sub eax,ii
mov ecx,g ;高
imul eax,ecx;G × (6 - ii)
add eax,r ;半径 + G × (6 - ii)
push eax
fild WORD ptr [esp]
pop eax
fmul st,st(1) ;(半径 + G × (6 - ii)) × 求正弦 ((i + IXI - iii) × 弧度)
mov eax,iii
.if BYTE ptr [esp]==0
FISTP DWORD ptr x[eax*4]
mov ecx,yx
add x[eax*4],ecx ; +圆心X
.else
FISTP DWORD ptr y[eax*4]
mov ecx,yy
add y[eax*4],ecx ; +圆心Y
.endif
inc BYTE ptr [esp] ;两次,第一次计算X [iii],第二次计算y [iii]
jmp j7
j8:
pop eax
inc iii
jmp j5
j6:
mov eax,XX
.if eax==1; ' 画阳爻
invoke MoveToEx,hMemDC,x[3*4],y[3*4],NULL
invoke LineTo,hMemDC,x[0],y[0]
.else;画阴爻
invoke MoveToEx,hMemDC,x[3*4],y[3*4],NULL
invoke LineTo,hMemDC,x[2*4],y[2*4]
invoke MoveToEx,hMemDC,x[4],y[4],NULL
invoke LineTo,hMemDC,x[0],y[0]
.endif
inc ii ;累加
jmp j3
j4:
add i,4
.if yg==31
mov yg,63
.elseif yg <31
inc yg
.else
dec yg
.endif
jmp j1
j2:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
invoke BitBlt,hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY
invoke DeleteObject,bitmap
invoke DeleteDC,hMemDC
invoke ReleaseDC,Hwnd,hdc
invoke DeleteObject,Penhandle
invoke DeleteObject,Brush
ret
WenW64Gua endp
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法