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ÕâÀàµÄ)
}
...全文
236 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]的指令来避免锁的使用
2012-06-11 09:11 0 1.txt 2012-06-11 08:36 377,398 300个加密解密代码.rar 2012-06-11 08:40 7,526,054 51CTO下载-c++游戏源代码(扫雷,俄罗斯方块等).rar 2012-06-11 08:36 34,702 AES加密解密程序源代码.rar 2012-06-11 08:36 279,706 ARM JTAG调试原理完整源代码包.rar 2012-06-11 08:46 1,691,629 Asm汇编编译器(VC++6.0源代码).rar 2012-06-11 08:57 88,576 C++ 开发中内存分配及堆和栈的区别.doc 2012-06-11 08:52 190,100 C++中二数组与指针关系的剖析.pdf 2012-06-11 08:48 171,862 C++函数后加const的意义.pdf 2012-06-11 08:57 9,174 C++注册表操作大全.txt 2012-06-11 08:37 113,664 CCheckListBox和CListBox.doc 2012-06-11 08:45 4,764,563 C库函数源代码.rar 2012-06-11 08:51 225,293 C指针详解(经典,非常详细).pdf 2012-06-11 08:49 45,056 DES算法用C++实现的源代码.doc 2012-06-11 08:27 6,261,754 KTV.zip 2012-06-11 08:58 606,972 listView 美化.rar 2012-06-11 08:56 5,784,486 MFC实现QQ在线状态检测.rar 2012-06-11 08:49 3,537,063 VC 数据库编程三部教学.rar 2012-06-11 08:52 349 VC++ CImage使用简单实例.txt 2012-06-11 08:43 994,304 VC++_串口上位机编程实例.doc 2012-06-11 08:39 125,202 vc++图像图形处理-腐蚀与膨胀源码.rar 2012-06-11 08:57 48,680 VC++菜单编码.rar 2012-06-11 09:06 221,889,221 vc源代码合集.rar 2012-06-11 08:50 2,645,640 VC编程100例.rar 2012-06-11 08:45 1,244,190 Visual C++ 2008 入门经典源代码.rar 2012-06-11 08:43 34,403,414 visual c++ 图像处理代码.zip 2012-06-11 08:54 40,000,000 Visual C++ 游戏编程基础.part01.rar 2012-06-11 08:52 40,000,000 Visual C++ 游戏编程基础.part02.rar 2012-06-11 08:51 0 Visual C++ 游戏编程基础.part03.rar 2012-06-11 08:50 275,438 visual c++ 高级编程技术--开发实例剖析源码.rar 2012-06-11 08:44 52,307,137 Windows驱动开发技术详解(pdf书.源代码).rar 2012-06-11 08:41 583,491 [C++]VC++动态链接库(dll)编程深入浅出.pdf 2012-06-11 08:47 88,186 《网络数据包捕获与应用的VC 6.0编程》.docx 2012-06-11 08:53 4,080 万年历查询系统源代码.c 2012-06-11 08:58 6,059,068 人脸识别.rar 2012-06-11 08:39 907 均值滤波源码.rar 2012-06-11 08:45 54,272 学会用 VC++ 动态链接库编写 DLL 木马.doc 2012-06-11 08:40 12,740 开关机操作C++.zip 2012-06-11 08:58 16,574,256 指纹识别程序源码.rar 2012-06-11 08:50 7,652 数据结构单链表的新建,查找,删除,插入,输出,排序,逆置.txt 2012-06-11 08:40 28,483 显示系统进程C++.rar 2012-06-11 08:46 3,628,865 神经网络PPT教程汇总 BP神经网络详解与实例 BP算法 神经网络 机器学习 马尔科夫链.rar 2012-06-11 08:36 889,798 精通Windows Sockets网络开发源码.rar 2012-06-11 08:40 16,068 获取网卡地址C++.zip 2012-06-11 08:43 2,247,310 贝叶斯网络学习方法和算法研究.pdf 2012-06-11 08:40 47,762 轻轻松松抓图标C++.zip 2012-06-11 08:40 0 鼠标测试C++.zip

65,206

社区成员

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

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