那位大侠帮我把这段c++汇编翻译成delphi(100分)

  • 主题发起人 hitman007260
  • 开始时间
这个就不明白了,先把TBitmap转成RGB的数组试试,具体怎么做,我就不知道了。最原始的方法是一行行的扫描...
一般只要RGB数据就能处理了,而Tbitmap类前面还有图片大小,调色板等数据(巨白痴的设计,BMP格式还用调色板),所以直接 @Bitmap 是不行的。
再等等别人的回答吧,我图像方面很少研究了...
 
那数组如何传递到函数里面哪??
 
数组名就是指针,所以随便一个指针类型都能输入,当然空间要足够
比如你定义 var bmp:array[0..99] of Cardinal;
//Cardinal,4字节 分别是RGB和透明度
然后初始化:(假设是这样)
bmp[0]:=$FF000000;
//红色
bmp[1]:=$11223300;
// $112233
....
然后输入用 @bmp 取首地址,给^Variant,传进去的就是 FF00000011223300...了
 
给^Variant可以
Variant好像不行
另外 运行时
@@else
: //原来的#else
改成行标
mov eax,ebx
sub eax,x_delta
shr eax,12
movd mm0,dword ptr [esi + eax * 4 + 0]
中 movd mm0,dword ptr [esi + eax * 4 + 0]出错 access violation 错误
你到这个帖子来
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3473288
解决后
一起解贴 多给你几分
 
还有 程序里的emms没有了
这是给mmx指令擦pp 得 没有的话一直占用寄存器 肯定会出错误把?
 
Variant就直接用 bmp,不用加取址符@。Variant可是通吃的类型,就是速度慢点...
movd mm0,dword ptr [esi + eax * 4 + 0]
这句可能Delphi不支持,dword ptr里的dword相当于 LongInt。不过Delphi里LongInt和Integer一个是意思,所以存储空间不符,不能Mov吧(猜的,纯属瞎扯,如有雷同,实数巧合)
大概要改成 mov mm0低位,Word ptr [esi + eax * 4 + 0] //这样可能要读2次
mov mm0高位,Word ptr [esi + eax * 4 + 2] //也就是说 要将mm0的低位和高位分别取出
但你的 mm0是什么呢?是个变量吧,而且应该是个 UNSIGNED LONG 形的!
把mm0的变量声明贴出来看看,不然还不能确定这句 movd 怎么改写。

关于那些没有的指令,直接用 DB 定义得了,比如查到 sete bl 的十六进制代码为0F943C,那么程序里调用就直接是:
asm
...
DB 0F
DB 94
DB 3C
...
end;
Delphi的ASM很灵活的!
 
接受答案了.
 
顶部