vc中嵌入汇编,怎样与其他部分的变量交互?

sunlit 2000-08-05 05:27:00
vc中嵌入汇编,怎样与其他部分的变量交互?请高手举例说明,先谢过
...全文
89 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xubin_sh 2000-08-08
  • 打赏
  • 举报
回复
可以用成员变量
剪自MSDN:
struct first_type
{
char *weasel;
int same_name;
};

struct second_type
{
int wonton;
long same_name;
};

If you declare variables with the types

struct first_type hal;
struct second_type oat;

all references to the member same_name must use the variable name because same_name is not unique. But the member weasel has a unique name, so you can refer to it using only its member name:

__asm
{
mov ebx, OFFSET hal
mov ecx, [ebx]hal.same_name ; Must use 'hal'
mov esi, [ebx].weasel ; Can omit 'hal'
}

FBStudio 2000-08-05
  • 打赏
  • 举报
回复
可以直接使用变量,但是C++类的成员变量好象不行,不过可以定义一个局部变量取出成员变量的值,用完后再把值赋给成员变量。
下面是我开发一个图表系统时写的画直线函数的例子,有问题可以给我来信。

BOOL CGraphDC::_LineTo(int x,int y)
{
if (x==m_pt.x&&y==m_pt.y) return TRUE;
int ox(m_pt.x),oy(m_pt.y);
int x1(ox),y1(oy),x2(x),y2(y);
LPBYTE pPic=(LPBYTE)m_pPicBits,pBmp=(LPBYTE)m_pBmpBits;
LPBYTE pBuf=(LPBYTE)m_pBufBits,pTxt=(LPBYTE)m_pTxtBits;
int penWidth=int(m_pen.Width);

WORD penStyle=m_penStyle,ps0=m_penStyle;
BYTE coloridx=m_byPenColor,mask=m_byBackground;
UINT nBytesPerLine=m_nBytesPerLine;
int tx,ty,inc1,inc2;
int xmin=0,ymin=0,xmax=m_pView->right-1,ymax=m_pView->bottom-1;
int nOffset,nMaxOffset;

BYTE bDraw=0;

__asm
{ PUSHAD
//裁剪开始 (编码顺序:上下左右)
MOV BX,0000h
MOV EAX,x1
CMP EAX,xmin
JNL code_x1
OR BH,02h
JMP code_y1
code_x1:
CMP EAX,xmax
JNG code_y1
OR BH,01h
code_y1:
MOV EAX,y1
CMP EAX,ymin
JNL code_y11
OR BH,08h
JMP code_2
code_y11:
CMP EAX,ymax
JNG code_2
OR BH,04h
code_2:
MOV EAX,x2
CMP EAX,xmin
JNL code_x2
OR BL,02h
JMP code_y2
code_x2:
CMP EAX,xmax
JNG code_y2
OR BL,01h
code_y2:
MOV EAX,y2
CMP EAX,ymin
JNL code_y22
OR BL,08h
JMP cut
code_y22:
CMP EAX,ymax
JNG cut
OR BL,04h
cut:
TEST BX,0ffffh
JZ draw
TEST BH,BL
JZ cut_sel
JMP over
cut_sel:
MOV CL,BH
TEST CL,0ffh
JNZ bh_p
MOV CL,BL
bh_p:
MOV EAX,x2
SUB EAX,x1
MOV tx,EAX
MOV EAX,y2
SUB EAX,y1
MOV ty,EAX

TEST CL,02h
JZ right
MOV EAX,xmin
SUB EAX,x1
IMUL ty
IDIV tx
ADD EAX,y1
MOV EDX,EAX
MOV EAX,xmin
JMP decd
right:
TEST CL,01h
JZ top
MOV EAX,xmax
SUB EAX,x1
IMUL ty
IDIV tx
ADD EAX,y1
MOV EDX,EAX
MOV EAX,xmax
JMP decd
top:
TEST CL,08h
JZ bottom
MOV EAX,ymin
SUB EAX,y1
IMUL tx
IDIV ty
ADD EAX,x1
MOV EDX,ymin
JMP decd
bottom:
MOV EAX,ymax
SUB EAX,y1
IMUL tx
IDIV ty
ADD EAX,x1
MOV EDX,ymax
decd:
CMP CL,BH
JNZ cd_2
MOV x1,EAX
MOV y1,EDX
XOR BH,BH
CMP EAX,xmin
JNL cd_x1
OR BH,02h
JMP cd_y1
cd_x1:
CMP EAX,xmax
JNG cd_y1
OR BH,01h
cd_y1:
CMP EDX,ymin
JNL cd_y11
OR BH,08h
JMP code_2
cd_y11:
CMP EDX,ymax
JNG cut
OR BH,04h
JMP cut
cd_2:
MOV x2,EAX
MOV y2,EDX
XOR BL,BL
CMP EAX,xmin
JNL cd_x2
OR BL,02h
JMP cd_y2
cd_x2:
CMP EAX,xmax
JNG cd_y2
OR BL,01h
cd_y2:
CMP EDX,ymin
JNL cd_y22
OR BL,08h
JMP cut
cd_y22:
CMP EDX,ymax
JNG cut
OR BL,04h
JMP cut
//裁剪结束,开始扫描转换
draw:
MOV ESI,1
MOV EDI,nBytesPerLine
MOV EAX,ymax
SUB EAX,y1
MUL EDI
ADD EAX,x1
MOV nOffset,EAX
MOV EAX,ymax
MUL EDI
ADD EAX,xmax
MOV nMaxOffset,EAX
MOV EAX,x2
SUB EAX,x1
JGE x2_ge_x1
NEG ESI
NEG EAX
x2_ge_x1:
MOV tx,EAX
MOV EAX,y1
SUB EAX,y2
JGE y1_ge_y2
NEG EDI
NEG EAX
y1_ge_y2:
MOV ty,EAX
CMP EAX,tx
JA ty_a_tx
//tx_ae_ty:
MOV EAX,x
SUB EAX,ox
JGE x_ge_ox
NEG EAX
x_ge_ox:
MOV EDX,0
MOV ECX,16
DIV ECX
CMP EDX,0
JZ ps_x
MOV ECX,EDX
ROL ps0,CL
ps_x:
MOV EAX,x1
SUB EAX,ox
JGE x1_ge_ox
NEG EAX
x1_ge_ox:
MOV EDX,0
MOV ECX,16
DIV ECX
CMP EDX,0
JZ draw_x
MOV ECX,EDX
ROL penStyle,CL
draw_x:
MOV bDraw,1
MOV ECX,tx
MOV EAX,ty
SHL EAX,1
MOV inc1,EAX //inc1=2*ty
SUB EAX,ECX
MOV EDX,EAX //d=2*ty-tx
MOV EAX,ECX
SHL EAX,1
MOV inc2,EAX //inc2=2*tx

MOV EAX,x
CMP EAX,x2
JZ inc_cx
INC ECX
inc_cx:
CMP ECX,0
JNZ scan_x
// MOV bDraw,0
// JMP over
INC ECX
scan_x:
ROL penStyle,1
JNC next_x
PUSH ECX
PUSH ESI
MOV ECX,penWidth
MOV EAX,ECX
SHR EAX,1
MOV EBX,EDX
MUL EDI
MOV EDX,EBX
MOV ESI,nOffset
ADD ESI,EAX
MOV AL,coloridx
pixel_x:
CMP ESI,0
JL skip_x
CMP ESI,nMaxOffset
JG skip_x
MOV EBX,pTxt
CMP BYTE PTR [EBX][ESI],0
JNZ skip_x
MOV BYTE PTR [EBX][ESI],1
MOV EBX,pPic
MOV AH,BYTE PTR [EBX][ESI]
XOR AH,AL
MOV BYTE PTR [EBX][ESI],AH
CMP AH,mask
JNZ pic_x
MOV EBX,pBmp
MOV AH,BYTE PTR [EBX][ESI]
pic_x:
MOV EBX,pBuf
MOV BYTE PTR [EBX][ESI],AH
skip_x:
SUB ESI,EDI
LOOP pixel_x
POP ESI
POP ECX
next_x:
CMP EDX,00h
JS d_l_0_x
SUB EDX,inc2
ADD nOffset,EDI
d_l_0_x:
ADD EDX,inc1
ADD nOffset,ESI
DEC ECX
JNZ scan_x
JMP ok
ty_a_tx: //(ty>0,ty>tx,tx>=0)
MOV EAX,y
SUB EAX,oy
JGE y_ge_oy
NEG EAX
y_ge_oy:
MOV EDX,0
MOV ECX,16
DIV ECX
CMP EDX,0
JZ ps_y
MOV ECX,EDX
ROL ps0,CL
ps_y:
MOV EAX,y1
SUB EAX,oy
JGE y1_ge_oy
NEG EAX
y1_ge_oy:
MOV EDX,0
MOV ECX,16
DIV ECX
CMP EDX,0
JZ draw_y
MOV ECX,EDX
ROL penStyle,CL
draw_y:
MOV bDraw,1
MOV ECX,ty
MOV EAX,tx
SHL EAX,1
MOV inc1,EAX //inc1=2*tx
SUB EAX,ECX
MOV EDX,EAX //d=2*tx-ty
MOV EAX,ECX
SHL EAX,1
MOV inc2,EAX //inc2=2*ty

MOV EAX,y
CMP EAX,y2
JZ scan_y
INC ECX
scan_y:
ROL penStyle,1
JNC next_y
PUSH ECX
PUSH EDI
MOV ECX,penWidth
MOV EAX,ECX
SHR EAX,1
MOV EBX,EDX
MUL ESI
MOV EDX,EBX
MOV EDI,nOffset
ADD EDI,EAX
MOV AL,coloridx
pixel_y:
CMP EDI,0
JL skip_y
CMP EDI,nMaxOffset
JG skip_y
MOV EBX,pTxt
CMP BYTE PTR [EBX][EDI],0
JNZ skip_y
MOV BYTE PTR [EBX][EDI],1
MOV EBX,pPic
MOV AH,BYTE PTR [EBX][EDI]
XOR AH,AL
MOV BYTE PTR [EBX][EDI],AH
CMP AH,mask
JNZ pic_y
MOV EBX,pBmp
MOV AH,BYTE PTR [EBX][EDI]
pic_y:
MOV EBX,pBuf
MOV BYTE PTR [EBX][EDI],AH
skip_y:
SUB EDI,ESI
LOOP pixel_y
POP EDI
POP ECX
next_y:
CMP EDX,00h
JS d_l_0_y
SUB EDX,inc2
ADD nOffset,ESI
d_l_0_y:
ADD EDX,inc1
ADD nOffset,EDI
// LOOP scan_y
DEC ECX
JNZ scan_y

ok:
MOV ECX,penWidth
SHR ECX,1
MOV EAX,x1
CMP EAX,x2
JNG ok_1
XCHG EAX,x2
MOV x1,EAX
ok_1:
MOV EAX,y1
CMP EAX,y2
JNG ok_2
XCHG EAX,y2
MOV y1,EAX
ok_2:
// CMP ECX,0
// JZ over
INC ECX
MOV EBX,xmax
// INC EBX
MOV EDX,ymax
// INC EDX
SUB x1,ECX
JNS ok_3
MOV DWORD PTR x1,0
ok_3:
ADD x2,ECX
CMP EBX,x2
JNS ok_4
MOV x2,EBX
ok_4:
SUB y1,ECX
JNS ok_5
MOV DWORD PTR y1,0
ok_5:
ADD y2,ECX
CMP EDX,y2
JNS over
MOV y2,EDX
over:
POPAD
}
m_penStyle=ps0;
m_pt.x=x;
m_pt.y=y;
if (!bDraw) return TRUE; //整条线段都没有画
if (m_pPitch->left<0&&m_pPitch->right<0) m_pPitch->SetRect(x1,y1,x2,y2);
else
{
if (x1<m_pPitch->left) m_pPitch->left=x1;
if (y1<m_pPitch->top) m_pPitch->top=y1;
if (x2>m_pPitch->right) m_pPitch->right=x2;
if (y2>m_pPitch->bottom) m_pPitch->bottom=y2;
}
if (m_pPaint->IsRectEmpty()) m_pPaint->SetRect(x1,y1,x2+1,y2+1);
else
{
if (x1<m_pPaint->left) m_pPaint->left=x1;
if (y1<m_pPaint->top) m_pPaint->top=y1;
if (x2>=m_pPaint->right) m_pPaint->right=x2+1;
if (y2>=m_pPaint->bottom) m_pPaint->bottom=y2+1;
}
return TRUE;
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧