c++插入汇编代码访问2维数组

killgxlin 2008-02-16 12:41:10
c++插入汇编代码访问2维数组

int array[10][20];
int main(){
for(int i=0; i<10; i++)
for(int j=0; j<20; j++)
array[i][j]=i*j;
for(int i=0; i<10; i++)
for(int j=0; j<20; j++)
array[i][j]++; //ÏÔʾ²åÈë»ã±àÖ¸ÁîÀ´´úÌæÕâÌõÓï¾ä
//(ÓÃinc array[i][j]»òadd array[i][j],1ÕâÀàµÄ)
}
...全文
221 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐巧 2008-02-16
  • 打赏
  • 举报
回复
 _asm{
mov ecx,dword ptr [ebp-4]
imul ecx,ecx,50h
mov edx,dword ptr [j]
mov eax,dword ptr [ecx+edx*4+4225D8h]
add eax,1
mov ecx,dword ptr [ebp-4]
imul ecx,ecx,50h
mov edx,dword ptr [j]
mov dword ptr [ecx+edx*4+4225D8h],eax

}
这段代码的作用相当于array[i][j]++;
唐巧 2008-02-16
  • 打赏
  • 举报
回复
这句是获得二维数组的下标:eax,dword ptr [ecx+edx*4+4225D8h]
其中4225D8h代表array的地址,ecx代表一维的下标,edx代表二维的下标.

imul ecx,ecx,50h
这句是获得一维下标的偏移地址。因为你的二维一行有20个元素,每个元素占四个字节,一共80个字节,转成16进制就是0x50,即50h
唐巧 2008-02-16
  • 打赏
  • 举报
回复
给你一个例子:

#include <stdio.h>

int array[10][20];
int main(){
for(int i=0; i<10; i++)
for(int j=0; j<20; j++)
_asm{
mov ecx,dword ptr [ebp-4]
imul ecx,ecx,50h
mov edx,dword ptr [j]
mov eax,dword ptr [ecx+edx*4+4225D8h]
add eax,1
mov ecx,dword ptr [ebp-4]
imul ecx,ecx,50h
mov edx,dword ptr [j]
mov dword ptr [ecx+edx*4+4225D8h],eax

}
for( i=0; i<10; i++)
for(int j=0; j<20; j++)
array[i][j]++; //??ê?2?è???±à??á?à′′úì??aì?ó???
//(ó?inc array[i][j]?òadd array[i][j],1?aààμ?)
return 0;
}


killgxlin 2008-02-16
  • 打赏
  • 举报
回复
c++插入汇编代码访问2维数组
先谢谢了

int array[10][20];
int main(){
for(int i=0; i<10; i++)
for(int j=0; j<20; j++)
array[i][j]=i*j;
for(int i=0; i<10; i++)
for(int j=0; j<20; j++)
array[i][j]++; //插入汇编指令替代这条语句
//要求加法部分必须是单条汇编语句
//(inc array[i][j] 或add array[i][j],这一类的)
//计算偏移量就没有要求了
}
cnzdgs 2008-02-16
  • 打赏
  • 举报
回复
inc指令同样是要把内存中的数取出来,加1后再写回内存。这一操作对单处理器是原子操作,但如果是多处理器,在数据尚未写回内存时,内存中的数据可能被另外的处理器访问,这就可能会产生问题。所以必须用锁定操作来完成。锁定操作对效率的影响通常是可以忽略不计的。
除此之外,还可以使用同步对象来实现线程同步。但通常能用锁定操作来完成都不用同步对象,因为线程同步所需要的时间远远大于锁定操作的时间。
killgxlin 2008-02-16
  • 打赏
  • 举报
回复
可是InterlockedIncrement用了锁,效率会降低
我想inc array[i][j]在机器级别可以当作是一个原子操作
intel c++编译器把这句翻译成
add DWORD PTR ?array@@3PAY0BE@HA[ecx], 1 ;8.4 ecx是下标

唐巧 2008-02-16
  • 打赏
  • 举报
回复
嗯,好象这不是汇编应该解决的问题...
cnzdgs 2008-02-16
  • 打赏
  • 举报
回复
LZ的这个问题不该嵌入汇编来解决。因为inc指令也是不安全的。
参考InterlockedXXX函数。
++用InterlockedIncrement函数。
killgxlin 2008-02-16
  • 打赏
  • 举报
回复
对不起啊,是我没有说明白,我的意思是嵌入直接访问内存而不需要累加器的汇编指令
我有一段代码是多线程的,我想用类似inc array[i][j]的指令来避免锁的使用

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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