免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 19134 | 回复: 65

从asm角度看C/C++  关闭 [复制链接]

论坛徽章:
0
发表于 2008-12-27 01:23 |显示全部楼层
.set var_8 , -8
.set var_4 , -4
.set arg_4 , 4

stwu %sp , -0x10(%sp)
mflr  %r0
li      %r4 ,  0
addi  %r3 , %sp , 0x10 + var_8
stw   %r0 , 0x10 + arg_4(%sp)

bl   .gettimeofday

lwz   %r3 , 0x10 + var_8(%sp)
lwz   %r0 , 0x10 + var_4(%sp)

lis    %r9 , 0x1062
ori   %r9 , %r9 , 0x4DD3

mulli  %r3 , %r3 , 0x3E8
mulhw  %r9 , %r0 , %r9
srawi  %r0 , %r0 , 0x1F

mr        %r4 , %r3
srawi  %r3 , %r3 , 0x1F
srawi %r9 , %r9 , 6
subf   %r9 , %r0 , %r9

lwz  %r0 , 0x10 + arg_4(%sp)
mr   %r10 , %r9
addi  %sp , %sp , 0x10

srawi  %r9 , %r9 , 0x1F

mtlr %r0

addc  %r4 , %r4 , %r10
adde  %r3 , %r3 , %r9

blr


PowerPC的。

请问怎么写 ?

[ 本帖最后由 老手 于 2008-12-27 23:38 编辑 ]

论坛徽章:
0
发表于 2008-12-27 11:34 |显示全部楼层
太简单了,不值一做。

有没有根据机器码写出 C 代码的题目?

论坛徽章:
0
发表于 2008-12-27 11:38 |显示全部楼层
原帖由 retuor 于 2008-12-27 11:34 发表
太简单了,不值一做。

有没有根据机器码写出 C 代码的题目?


帮帮忙,好吗? 求你了:-(

论坛徽章:
0
发表于 2008-12-27 12:06 |显示全部楼层
原帖由 retuor 于 2008-12-27 11:34 发表
太简单了,不值一做。

有没有根据机器码写出 C 代码的题目?


我看了你的帖子 。要是以后遇到Python的问题 , 我会向你请教的 。

但你这个帖子纯属捣乱 !

论坛徽章:
0
发表于 2008-12-27 12:15 |显示全部楼层
niubility

论坛徽章:
0
发表于 2008-12-27 12:50 |显示全部楼层
没见过这种汇编,路过,闪人。

论坛徽章:
0
发表于 2008-12-27 13:03 |显示全部楼层
PowerPC都没机会接触...
有心无力.

论坛徽章:
0
发表于 2008-12-27 20:23 |显示全部楼层
谢谢ls几位。

看看x86的 , 几乎一样。

var_28          = dword ptr -28h
var_24          = dword ptr -24h
var_14          = dword ptr -14h
var_C           = dword ptr -0Ch
var_8           = dword ptr -8
var_4           = dword ptr -4

                push    ebp
                mov     ebp, esp
                sub     esp, 28h
                lea     eax, [ebp+var_14]
                mov     [ebp+var_C], ebx
                mov     ebx, 10624DD3h
                mov     [ebp+var_8], esi
                mov     [ebp+var_4], edi
                mov     [esp+28h+var_24], 0
                mov     [esp+28h+var_28], eax
                call    _gettimeofday
                mov     ecx, [ebp+var_14]
                imul    eax, ecx, 3E8h
                mov     esi, eax
                mov     edi, eax
                mov     eax, ecx
                imul    ebx
                sar     ecx, 1Fh
                sar     edi, 1Fh
                mov     ebx, edx
                sar     ebx, 6
                sub     ebx, ecx
                mov     ecx, ebx
                sar     ebx, 1Fh
                add     ecx, esi
                mov     esi, [ebp+var_8]
                adc     ebx, edi
                mov     edi, [ebp+var_4]
                mov     eax, ecx
                mov     edx, ebx
                mov     ebx, [ebp+var_C]
                mov     esp, ebp
                pop     ebp
                retn

论坛徽章:
0
发表于 2008-12-27 22:19 |显示全部楼层
趁此机会谈谈:

一个线程对long类型变量进行修改,多个线程只读这个long类型值,需要加锁吗?http://bbs.chinaunix.net/thread-1336429-1-1.html


在上面的两段汇编,都是函数 , 返回 long long型 , 64位。宿主机均为32位机。

在PowerPC中 , 值存放在  r3 r4 两个寄存器返回 ; x86下的值放在 edx eax .

本人的未经证实的观点是 : 变量不能存在于通用寄存中 , 它必在各数据段 或者说是内存中。

于是 , 上述返回值必然多次操作才能到位 ! 由于这些储存操作通常不是原子动作 , 所以它们完全有被其他线程打破的可能  , 从而导致读出错误 !

虽然 , 上面帖子里提到的是long型 , 但随平台的不同具体实现也不同 , 总之风险是存在的 , 加锁是必须的。

论坛徽章:
0
发表于 2008-12-27 23:03 |显示全部楼层
再谈谈上面提到的这个问题:变量不能存在于通用寄存中 。

有人可能会有疑问: 不是有个register 关键字么 ?

这个起不了作用 ,

其一 , register 只是建议 , 要不要用得看编译器的“心情”。

其二, 即便心情好 , 用了register 。 那我要问:你的CPU有多少register ?   N个 ?
             OK ! 我要处理 N + 1 个变量 , 你怎么办 ?!
            再说, 你无论如何不可能也没有办法把所有寄存器占光了 ,不管是哪种CPU !
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP