交换a,b值的疑问

万寿珠宝 2024-05-26 22:35:05
最佳回答
首先,不清楚引用最终怎么实现的,另外不清楚汇编与c语言混用时怎么返回数值,所以这个问题很难呀。试验一:#include <iostream> using namespace std; void myswap(int& a,int& b) { cout<<(long)(&a)<<","<<(long)(&b)<<endl;_asm { mov eax,a mov ebx,b xor ebx,eax xor eax,ebx xor ebx,eax mov a,eax mov b,ebx } cout<<(long)(&a)<<","<<(long)(&b)<<endl;} int main() { int a=5,b=10;cout<<(long)(&a)<<","<<(long)(&b)<<endl; myswap(a,b); cout<<(long)(&a)<<","<<(long)(&b)<<endl;printf("a=%d,b=%d\n" ,a,b); } 看一下这个运行结果估计应该有所启发吧!在程序返回时,地址又还原了!我推测引用实现时,只是把各自指向的值交换,而地址不变,程序中的asm恰恰把它们的地址交换了,而返回时,地址又被还原所以造成没有交换数值。试验二:#include <iostream> using namespace std; void myswap(int* a,int* b) { // cout<<(long)(&a)<<","<<(long)(&b)<<endl; cout<<(long)(a)<<","<<(long)(b)<<endl;_asm { mov eax,a mov ebx,b xor ebx,eax xor eax,ebx xor ebx,eax mov a,eax mov b,ebx } //cout<<(long)(&a)<<","<<(long)(&b)<<endl;cout<<(long)(a)<<","<<(long)(b)<<endl;} int main() { int a=5,b=10;cout<<(long)(&a)<<","<<(long)(&b)<<endl; myswap(&a,&b); cout<<(long)(&a)<<","<<(long)(&b)<<endl;printf("a=%d,b=%d\n" ,a,b); } 试验结果与一相同,所以我认为是asm与c混合的机制造成的,为了防止汇编出错,所有地址要还原。希望能对你有点启发吧!你也运行一下我改的例子,我也关注此问题中。。。下面是反汇编的代码:--- d:\my documents\code\rub**h\asm.cpp ------------------------------------------------------------------------------------------------------------------1: #include <iostream>2:3: using namespace std;4:5: void myswap(int&a,int&b)6: {00401580 push ebp00401581 mov ebp,esp00401583 sub esp,40h00401586 push ebx00401587 push esi00401588 push edi00401589 lea edi,[ebp-40h]0040158c mov ecx,10h00401591 mov eax,0cccccccch00401596 rep stos dword ptr [edi]7: cout<<(long)(&a)<<","<<(long)(&b)<<endl;00401598 push offset @ilt+195(std::endl) (004010c8)0040159d mov eax,dword ptr [ebp+0ch]004015a0 push eax004015a1 push offset string "," (0046c01c)004015a6 mov ecx,dword ptr [ebp+8]004015a9 push ecx004015aa mov ecx,offset std::cout (004777f0)004015af call @ilt+245(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010fa)004015b4 push eax004015b5 call @ilt+640(std::operator<<) (00401285)004015ba add esp,8004015bd mov ecx,eax004015bf call @ilt+245(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010fa)004015c4 mov ecx,eax004015c6 call @ilt+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)8: // cout<<(long)(a)<<","<<(long)(b)<<endl;9:10: _asm {11: mov eax,a004015cb mov eax,dword ptr [ebp+8]12: mov ebx,b004015ce mov ebx,dword ptr [ebp+0ch]13: xor ebx,eax004015d1 xor ebx,eax14: xor eax,ebx004015d3 xor eax,ebx15: xor ebx,eax004015d5 xor ebx,eax16: mov a,eax004015d7 mov dword ptr [ebp+8],eax17: mov b,ebx004015da mov dword ptr [ebp+0ch],ebx18: }19: /* int c;20: c=a;21: a=b;22: b=c;*/23: cout<<(long)(&a)<<","<<(long)(&b)<<endl;004015dd push offset @ilt+195(std::endl) (004010c8)004015e2 mov edx,dword ptr [ebp+0ch]004015e5 push edx004015e6 push offset string "," (0046c01c)004015eb mov eax,dword ptr [ebp+8]004015ee push eax004015ef mov ecx,offset std::cout (004777f0)004015f4 call @ilt+245(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010fa)004015f9 push eax004015fa call @ilt+640(std::operator<<) (00401285)004015ff add esp,800401602 mov ecx,eax00401604 call @ilt+245(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010fa)00401609 mov ecx,eax0040160b call @ilt+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)24: //cout<<(long)(a)<<","<<(long)(b)<<endl;25: }00401610 pop edi00401611 pop esi00401612 pop ebx00401613 add esp,40h00401616 cmp ebp,esp00401618 call __chkesp (00420a50)0040161d mov esp,ebp0040161f pop ebp00401620 ret--- d:\my documents\code\rub**h\asm.cpp ------------------------------------------------------------------------------------------------------------------26:27: int main()28: {00401650 push ebp00401651 mov ebp,esp00401653 sub esp,48h00401656 push ebx00401657 push esi00401658 push edi00401659 lea edi,[ebp-48h]0040165c mov ecx,12h00401661 mov eax,0cccccccch00401666 rep stos dword ptr [edi]29: int a=5,b=10;00401668 mov dword ptr [ebp-4],50040166f mov dword ptr [ebp-8],0ah30:31: cout<<(long)(&a)<<","<<(long)(&b)<<endl;00401676 push offset @ilt+195(std::endl) (004010c8)0040167b lea eax,[ebp-8]0040167e push eax0040167f push offset string "," (0046c01c)00401684 lea ecx,[ebp-4]00401687 push ecx00401688 mov ecx,offset std::cout (004777f0)0040168d call @ilt+245(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010fa)00401692 push eax00401693 call @ilt+640(std::operator<<) (00401285)00401698 add esp,80040169b mov ecx,eax0040169d call @ilt+245(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010fa)004016a2 mov ecx,eax004016a4 call @ilt+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)32: myswap(a,b);004016a9 lea edx,[ebp-8]004016ac push edx ;b004016ad lea eax,[ebp-4]004016b0 push eax ;a004016b1 call @ilt+660(myswap) (00401299)004016b6 add esp,833: cout<<(long)(&a)<<","<<(long)(&b)<<endl;004016b9 push offset @ilt+195(std::endl) (004010c8)004016be lea ecx,[ebp-8]004016c1 push ecx004016c2 push offset string "," (0046c01c)004016c7 lea edx,[ebp-4]004016ca push edx004016cb mov ecx,offset std::cout (004777f0)004016d0 call @ilt+245(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010fa)004016d5 push eax004016d6 call @ilt+640(std::operator<<) (00401285)004016db add esp,8004016de mov ecx,eax004016e0 call @ilt+245(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010fa)004016e5 mov ecx,eax004016e7 call @ilt+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)34: printf("a=%d,b=%d\n" ,a,b);004016ec mov eax,dword ptr [ebp-8]004016ef push eax004016f0 mov ecx,dword ptr [ebp-4]004016f3 push ecx004016f4 push offset string "a=%d,b=%d\n" (0046c020)004016f9 call printf (00420a90)004016fe add esp,0ch35: }00401701 pop edi00401702 pop esi00401703 pop ebx00401704 add esp,48h00401707 cmp ebp,esp00401709 call __chkesp (00420a50)0040170e mov esp,ebp00401710 pop ebp00401711 ret 20210311
汇率兑换计算器

类似问答
  • 通常用( )表示货币的时间价值。a.(a) 股市平均收益率 b.(b) 国债的利率
    • 2024-05-26 02:44:45
    • 提问者: 未知
    参**:d解析:实际生活中,人们通常用银行存贷款利率或国债的利率来表示货币的时间价值,因为在通货膨胀率较低的情况下,银行的存贷款或国债利率可近似地看作全社会...
  • 人民币对内贬值的多方疑问
    • 2024-05-26 23:40:42
    • 提问者: 未知
    人民币在国内为什么钱越来越不值钱?多年来,由于国内的经济增长更多地依靠投资,依靠大量增加的信贷投放,致使**的货币投放量无论同我们自己过去比,还是与世界各国相比,都有着较大数量的超发。国内大城市中的商品房价上涨就是最为突出的堪称凶猛者。人民币对外升值对国内经济的影响也是...
  • 关于期货套期保值的疑问
    • 2024-05-26 14:50:48
    • 提问者: 未知
    首先你是买方的话,在期货上你应该是卖出的。第二,从理论上讲套保的原理是期货现货方向一致,幅度相等,可以完全锁定利润,规避风险。但是在实际上两者的价差会有一定波动和不同步的细节。第三,作为参与套保的现货商,期货的风险由现货的潜在利润分担了。但是绝大多数参与者本身不具备这个渠道
  • 当a=2.8,b=6.4时,求8a+7b-a-6b的值
    • 2024-05-26 22:00:30
    • 提问者: 未知
    8a+7b-a-6b 7a+b 2.8x7+6.4 19.6+6.4 26
  • 股票沪a/b,深a/b的区别?
    • 2024-05-26 07:17:16
    • 提问者: 未知
    沪a、a用人民币买卖,沪b用美元、深b 用港币买卖。沪b主要以上海本地股,深b主要以深圳本地股为主。  股票是股份证书的简称,是股份公司为筹集资金而发行给股东作为持股凭证并借以取得股息和红利的一种有价证券。每股股票都代表股东对企业拥有一个基本单位的所有权。同一类别的每一份股票所代表的公司所有权是相等的。每个股东所拥有的公司所有权份额的大小,取决于其持有的股票数量占公司总股本的比重。  股票是股份公...
  • 前天换手率为a,昨天换手率为b,求今天的换手率c,其中c>a+b的换手率公式
    • 2024-05-26 07:49:35
    • 提问者: 未知
    这个没办法求的,换手率是随即的
  • 交银增利c与交银增利a/b的区别
    • 2024-05-26 03:58:35
    • 提问者: 未知
    交银增利a类为前端收费,申购0.8%(**可优惠至0.6%),赎回0.1%(持有满一年为0.05%,满两年为0) ...交银增利c类采用类似货币基金的收费模式,申购赎回均免费,每年收取0.4...
  • 交银增利债券a/b
    • 2024-05-26 02:42:19
    • 提问者: 未知
    交银增利a/b/c三者只是费率不同,散户都可以选择,不像货币基金的a/b类那样是按购买份额的数量划分的: ...交银增利c类采用类似货币基金的收费模式,申购赎回均免费,每年收取...
  • 保证金股票交易的疑问?
    • 2024-05-26 10:51:12
    • 提问者: 未知
    不要算了,你大概把做空看得太美好了。融资没问题,融券并不是所有股票都可以融到的。因为你是向证券公司借股票来卖,证券公司不可能持有那么多股票,现在上海深圳两个市场上千个股票,随便哪个公司都不可能全部持有的。所以一般说来证券公司只会持有人所皆知的大盘股。而事实上你想借的股票可能根本没有。比如我非常不看好现在的创业办和中小版股票,想做空。可是你根本不可能借到
  • 设实数a>0,b>0,且满足a+b=1,求(1/ab)+ab取值范围 
    • 2024-05-26 16:43:47
    • 提问者: 未知
    解(1)因为a+b=1 所以a=1-b 则ab=(1-b)*b=-b^2+b=-(b-1/2)^2+1/4 当b=1/2时ab取最大值1/4 又因为0所以ab的取值范围是(0,1/4](2)令f(ab)=ab+1/ab,ab=x 则f(ab)=f(x)=x+1/x,又因为ab的...
汇率兑换计算器

热门推荐
热门问答
最新问答
推荐问答
新手帮助
常见问题
房贷计算器-九子财经 | 备案号: 桂ICP备19010581号-1 商务联系 企鹅:2790-680461

特别声明:本网为公益网站,人人都可发布,所有内容为会员自行上传发布",本站不承担任何法律责任,如内容有该作者著作权或违规内容,请联系我们清空删除。