cmp的问题

APIer 2001-04-18 07:36:00
小弟刚刚学习汇编,在vc6中内钱汇编写了一个图片alpha 混合,但是我需要用到cmp指令比较是否透明色,由于寄存器我用光了,cmp一个内存单元,我跟踪发现,每次这个内存单元的值都在变化,我用push和pop保存这个值,发现loop的时候居然跳到了另外的一段汇编代码中间了,谁能save me!
...全文
87 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
APIer 2001-04-30
  • 打赏
  • 举报
回复
duz(肚子) :非常谢谢了,你说得很对:)
duz 2001-04-30
  • 打赏
  • 举报
回复
问题在于你修改了bp的值,对于c编译器来说,由于所有的局部变量都是在堆栈上,所以访问时都会用[ebp+偏移量]的形式访问,如果你改变了ebp的值,c编译器并不知道这些,它还是用[ebp+偏移量]的形式访问变量tt,实际访问到的就不知道是什么了。
你如果能够不去修改ebp(当然包括bp),那么就可以使用代码中的局部变量
或者可以试者将
mov bp,[ebx];
cmp bp,tt;//就是这个cmp我跟踪的时候发现tt在变化,当我push 和 pop tt 的时候,下面的loop好像跳到了另外的一个_asm代码段里面了
改为
push tt
mov bp,[ebx]
cmp bp,[esp]
pop ebp //千万不要用pop tt哦,想一想为什么
mov bp,[ebx]
Areslee 2001-04-20
  • 打赏
  • 举报
回复
把源程序代码发来看看!
APIer 2001-04-20
  • 打赏
  • 举报
回复
int TT 123456;
__asm
{
//push edi;
//push ebp;
//push esi;
//pushf;
pusha;

mov eax,wdDest;
mov ebx,wdRes;
mov cx,nUseW;
NEXTPOINT1:
mov dx,[eax];
mov bp,[ebx];
cmp bp,tt;//就是这个cmp我跟踪的时候发现tt在变化,当我push 和 pop tt 的时候,下面的loop好像跳到了另外的一个_asm代码段里面了
je NOTEQ;
shr dx,10;//红色分量
and dx,0x1f;
shr bp,10;
and bp,0x1f;
add dx,bp;
shr dx,1;
mov di,dx;

mov dx,[eax];
mov bp,[ebx];
shr dx,5;
and dx,0x1f;
shr bp,5;
and bp,0x1f;
add dx,bp;
shr dx,1;
mov si,dx;

mov dx,[eax];
mov bp,[ebx];
shr dx,5;
and dx,0x1f;
shr bp,5;
and bp,0x1f;
and dx,bp;
shr dx,1;

shl di,10;
shl si,5;
or dx,di;
or dx,si;

mov [eax],dx;
NOTEQ:
add eax,2;
add ebx,2;

loop NEXTPOINT1;

popa;
//popf;
//pop esi;
//pop ebp;
//pop edi;
}

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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