Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 什么是数据类型?它是如何实现的?_Assembly_Types_Language Agnostic_Low Level - Fatal编程技术网

Assembly 什么是数据类型?它是如何实现的?

Assembly 什么是数据类型?它是如何实现的?,assembly,types,language-agnostic,low-level,Assembly,Types,Language Agnostic,Low Level,我两年前开始编程,当我编程时,有一个问题一直困扰着我,我对此保持沉默 我了解微处理器体系结构和低级编程的基础知识,我知道没有数据类型。它只是一种抽象,用于限制数据的处理方式和控制内存资源 因此,我知道这是一个深奥而又有些不清楚的问题,但希望您能理解我在理解高级编程和硬件实际运行之间的联系时所缺少的拼图中的一部分 所以我的问题是:数据类型到底是什么,它是如何实现的,在哪里实现的,何时实现的?数据类型是语言语义的一个元素。它是一组关于语言中的变量可以表示什么样的信息以及应用于这些信息类型的转换的规则

我两年前开始编程,当我编程时,有一个问题一直困扰着我,我对此保持沉默

我了解微处理器体系结构和低级编程的基础知识,我知道没有数据类型。它只是一种抽象,用于限制数据的处理方式和控制内存资源

因此,我知道这是一个深奥而又有些不清楚的问题,但希望您能理解我在理解高级编程和硬件实际运行之间的联系时所缺少的拼图中的一部分


所以我的问题是:数据类型到底是什么,它是如何实现的,在哪里实现的,何时实现的?

数据类型是语言语义的一个元素。它是一组关于语言中的变量可以表示什么样的信息以及应用于这些信息类型的转换的规则

它是在语言的编译器或解释程序中实现的。在编译语言中,它是在编译时实现的。在解释语言中,它是在运行时实现的——一些规则是在“初始解析过程”中应用的,一些规则是在执行过程中根据语言的语义操作数据本身时应用的


针对OP的评论进行详细阐述:

正在进行的一个具体示例可能是用C语言处理此代码:


int i=“foo”;

C编译器首先对其进行词法分析,得出结论:它有一个关键字,后跟一个标识符,后跟一个运算符,后跟一个常量。在语法上,它确定它是一个初始化语句。然后,它进行语义分析,并确定要求它将字符串常量分配给整数变量。此时,它得出结论,这在语义上是不允许的,因为整数数据类型不允许有字符串值。C编译器会发出一条错误语句来说明这一点,不会生成输出代码、程序集和二进制文件

数据类型的作用是导致编译停止

数据类型的实现在C编译器本身——在编译器的代码/逻辑中

您无法在程序本身的“汇编代码”中“查看”数据类型。它们存在于实现语言的机制(编译器或解释器)中,而不是结果程序中


因此,不存在“一段说明数据类型的汇编代码”这样的东西。

我们可以在
C

在这篇文章中,丹尼斯·里奇制作
C
的原因之一是因为
B
(在
C
之前,UNIX的大部分语言都是用
B
编写的)打字能力非常弱,因此丹尼斯·里奇通过添加类型和结构将
B
语言“变成了
C
语言

B语言的一个缺点是它不知道数据类型。(一切都是用机器语言表达的)。B语言没有提供的另一个功能是使用“结构”。这些东西的滞后形成了丹尼斯·M·里奇开发C语言的原因

我将尝试快速地介绍这一点。

看看典型的x86 32位寄存器,
eax
例如,您有

00-00-00-f0h <- A bit-mask just to add some bits
注意这个
mov DWORD PTR[esp+0xc],0x409064

将此地址(
0x409064
)移动到堆栈(
esp+0xc
)的地址是什么

如果我们检查一下我们得到的地址

(gdb) x/s 0x409064
0x409064 <__register_frame_info+4231268>:       "hello world"
否它不在堆栈上存储指针

这就改变了,让我们在变量被推到堆栈上之后的某个点快速检查堆栈

注意:gdb调用
words
我称之为
dword
,所以当我要求
5个十六进制单词(5xw)
时,我的意思是
5个十六进制dwords
,这就是我得到的

(gdb) x/5xw $esp
0x28fea0:       0x00401f80      0x00000000      0x61000023      0x00409064
0x28feb0:       0x00000023
查看第一行的最后两个dwords
0x6100023和0x00409064

0x00409064是数据的地址
(char*)

0x6100023此dword需要释放几个字节才能有意义。忽略
000024
我们只剩下
0x61
用于“a”的ascii值

编译器已将“a”| 0x61存储为堆栈
esp+0xb=char
esp+0xc=(char*)
上字符串旁边的数据本身,正如您可以看到的,
C
中的(类似于汇编)类型与大小密切相关,并且许多工作都是由编译器完成的,如果类型的大小很难确定
C
似乎使用指针(寄存器的大小),否则如果类型的大小可以确定,编译器只会将数据放在堆栈上

(我指的是控制)

我只检查了
char
s

我敢肯定,仅仅在
C
中,类型的实现就有很多其他的方式,而没有考虑到存在的所有其他语言以及它们可能采用的所有不同方式

无论如何,我希望这能帮你解决一些问题,我没有把事情搞砸


额外信息

快速搜索
编译器设计

关于任何语言的信息,我觉得我应该参考它的标准
这里是

另一种快速查找语言信息的方法是
[x语言]文档进行
谷歌搜索

有关
类型的详细信息
i

我是如何找到最后一篇论文的,这是另一个找到信息的好方法
对您正在查找的内容进行
wiki搜索
,并在页面底部检查
进一步阅读
以及页面上的任何参考资料

现在大约
(gdb) x/s 0x409064
0x409064 <__register_frame_info+4231268>:       "hello world"
(gdb) x/8i $eip
=> 0x4015d3 <main+3>:   and    esp,0xfffffff0
   0x4015d6 <main+6>:   sub    esp,0x10
   0x4015d9 <main+9>:   call   0x402000 <__main>
   0x4015de <main+14>:  mov    DWORD PTR [esp+0xc],0x409064
   0x4015e6 <main+22>:  mov    BYTE PTR [esp+0xb],0x61
   0x4015eb <main+27>:  mov    eax,0x0
   0x4015f0 <main+32>:  leave
   0x4015f1 <main+33>:  ret
(gdb) x/5xw $esp
0x28fea0:       0x00401f80      0x00000000      0x61000023      0x00409064
0x28feb0:       0x00000023