如何将如下汇编代码转换为C或C++函数?

kingboy1982 2009-02-08 01:11:10
以下代码是嵌入在C++程序中的一段汇编代码,在PC下能通过编译,正常运行,但在EVC环境下无法通过编译,怀疑是不是EVC下有些汇编指令不支持,请问如何将它转换为一个C或C++函数,望高手不吝赐教,不胜感谢!!





DWORD iLength;
char *pch1;
char *pch2;
DWORD dwBit;
char *pch3;

__asm
{
MOV ECX,iLength
SHR ECX,2
MOV EDI,pch1
MOV ESI,pch2
ADD ESI,dwBit
MOV EDX,pch3
ADD EDX,dwBit
SubtractRegion:
LODSD
SUB EAX,[EDX]
ADD EDX,4
STOSD
DEC ECX
JNZ SubtractRegion
}
...全文
749 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingboy1982 2009-02-11
  • 打赏
  • 举报
回复
问题虽然已经解决,但是还是存在一个非常严重的问题:
就是我那个代码是要在ARM板子上运行的,在PC上运行感觉不到,但在板子上运行的话速度慢的让人无法接受,最好是直接能够在ARM上运行汇编指令,但编译不过,我怀疑是不是ARM不支持LODSD和STOSD这两条指令,在ARM相关的参考书上也没有找到这两条指令。下面是我在别的地方看到的解释,希望大家能够一起探讨下

LODS - Load String (Byte, Word or Double)
Usage: LODS src
LODSB
LODSW
LODSD (386+)
Modifies flags: None
Transfers string element addressed by DS:SI (even if an operand is
supplied) to the accumulator. SI is incremented based on the size
of the operand or based on the instruction used. If the Direction
Flag is set SI is decremented, if the Direction Flag is clear SI

is incremented. Use with REP prefixes.
Clocks Size
Operands 808x 286 386 486 Bytes
src 12/16 5 5 5 1

AC LODS m8 Load byte at address DS:(E)SI into AL
AD LODS m16 Load word at address DS:(E)SI into AX
AD LODS m32 Load doubleword at address DS:(E)SI into EAX

AC LODSB Load byte at address DS:(E)SI into AL
AD LODSW Load word at address DS:(E)SI into AX
AD LODSD Load doubleword at address DS:(E)SI into EAX
kingboy1982 2009-02-09
  • 打赏
  • 举报
回复
谢谢高手指点,问题已解决。
土豆 2009-02-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
C/C++ codeDWORD length = iLength/4;
PDWORD p1 = (PDWORD)pch1;
PDWORD p2 = (PDWORD)&pch2[dwBit];
PDWORD p3 = (PDWORD)&pch3[dwBit];
for (int i=0; i<length; i++)
{
p1[i] = p2[i] - p3[i];
}
[/Quote]

Good!
xtdumpling 2009-02-09
  • 打赏
  • 举报
回复
mark
捕鲸叉 2009-02-09
  • 打赏
  • 举报
回复
LODSD
STOSD
是什么意思啊?
sunbao 2009-02-08
  • 打赏
  • 举报
回复
evc是嵌入式的不是x86体系结构的
cnzdgs 2009-02-08
  • 打赏
  • 举报
回复
DWORD length = iLength/4;
PDWORD p1 = (PDWORD)pch1;
PDWORD p2 = (PDWORD)&pch2[dwBit];
PDWORD p3 = (PDWORD)&pch3[dwBit];
for (int i=0; i<length; i++)
{
p1[i] = p2[i] - p3[i];
}

21,459

社区成员

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

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