32 个解决方案
#1
编译原理应该就是讲这个的。
但是编译原理讲的一般都是高级语言。我感觉汇编语言的编译应该比高级语言的编译简单很多,明白了高级语言的编译汇编的编译应该就能知道了。
但是编译原理讲的一般都是高级语言。我感觉汇编语言的编译应该比高级语言的编译简单很多,明白了高级语言的编译汇编的编译应该就能知道了。
#2
每一条汇编语言都对应着相应的机器语言,编译器把相应的汇编指令转换成对应的机器码就行了吧
#3
一层一层的抽象呗,底层仅给上层暴露出接口
#4
搜开源80x86汇编器
#5
应该看x86手册,看了指令集和指令编码就应该知道怎么回事了
#6
其实就是把以前人工翻译的工作通过程序来完成而已.翻译的基本原理和以前人工翻译是一样的,以前人工翻译是人翻译出二进制代码,再通过键盘来完成二进制的输入;现在是汇编程序直接对汇编代码翻译得出二进制代码,再提供给CPU使用.
编译器的构造比较麻烦.至少需要以下3个基本的东西:
1.获得x86与对应汇编指令的对照表及其翻译规则.这在我上传的资源里有;
2.学会对一个字符串分析,得出其中有用的信息,这需要学编译原理,至少你要知道EBNF描述的语法规则,这对编译分析很有用;
3.要有一定的数据库原理的知识,这对数据的组织很有用,编译过程一部分是操作表.如果你不会任何数据库语言,
可以自己写一堆类似操作数据库的函数(我就不会,所以我自己写).
目前我也在写编译器,只不过我写的编译器要实现的功能是可以轻松构造出别的语法格式的编译器,目前已经完成程序的逻辑部分,只剩语义没写(这部分就是要对表操作).如果有兴趣,可以给我留言.
编译器的构造比较麻烦.至少需要以下3个基本的东西:
1.获得x86与对应汇编指令的对照表及其翻译规则.这在我上传的资源里有;
2.学会对一个字符串分析,得出其中有用的信息,这需要学编译原理,至少你要知道EBNF描述的语法规则,这对编译分析很有用;
3.要有一定的数据库原理的知识,这对数据的组织很有用,编译过程一部分是操作表.如果你不会任何数据库语言,
可以自己写一堆类似操作数据库的函数(我就不会,所以我自己写).
目前我也在写编译器,只不过我写的编译器要实现的功能是可以轻松构造出别的语法格式的编译器,目前已经完成程序的逻辑部分,只剩语义没写(这部分就是要对表操作).如果有兴趣,可以给我留言.
#7
1)MASM,TASM,NASM
2)Debug
3)手工汇编
2)Debug
3)手工汇编
#8
汇编码(助记符)和机器语言是一个东西的两面。
你想象一下,你手中有一种卡片,你看到的一面画着一只苹果,你翻过来写着 Apple。如果你认为苹果的图画是易于理解的符号,那背面的文字就是机器语言了。
你想象一下,你手中有一种卡片,你看到的一面画着一只苹果,你翻过来写着 Apple。如果你认为苹果的图画是易于理解的符号,那背面的文字就是机器语言了。
#9
++
#10
汇编码到机器码基本上没有“编译”一说,因为它们之间是简单的一一对应。
所以assembler就是做一一mapping就可以了。
你可以到Intel的网站上,下一份Intel 64 and IA-32 Architectures Software Developer's Manual.pdf
然后随便找个指令,看它对应的机器码即可“翻译”。
所以assembler就是做一一mapping就可以了。
你可以到Intel的网站上,下一份Intel 64 and IA-32 Architectures Software Developer's Manual.pdf
然后随便找个指令,看它对应的机器码即可“翻译”。
#11
举个例子:
32Bits
push eax ===>50
mov eax, 0 ===>b8 00 00 00 00
pop eax ===>58
汇编语言指令,和二进制指令一一对应。
只有里面的符号,表达式和伪指令,宏指令,需要特殊处理。
这里的符号指的是变量,过程,标号等以名字形式,出现在代码中的符号。
这个汇编的时候会做记录。
32Bits
push eax ===>50
mov eax, 0 ===>b8 00 00 00 00
pop eax ===>58
汇编语言指令,和二进制指令一一对应。
只有里面的符号,表达式和伪指令,宏指令,需要特殊处理。
这里的符号指的是变量,过程,标号等以名字形式,出现在代码中的符号。
这个汇编的时候会做记录。
#12
有些指令,有不止一个形式,其实可以采用不同名字,表示每一种形式。
这样就可以,让指令的二进制代码和汇编中的指令名字一一对应了,不过可读性就不好了。
因为我们通常会忽略指令的细节,直接理解操作的意义。
而这种一种操作,不同指令码,采用不同名字的方式,会令人眼花缭乱的。
这样就可以,让指令的二进制代码和汇编中的指令名字一一对应了,不过可读性就不好了。
因为我们通常会忽略指令的细节,直接理解操作的意义。
而这种一种操作,不同指令码,采用不同名字的方式,会令人眼花缭乱的。
#13
其实就是 查表,
建议看看 cpu指令集手册,比如之前intel的手册写的很详细,一条汇编指令如何变成机器码的。
一条一条翻译就是了。
建议看看 cpu指令集手册,比如之前intel的手册写的很详细,一条汇编指令如何变成机器码的。
一条一条翻译就是了。
#14
楼主问的是如何如何编译过去。就是这个过程是如何执行的。一一对应是如何转变对应的。
#15
#16
汇编指令(比如mov)就是个助记符,他是和机器码一一对应的关系
#17
个人理解,一开始的二进制编程的时候,必然是特定的一串数字代表一个功能,例如:01010101代表现在汇编里的mov指令(这里这是假设)。而现在要做的是,将这些mov等指令放在一个表里,机器抓过来一条语句,发现是mov时,cpu就去内存的一个表里查找mov对应的二进制代码,然后执行就行了。当然是个人理解,勿喷。
#18
#19
编译原理看看 基本就知道了 基本都是汇编变的
#20
汇编到机器码的转换很简单:每一条汇编语言都对应着相应的机器语言,编译器把相应的汇编指令转换成对应的机器码就行了吧
你都说了:指令集可以用助记符表示,助记符显然应该是和汇编指令一一对应的,只要对应的逻辑转换就可以。当然要是你要写汇编编译器那应该是不简单,需要用到(模式匹配)字符串匹配。
你都说了:指令集可以用助记符表示,助记符显然应该是和汇编指令一一对应的,只要对应的逻辑转换就可以。当然要是你要写汇编编译器那应该是不简单,需要用到(模式匹配)字符串匹配。
#21
原理极其简单,假设一个只有加法指令,有4个寄存器(名字就叫寄1,寄2,寄3,寄4吧)的处理器,下一步就是给这些名字进行定义编码:
加 编码成 00,寄1,寄2,寄3,寄4分别编码成00,01,10,11
这就成为一张指令集定义表,也就是所谓的资料了。
好了,现在这个超级简单的处理器就可以进行指令汇编了:
加 寄1,寄2 汇编成-> 00 00 01
加 寄2,寄4 汇编成-> 00 01 11
。。。
实际的汇编要比这个复杂,但原理的确就是么简单的查表替换!
原来人工做这个查表替换,但人是喜欢偷懒的,就写个程序干这个机械的事情吧,于是汇编程序就诞生了,这是聪明而积极的偷懒!
加 编码成 00,寄1,寄2,寄3,寄4分别编码成00,01,10,11
这就成为一张指令集定义表,也就是所谓的资料了。
好了,现在这个超级简单的处理器就可以进行指令汇编了:
加 寄1,寄2 汇编成-> 00 00 01
加 寄2,寄4 汇编成-> 00 01 11
。。。
实际的汇编要比这个复杂,但原理的确就是么简单的查表替换!
原来人工做这个查表替换,但人是喜欢偷懒的,就写个程序干这个机械的事情吧,于是汇编程序就诞生了,这是聪明而积极的偷懒!
#22
编译原理。。。如果你有那个能力,你可以去看看,如果没有,大体了解就行。。。工程讲解适用
#23
我能一点一点的讲,但是
#24
但是编译原理那本书的生成的目标代码是汇编啊,不是机器语言,这不相当于只讲了高级语言到汇编语言的翻译么
#25
前面已经说了,汇编到机器语言就是查表替换
#26
汇编编译器 源码
#27
#28
明白了个大概
#29
第一个汇编器美国人花了十几年才做出来,所以楼主你应该知道要具体解释这个东西如何转变其实并不是那么简单。
以前有个说法是全世界能写汇编器的人不超过一个班级的人。
第一个汇编器肯定是用机器码也就是101010直接通过打孔器打好的纸条输入到计算机的。
而你说的显示部分,其实是另一个软件或者汇编器的非汇编部分来负责显示的,也就是说单纯的汇编器只负责解析并不负责显示,因为至于显示出来的是什么东西,还需要经过ascii的对应,然后转成字符阵列,然后再转成该字符阵列的机器码,然后运行,cpu看到这个机器码是指向显卡的,于是传递到显卡,显卡根据阵列显示出点。
其实在汇编器出现之前,计算机上先有的是操作系统,操作系统负责将输入的指令和结果显示出来,以及程序任务的执行等操作。也就是说即使没有汇编器,计算机也可以显示。
汇编器在运行时也会调用很多操作系统的接口。
很多人说不对啊,我用软盘上打几个汇编指令,然后放到裸机上,不是一样能显示出字符吗?那是因为你所谓的裸机并非全裸,计算机还有个操作系统叫做bios。这是每个计算机必须安装的东西。那么在没有bios之前的呢?计算机上一般也会有个操作系统,否则谁负责接收你传递的指令呢?最早的肯定是没有操作系统的,大家用二进制打孔就像打电报一样,把指令传进计算机,计算机通过灯泡亮暗把二进制结果显示出来。
计算机的发展是循序渐进的,所以要完全的说清楚,需要很久,如果不是搞这个的人一般只需要知道原理即可,具体的细节东西是非常复杂的。
以前有个说法是全世界能写汇编器的人不超过一个班级的人。
第一个汇编器肯定是用机器码也就是101010直接通过打孔器打好的纸条输入到计算机的。
而你说的显示部分,其实是另一个软件或者汇编器的非汇编部分来负责显示的,也就是说单纯的汇编器只负责解析并不负责显示,因为至于显示出来的是什么东西,还需要经过ascii的对应,然后转成字符阵列,然后再转成该字符阵列的机器码,然后运行,cpu看到这个机器码是指向显卡的,于是传递到显卡,显卡根据阵列显示出点。
其实在汇编器出现之前,计算机上先有的是操作系统,操作系统负责将输入的指令和结果显示出来,以及程序任务的执行等操作。也就是说即使没有汇编器,计算机也可以显示。
汇编器在运行时也会调用很多操作系统的接口。
很多人说不对啊,我用软盘上打几个汇编指令,然后放到裸机上,不是一样能显示出字符吗?那是因为你所谓的裸机并非全裸,计算机还有个操作系统叫做bios。这是每个计算机必须安装的东西。那么在没有bios之前的呢?计算机上一般也会有个操作系统,否则谁负责接收你传递的指令呢?最早的肯定是没有操作系统的,大家用二进制打孔就像打电报一样,把指令传进计算机,计算机通过灯泡亮暗把二进制结果显示出来。
计算机的发展是循序渐进的,所以要完全的说清楚,需要很久,如果不是搞这个的人一般只需要知道原理即可,具体的细节东西是非常复杂的。
#30
“第一个汇编器美国人花了十几年才做出来”这是错的,1946年发明了第一台(数字)计算机,1951年第一个高级语言fortran就已经出现了,汇编器比这出现得更早。
#31
我用vb写过一个简单的汇编器,就是debug看东西来翻译成二进制,那时候傻到不知道搜个指令手册。
#32
#1
编译原理应该就是讲这个的。
但是编译原理讲的一般都是高级语言。我感觉汇编语言的编译应该比高级语言的编译简单很多,明白了高级语言的编译汇编的编译应该就能知道了。
但是编译原理讲的一般都是高级语言。我感觉汇编语言的编译应该比高级语言的编译简单很多,明白了高级语言的编译汇编的编译应该就能知道了。
#2
每一条汇编语言都对应着相应的机器语言,编译器把相应的汇编指令转换成对应的机器码就行了吧
#3
一层一层的抽象呗,底层仅给上层暴露出接口
#4
搜开源80x86汇编器
#5
应该看x86手册,看了指令集和指令编码就应该知道怎么回事了
#6
其实就是把以前人工翻译的工作通过程序来完成而已.翻译的基本原理和以前人工翻译是一样的,以前人工翻译是人翻译出二进制代码,再通过键盘来完成二进制的输入;现在是汇编程序直接对汇编代码翻译得出二进制代码,再提供给CPU使用.
编译器的构造比较麻烦.至少需要以下3个基本的东西:
1.获得x86与对应汇编指令的对照表及其翻译规则.这在我上传的资源里有;
2.学会对一个字符串分析,得出其中有用的信息,这需要学编译原理,至少你要知道EBNF描述的语法规则,这对编译分析很有用;
3.要有一定的数据库原理的知识,这对数据的组织很有用,编译过程一部分是操作表.如果你不会任何数据库语言,
可以自己写一堆类似操作数据库的函数(我就不会,所以我自己写).
目前我也在写编译器,只不过我写的编译器要实现的功能是可以轻松构造出别的语法格式的编译器,目前已经完成程序的逻辑部分,只剩语义没写(这部分就是要对表操作).如果有兴趣,可以给我留言.
编译器的构造比较麻烦.至少需要以下3个基本的东西:
1.获得x86与对应汇编指令的对照表及其翻译规则.这在我上传的资源里有;
2.学会对一个字符串分析,得出其中有用的信息,这需要学编译原理,至少你要知道EBNF描述的语法规则,这对编译分析很有用;
3.要有一定的数据库原理的知识,这对数据的组织很有用,编译过程一部分是操作表.如果你不会任何数据库语言,
可以自己写一堆类似操作数据库的函数(我就不会,所以我自己写).
目前我也在写编译器,只不过我写的编译器要实现的功能是可以轻松构造出别的语法格式的编译器,目前已经完成程序的逻辑部分,只剩语义没写(这部分就是要对表操作).如果有兴趣,可以给我留言.
#7
1)MASM,TASM,NASM
2)Debug
3)手工汇编
2)Debug
3)手工汇编
#8
汇编码(助记符)和机器语言是一个东西的两面。
你想象一下,你手中有一种卡片,你看到的一面画着一只苹果,你翻过来写着 Apple。如果你认为苹果的图画是易于理解的符号,那背面的文字就是机器语言了。
你想象一下,你手中有一种卡片,你看到的一面画着一只苹果,你翻过来写着 Apple。如果你认为苹果的图画是易于理解的符号,那背面的文字就是机器语言了。
#9
++
#10
汇编码到机器码基本上没有“编译”一说,因为它们之间是简单的一一对应。
所以assembler就是做一一mapping就可以了。
你可以到Intel的网站上,下一份Intel 64 and IA-32 Architectures Software Developer's Manual.pdf
然后随便找个指令,看它对应的机器码即可“翻译”。
所以assembler就是做一一mapping就可以了。
你可以到Intel的网站上,下一份Intel 64 and IA-32 Architectures Software Developer's Manual.pdf
然后随便找个指令,看它对应的机器码即可“翻译”。
#11
举个例子:
32Bits
push eax ===>50
mov eax, 0 ===>b8 00 00 00 00
pop eax ===>58
汇编语言指令,和二进制指令一一对应。
只有里面的符号,表达式和伪指令,宏指令,需要特殊处理。
这里的符号指的是变量,过程,标号等以名字形式,出现在代码中的符号。
这个汇编的时候会做记录。
32Bits
push eax ===>50
mov eax, 0 ===>b8 00 00 00 00
pop eax ===>58
汇编语言指令,和二进制指令一一对应。
只有里面的符号,表达式和伪指令,宏指令,需要特殊处理。
这里的符号指的是变量,过程,标号等以名字形式,出现在代码中的符号。
这个汇编的时候会做记录。
#12
有些指令,有不止一个形式,其实可以采用不同名字,表示每一种形式。
这样就可以,让指令的二进制代码和汇编中的指令名字一一对应了,不过可读性就不好了。
因为我们通常会忽略指令的细节,直接理解操作的意义。
而这种一种操作,不同指令码,采用不同名字的方式,会令人眼花缭乱的。
这样就可以,让指令的二进制代码和汇编中的指令名字一一对应了,不过可读性就不好了。
因为我们通常会忽略指令的细节,直接理解操作的意义。
而这种一种操作,不同指令码,采用不同名字的方式,会令人眼花缭乱的。
#13
其实就是 查表,
建议看看 cpu指令集手册,比如之前intel的手册写的很详细,一条汇编指令如何变成机器码的。
一条一条翻译就是了。
建议看看 cpu指令集手册,比如之前intel的手册写的很详细,一条汇编指令如何变成机器码的。
一条一条翻译就是了。
#14
楼主问的是如何如何编译过去。就是这个过程是如何执行的。一一对应是如何转变对应的。
#15
#16
汇编指令(比如mov)就是个助记符,他是和机器码一一对应的关系
#17
个人理解,一开始的二进制编程的时候,必然是特定的一串数字代表一个功能,例如:01010101代表现在汇编里的mov指令(这里这是假设)。而现在要做的是,将这些mov等指令放在一个表里,机器抓过来一条语句,发现是mov时,cpu就去内存的一个表里查找mov对应的二进制代码,然后执行就行了。当然是个人理解,勿喷。
#18
#19
编译原理看看 基本就知道了 基本都是汇编变的
#20
汇编到机器码的转换很简单:每一条汇编语言都对应着相应的机器语言,编译器把相应的汇编指令转换成对应的机器码就行了吧
你都说了:指令集可以用助记符表示,助记符显然应该是和汇编指令一一对应的,只要对应的逻辑转换就可以。当然要是你要写汇编编译器那应该是不简单,需要用到(模式匹配)字符串匹配。
你都说了:指令集可以用助记符表示,助记符显然应该是和汇编指令一一对应的,只要对应的逻辑转换就可以。当然要是你要写汇编编译器那应该是不简单,需要用到(模式匹配)字符串匹配。
#21
原理极其简单,假设一个只有加法指令,有4个寄存器(名字就叫寄1,寄2,寄3,寄4吧)的处理器,下一步就是给这些名字进行定义编码:
加 编码成 00,寄1,寄2,寄3,寄4分别编码成00,01,10,11
这就成为一张指令集定义表,也就是所谓的资料了。
好了,现在这个超级简单的处理器就可以进行指令汇编了:
加 寄1,寄2 汇编成-> 00 00 01
加 寄2,寄4 汇编成-> 00 01 11
。。。
实际的汇编要比这个复杂,但原理的确就是么简单的查表替换!
原来人工做这个查表替换,但人是喜欢偷懒的,就写个程序干这个机械的事情吧,于是汇编程序就诞生了,这是聪明而积极的偷懒!
加 编码成 00,寄1,寄2,寄3,寄4分别编码成00,01,10,11
这就成为一张指令集定义表,也就是所谓的资料了。
好了,现在这个超级简单的处理器就可以进行指令汇编了:
加 寄1,寄2 汇编成-> 00 00 01
加 寄2,寄4 汇编成-> 00 01 11
。。。
实际的汇编要比这个复杂,但原理的确就是么简单的查表替换!
原来人工做这个查表替换,但人是喜欢偷懒的,就写个程序干这个机械的事情吧,于是汇编程序就诞生了,这是聪明而积极的偷懒!
#22
编译原理。。。如果你有那个能力,你可以去看看,如果没有,大体了解就行。。。工程讲解适用
#23
我能一点一点的讲,但是
#24
但是编译原理那本书的生成的目标代码是汇编啊,不是机器语言,这不相当于只讲了高级语言到汇编语言的翻译么
#25
前面已经说了,汇编到机器语言就是查表替换
#26
汇编编译器 源码
#27
#28
明白了个大概
#29
第一个汇编器美国人花了十几年才做出来,所以楼主你应该知道要具体解释这个东西如何转变其实并不是那么简单。
以前有个说法是全世界能写汇编器的人不超过一个班级的人。
第一个汇编器肯定是用机器码也就是101010直接通过打孔器打好的纸条输入到计算机的。
而你说的显示部分,其实是另一个软件或者汇编器的非汇编部分来负责显示的,也就是说单纯的汇编器只负责解析并不负责显示,因为至于显示出来的是什么东西,还需要经过ascii的对应,然后转成字符阵列,然后再转成该字符阵列的机器码,然后运行,cpu看到这个机器码是指向显卡的,于是传递到显卡,显卡根据阵列显示出点。
其实在汇编器出现之前,计算机上先有的是操作系统,操作系统负责将输入的指令和结果显示出来,以及程序任务的执行等操作。也就是说即使没有汇编器,计算机也可以显示。
汇编器在运行时也会调用很多操作系统的接口。
很多人说不对啊,我用软盘上打几个汇编指令,然后放到裸机上,不是一样能显示出字符吗?那是因为你所谓的裸机并非全裸,计算机还有个操作系统叫做bios。这是每个计算机必须安装的东西。那么在没有bios之前的呢?计算机上一般也会有个操作系统,否则谁负责接收你传递的指令呢?最早的肯定是没有操作系统的,大家用二进制打孔就像打电报一样,把指令传进计算机,计算机通过灯泡亮暗把二进制结果显示出来。
计算机的发展是循序渐进的,所以要完全的说清楚,需要很久,如果不是搞这个的人一般只需要知道原理即可,具体的细节东西是非常复杂的。
以前有个说法是全世界能写汇编器的人不超过一个班级的人。
第一个汇编器肯定是用机器码也就是101010直接通过打孔器打好的纸条输入到计算机的。
而你说的显示部分,其实是另一个软件或者汇编器的非汇编部分来负责显示的,也就是说单纯的汇编器只负责解析并不负责显示,因为至于显示出来的是什么东西,还需要经过ascii的对应,然后转成字符阵列,然后再转成该字符阵列的机器码,然后运行,cpu看到这个机器码是指向显卡的,于是传递到显卡,显卡根据阵列显示出点。
其实在汇编器出现之前,计算机上先有的是操作系统,操作系统负责将输入的指令和结果显示出来,以及程序任务的执行等操作。也就是说即使没有汇编器,计算机也可以显示。
汇编器在运行时也会调用很多操作系统的接口。
很多人说不对啊,我用软盘上打几个汇编指令,然后放到裸机上,不是一样能显示出字符吗?那是因为你所谓的裸机并非全裸,计算机还有个操作系统叫做bios。这是每个计算机必须安装的东西。那么在没有bios之前的呢?计算机上一般也会有个操作系统,否则谁负责接收你传递的指令呢?最早的肯定是没有操作系统的,大家用二进制打孔就像打电报一样,把指令传进计算机,计算机通过灯泡亮暗把二进制结果显示出来。
计算机的发展是循序渐进的,所以要完全的说清楚,需要很久,如果不是搞这个的人一般只需要知道原理即可,具体的细节东西是非常复杂的。
#30
“第一个汇编器美国人花了十几年才做出来”这是错的,1946年发明了第一台(数字)计算机,1951年第一个高级语言fortran就已经出现了,汇编器比这出现得更早。
#31
我用vb写过一个简单的汇编器,就是debug看东西来翻译成二进制,那时候傻到不知道搜个指令手册。