机器语言(二进制或十六进制)是如何转成汇编语言(英语)的? 能不能转成中文? 为什么?
发布网友
发布时间:2022-04-30 01:28
我来回答
共5个回答
热心网友
时间:2023-10-11 13:02
1.
你需要明白,微处理器的所有执行功能都是固定的,并且它们是有固定顺序的,比方说在51指令集里功能的顺序是:
00——Nop(空操作)
01——AJmp(绝对跳)
02——LJmp(长跳)
03——RR(逻辑右移)
04——Inc(递加)
……
也就是说,51单片机里共N种功能,第X种功能是***。
而在80x86汇编里,更加复杂的汇编指令其实也都是按顺序组织好的“数字”,比如ADD指令,按照其操作码的不同(比方说目标操作符是Ax还是Bx),从B8开始有数个标号都属于Add指令。
汇编时,我们写的代码都是助记符也就是诸如Add,Mov这样的指令,而编译时,就会把这些指令换成对应的数字了。这种转换是固定的,也就是说Mov永远只会转换成那几种形式(之所以会有好几种是因为操作数的类型不同)。
2.
机器语言其实就是上面提到的“数字标号”,也就是指功能序号。比方说一条机器语言是00,按照上面的表找出来,就是Nop空操作指令,当单片机从ROM中执行到00这条代码的时候就会自动调用“第00号功能”,而这个功能就是空操作。所有同型号的51单片机都是这么处理的。
3.
上面从字面上解决了你这个问题。但是我看了你的追问,似乎你想知道的不是这个,而是数字怎么变成字?好吧……
首先你要知道ASCII码,也就是数字和英文字母及标点符号之间的关系。举个例子,65这个数字,在ASCII码中可以表示大写字母A,依次的,66可以表示B;32表示空格,13表示回车,等等。ASCII码占一个字节。
汉字,比较特殊的一类字符,关键就在于它的复杂。英文字母加上标点符号和一堆稀奇古怪的符号,撑死了用127个ASCII码表示就完事了,但是常用汉字远不止它的十倍。所以汉字在数字逻辑中的处理,是按另一种编码存在的。一般的ANSI格式文件是将汉字表示为GB-2312编码,这种编码跟ASCII码不冲突,占两个字节。关于GB-2312编码的具体情况可以百度查询,规则比较复杂,没办法简单讲清楚的。注意这里讲的是字符的表示规范。
至于指令能不能用汉字来表示,就是相当于 加 A,#30 这样的指令能否存在,我想说的是,完全可以实现;但是这种汇编指令跟 ADD A,#30 有什么区别?我们只需要把现有的汇编编译器稍做修改,让它可以识别这样的指令,然后将“加”换成ADD,再把它转换成数字,在实现上和用Add根本没有区别。
现在的“易语言”,差不多也是用的这种原理,只是写出了可以识别汉字指令的编译器,然后还是使用的形如Delphi和VB一样的编程风格。说白了就是将国外的产品进行一个“山寨”。如果你还不懂,说明我上面讲的你没懂。。。那我也没办法。
4.
其实在微处理器,或者CPU运行期间,内存中只有数字,也就是二进制码,上面所有提到的,包括指令和字符,都是数字形式存在。而我们通常操作时看到的字符,都是用另外的方式(如显卡)转换成图形放到显示器上的,并不是处理器自带的功能;单片机要显示图形字符,需要另外编程。
而对于输入,其实也是将输入的字符转换成数字才能存储到内存之中。追问那可不可以这样呢?
比如直接把0和1转换成中文
00——空操作
01——绝对跳
02——长跳
03——逻辑右移
04——递加
……
可不可以呢?
为什么???
我希望过几年机器语言可以直接转换成中文的汇编语言。
追答00、01等等数字,是实际的存储方式,也就是用物理上的高低电平来实现的,这是电子技术的根本,是不能轻易改变的。你可以改变应用方案,比方说用00来表示Add而不是Nop,但是你不能改变用二进制数字来进行处理这个事实——数字是一切的根本。
而Mov,Add,Nop这类指令纯粹是为了方便记忆相应功能所对应的数字而人为创造出来的一个标记。
就相当于英语音标一样,认识了音标,所有单词都可以读出来。世界上有不止一种音标的写法,但是同一个单词并不会因为音标写法变了而改变它本身的读法或拼法。
所以,哪怕你用日语来做为指令助词符,只要有了和功能顺序的数字一一对应的词就行了。
所以你这个问题说白了根本就不是个问题,只要拿一个成熟的编译器,把里面对于英文指令的处理,全部换成一种对中文的处理,这个编译器就可以完成用“空操作”来代替Nop。
我不知道这是不是你想要的答案,但是我明确地说,即使有了纯中文的汇编语言又怎样?汇编语言本身只是机器语言(纯数字)的一种转化,学习汇编不仅仅是为了掌握程序,更深层次的是掌握硬件运作的原理,当然,最深层次的是借鉴它,创造出新的硬件系统。
就像易语言,它可以用来普及一下编程,但是它不能证明中国人有发明一种面向对象语言的实力。毕竟它还是在Windows下,抄袭N多种外国编程语言的一只工具罢了。
如果你真希望中国在电子这方面能有长足进步,应该多考虑考虑怎样把硬件知识学通。学汇编的同学,我希望你能认清这一点。或许有一天,汇编依然离我们而去,甚至现在,已经不怎么流行汇编了。
热心网友
时间:2023-10-11 13:03
【1】机器语言,顾名思义,CPU的语言。其实就是其支持的指令。通常是十六进制(说二进制也可以)。所有存储到程序存储器中的指令,都是机器语言。一堆二进制的数据,鬼知道是个啥,那个字节是操作码,那个字节是操作数。但是CPU清楚,它按部就班地逐条执行。
【2】汇编语言,里面既有英儿文,也有数据好不好。这里面的英文通常是操作码,如ADD,一看就知道,这句话做加法。还有数据,如ADD A,#30。把30和A加起来放到A里面。当然还有些个英文是寄存器,如前述指令的A。还有伪指令。伪指令就是机器语言中米有的,它用来通知汇编系统,怎么把一段段代码搞到一起;另外也可提高程序的可读性。毕竟汇编都是人写的。
……
【n】终可以,中文。但是ADD A,#30 换成 加 A,#30 有么意义呢?我也很爱国,可是单片机是世界的,尤其中国还不是主要研发地。表现情感,汉字真是神了;表达技术,还是国际话好。追问我只是想知道0和1是怎样转换成字母ABC的???
其他的我不想知道。。。
追答不要大鱼,要虾米,虾米如下:
您提的问题应该是反向汇编。根据10得到ABC,是这意思吧?(我年纪大,反应迟钝,说话啰嗦,您别介意啊)
【1】假设某51CPU系统有256条指令之多,那么从0x0-0xff都对应了一条指令,有些指令为单字节指令,而有些则为多字节指令。
【2】对于反向汇编系统而言,那么它只要从第一条指令开始反向汇编。
读进来第一个字节,这个字节肯定是指令,而不是数据。查找指令表,看其指令结构是几个字节的,如00,是空操作。那么就直接解析为NOP(空操作)从字节00->变成了NOP。
【3】假设第一个字节为25H,是双字节指令(ADD A,direct),那么结合后一个操作数,看成整个指令。如25H,00H,表示把00H内存单元和A单元内容相加放到A。从字节25H,00H->ADD A,0。这里的00H就不会认为是NOP,而是操作数。
【4】假设为三字节指令。那么结合后两个操作数,一起。如020025(Hex) ->LJMP 0025H。这里的00H,25H就不会看成是单个儿指令,而是02指令的操作数对待。
……
综上分析以下几条十六进制代码:
0200250000002500->LJMP 0025H,NOP,NOP,NOP,ADD A,0
0025000025020025->NOP,ADD A,0,NOP,ADD A,02,NOP,ADD A,?
2500025020025000->ADD A,0,LJMP 5020H,LJMP 5000H
上面假设是一段HEX,且开头正确。尽管很相似,机器码看得云里雾里的,但反汇编是逐条转换,结论唯一。对应的ABC是大相径庭。
不知道您理解了米有??
【我终于知道了,我们不是一条道的。我做下位机,你搞上位机。难怪对牛弹琴。我相当怀疑贵校的专业体系开设情况的水平。END】
热心网友
时间:2023-10-11 13:03
机器语言(二进制或十六进制),人,是难以理解的,于是就有人,就想到用英文单词来代表它们。
机器语言,和他们所对应的英文单词,刚开始,是列出了一张表。
人们,通过查表,来把它们互相转换。
现在,都是利用计算机软件,把它们自动的进行转换了。追问我希望以后有中国人来用中文来代表它们!!!
我相信会有这么一天的。
热心网友
时间:2023-10-11 13:04
由汇编转成二进制叫汇编,由二进制转成汇编叫反汇编,一般要汇编功力非常深厚然后才去学反汇编
给你个资料,百度不让发链接,你百度搜索"The Svin 的OpCode教程"笫一个就是了
如果觉得上面这个晦涩难懂,可以搜索一下“学习OpCode”,笫4个CSDN的连接,这个会通俗易懂一点
热心网友
时间:2023-10-11 13:04
一群扯淡话,lz是说,如何建立从机器语言到汇编语言的转化。跟什么反编译有关系?
实际上,汇编语言只是机器语言的另一种表示方式而已。
也就是说,那些字母只是写成助记符(也就是你说的英文)给你看的,在机器中,存储的都是01二进制序列。3楼说的比较好