免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4736 | 回复: 16
打印 上一主题 下一主题

一直有个疑问是关于数据类型的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-15 16:08 |只看该作者 |倒序浏览
高级语言中有数据类型,高级语言翻译成机器指令没有数据类型之说。比如说一条指令是访问一个内存地址也就是高级语言中的一个变量,那cpu怎么知道这个地址以后的几个字节都是属于这个变量的呢?也就是数据类型在机器语言级别是如何实现的?是不是有额外的表来记录程序每个需要用到的地址是几个字节,这个问题一直困扰着我,还请高人能解答。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2012-11-15 16:34 |只看该作者
每条指令都包含着到底要运算、搬移具体到多少个字节的信息

论坛徽章:
0
3 [报告]
发表于 2012-11-15 16:38 |只看该作者
本帖最后由 cnppk 于 2012-11-15 16:41 编辑
cjaizss 发表于 2012-11-15 16:34
每条指令都包含着到底要运算、搬移具体到多少个字节的信息





谢谢版主的解答,也就是计算机从底层支持数据类型?

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
4 [报告]
发表于 2012-11-16 23:43 |只看该作者
可以这么说,但也不全是,大家支持的很微妙。简单说,大多数RISC处理器在数据load的时候,可以通过指令区分load位宽和符号(0扩展或者符号扩展),但对于数据处理指令则并不一定区分,典型的add指令就不会区分数据类型。

类型信息并不会被显示存储,而是编译器根据高级语言中数据类型信息,来编排汇编指令,比如:

对char变量,编译器会在load的时候,通过专用的字节load指令并进行符号扩展,完成内存到CPU内部寄存器的载入;
再比如unsigned short变脸,编译器也会在数据读取的时候安排一个0扩展的半字load;

而对于寄存器向外部存储器写入,则只控制位宽,不控制符号(你可以想想为什么)。

以上主要针对RISC,类似x86,则更为灵活,你可以深入研究研究。

论坛徽章:
0
5 [报告]
发表于 2012-12-05 16:48 |只看该作者
liuiang 发表于 2012-11-16 23:43
可以这么说,但也不全是,大家支持的很微妙。简单说,大多数RISC处理器在数据load的时候,可以通过指令区分 ...



你的意思就是说有不同位宽的指令来处理数据载入的问题而数据处理就没有?

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
6 [报告]
发表于 2012-12-05 17:15 |只看该作者
回复 5# cnppk


    RISC基本都是这样的,就算mips有add addu两条指令,后者的目的也不是专门用于u的。CISC没有深挖过。

论坛徽章:
0
7 [报告]
发表于 2012-12-05 17:19 |只看该作者
liuiang 发表于 2012-12-05 17:15
回复 5# cnppk



能不能拿mov 来举个列子呢?

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
8 [报告]
发表于 2012-12-05 17:33 |只看该作者
回复 7# cnppk


    x86木有研究过,你可以研究看看。

论坛徽章:
0
9 [报告]
发表于 2012-12-06 08:26 |只看该作者
liuiang 发表于 2012-12-05 17:33
回复 7# cnppk





不是x86的也可以呀,举个例子呗

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
10 [报告]
发表于 2012-12-06 09:38 |只看该作者
  1. Disassembly of section .text:

  2. 00000000 <fooChar>:
  3. unsigned short unShA, unShB;
  4. int inA, inB;
  5. unsigned int unInA, unInB;

  6. char fooChar()
  7. {
  8.    0:   e59f3014        ldr     r3, [pc, #20]   ; 1c <fooChar+0x1c>
  9.    4:   e59f2014        ldr     r2, [pc, #20]   ; 20 <fooChar+0x20>
  10.    8:   e5d30000        ldrb    r0, [r3]
  11.    c:   e5d23000        ldrb    r3, [r2]
  12.   10:   e0800003        add     r0, r0, r3
  13.     return chA + chB;
  14. }
  15.   14:   e20000ff        and     r0, r0, #255    ; 0xff
  16.   18:   e1a0f00e        mov     pc, lr
  17.         ...

  18. 00000024 <fooUnchar>:
  19. unsigned char fooUnchar()
  20. {
  21.   24:   e59f3014        ldr     r3, [pc, #20]   ; 40 <fooUnchar+0x1c>
  22.   28:   e59f2014        ldr     r2, [pc, #20]   ; 44 <fooUnchar+0x20>
  23.   2c:   e5d30000        ldrb    r0, [r3]
  24.   30:   e5d23000        ldrb    r3, [r2]
  25.   34:   e0800003        add     r0, r0, r3
  26.     return unChA + unChB;
  27. }
  28.   38:   e20000ff        and     r0, r0, #255    ; 0xff
  29.   3c:   e1a0f00e        mov     pc, lr
  30.         ...

  31. 00000048 <fooShort>:

  32. short fooShort()
  33. {
  34.   48:   e59f3018        ldr     r3, [pc, #24]   ; 68 <fooShort+0x20>
  35.   4c:   e59f2018        ldr     r2, [pc, #24]   ; 6c <fooShort+0x24>
  36.   50:   e1d300b0        ldrh    r0, [r3]
  37.   54:   e1d230b0        ldrh    r3, [r2]
  38.   58:   e0800003        add     r0, r0, r3
  39.   5c:   e1a00800        lsl     r0, r0, #16
  40.     return shA + shB;
  41. }
  42.   60:   e1a00840        asr     r0, r0, #16
  43.   64:   e1a0f00e        mov     pc, lr
  44.         ...

  45. 00000070 <fooUnshort>:
  46. unsigned short fooUnshort()
  47. {
  48.   70:   e59f3018        ldr     r3, [pc, #24]   ; 90 <fooUnshort+0x20>
  49.   74:   e59f2018        ldr     r2, [pc, #24]   ; 94 <fooUnshort+0x24>
  50.   78:   e1d300b0        ldrh    r0, [r3]
  51.   7c:   e1d230b0        ldrh    r3, [r2]
  52.   80:   e0800003        add     r0, r0, r3
  53.   84:   e1a00800        lsl     r0, r0, #16
  54.     return unShA + unShB;
  55. }
  56.   88:   e1a00820        lsr     r0, r0, #16
  57.   8c:   e1a0f00e        mov     pc, lr
  58.         ...

  59. 00000098 <fooInt>:

  60. int fooInt()
  61. {
  62.   98:   e59f3010        ldr     r3, [pc, #16]   ; b0 <fooInt+0x18>
  63.   9c:   e59f2010        ldr     r2, [pc, #16]   ; b4 <fooInt+0x1c>
  64.   a0:   e5931000        ldr     r1, [r3]
  65.   a4:   e5920000        ldr     r0, [r2]
  66.     return inA + inB;
  67. }
  68.   a8:   e0810000        add     r0, r1, r0
  69.   ac:   e1a0f00e        mov     pc, lr
  70.         ...

  71. 000000b8 <fooUnint>:
  72. unsigned int fooUnint()
  73. {
  74.   b8:   e59f3010        ldr     r3, [pc, #16]   ; d0 <fooUnint+0x18>
  75.   bc:   e59f2010        ldr     r2, [pc, #16]   ; d4 <fooUnint+0x1c>
  76.   c0:   e5931000        ldr     r1, [r3]
  77.   c4:   e5920000        ldr     r0, [r2]
  78.     return unInA + unInB;
  79. }
  80.   c8:   e0810000        add     r0, r1, r0
  81.   cc:   e1a0f00e        mov     pc, lr
  82.         ...
复制代码
仅供参考。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP