免费注册 查看新帖 |

Chinaunix

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

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

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

论坛徽章:
0
17 [报告]
发表于 2012-12-29 14:09 |只看该作者
tianhuo7766 发表于 2012-12-26 10:25
草真想骂人,这么多人都没一个回答到点子,都是些不完全懂的人!我来说说吧,大家知道,高级语言和汇编相对 ...


说的简单易懂,归根结底就是字节大小不同机器指令不同

论坛徽章:
0
16 [报告]
发表于 2012-12-26 10:25 |只看该作者
草真想骂人,这么多人都没一个回答到点子,都是些不完全懂的人!我来说说吧,大家知道,高级语言和汇编相对应,那么从汇编语言层次看,比如MOV ECS $88,这条汇编,因为有寄存器的参与,所以他是4字节的,如果MOV CS $88,他是2字节的,寄存器起到识别后边内存到底是几个;另外,汇编有DD DB一些伪指令也表示字节数,如果是把内存11移动到内存22,那么是这样MOV  byte ptr内存22 byte ptr内存11, byte ptr这个来表示到底是几个字节的,最后,如果从机器码看,实际每条汇编就是一个机器指令,那么机器指令实际已经决定了操作数据的类型。大概就这样,里面例子可能不正确,但是就是这样的,想说清楚还真得打好几百子,真说不清楚,将就看吧!

论坛徽章:
0
15 [报告]
发表于 2012-12-07 09:30 |只看该作者
dyyseo 发表于 2012-12-06 17:29
每条指令都包含着到底要运算、搬移具体到多少个字节的信息


在opcode的那部分?

论坛徽章:
0
14 [报告]
发表于 2012-12-06 17:29 |只看该作者
每条指令都包含着到底要运算、搬移具体到多少个字节的信息

论坛徽章:
0
13 [报告]
发表于 2012-12-06 17:09 |只看该作者
liuiang 发表于 2012-12-06 14:30
b  字节
h  半字
-  字


非常感谢,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
12 [报告]
发表于 2012-12-06 14:30 |只看该作者
b  字节
h  半字
-  字
d  双字

一般都是这样的。

论坛徽章:
0
11 [报告]
发表于 2012-12-06 14:10 |只看该作者
liuiang 发表于 2012-12-06 09:38
仅供参考。




ldr ldrb ldrh就是你说的不同位宽使用不同的指令,ldrb中的b是指的字节吗?

论坛徽章:
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.         ...
复制代码
仅供参考。

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





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

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP