鱼C论坛

 找回密码
 立即注册
查看: 5142|回复: 7

[已解决]ASCII码

[复制链接]
发表于 2020-11-21 13:43:04 | 显示全部楼层 |阅读模式
6鱼币
本帖最后由 月神 于 2020-11-21 22:12 编辑

一、CPU只认识0、1,不认识abcd。。。。等,为什么说ea01等等是机器码
二、是不是ASCII码和BIOS一起封装在内存里的?所以说经过ASCII码转化的控制符都是机器码?
三、机器码由哪些组成?
最佳答案
2020-11-21 13:43:05
这个问题,挺好的。
先解释一下,CPU的确只认得‘连通(1)’和‘断开(0)’。而所位的机器码却有其物但是他们并不是ASCII码,也不是我们能看到的十六进制数,他们是实实在在的’0‘和’1‘而且也不是存在内存里,而是像一排排开关一样刻在CPU里。按特定的规则打开(0)/关闭(1)这些开关,就会把电路引导到相应的功能。BIOS和内存也不是同一个东西。BIOS是一个写有现成程序的rom芯片买主版的时候直接焊在主板上,内存就是一个数据的大池子原本里面什么都没有。而ASCII码是存在于操作系统中的,操作系统有可以理解为一个大软件,也就是说ASCII码本质上是软件的一部分,既然BIOS里本身就存着ASCII码,那说ASCII码被封装在计算机上也算说得通。至于经过ASCII码转化的控制符都是机器码?这个条件就太多了,虽然在常用系统里,运行反编译工具看到的控制符基本多表示相应的机器码,但是反编译工具本身就是系统里的程序,你能看到那些字母和数字并不代表程序是用字母储存的,他是按照某些约定俗成的规则去翻译内存里的0和1,不然那些内存里的数据读取时没有明确好开头和结尾,只要读偏一位它代表的意思就完全变了。

既然cpu不认得a,b,c那我们看到的汇编程序里的 a b c是哪来的,它们到底是什么东西?难不成是CPU无中生有?没错就是无中生有!我慢慢讲。

你可以想象,你的电子闹钟,你家的智能电饭锅,多功能微波炉,其实都是有集成逻辑电路来操控的,效果和CPU一样,但是为什么不需要你连上键盘鼠标显示器,要手动输入一串串指令才工作,就是因为它内部的工作并不需要被人看到,更不会被人改写。

但是电脑就不一样了,电脑是要与人建立沟通的。人们通过物理结构的区别,给了CPU有两只手,我们规定第一只手抓到的八个0和1就当做是代码,第二之手抓到的八个0和1就是数据,其实两只手抓的东西本质上只是一串串‘1’和‘0’。抓到代码的手就按我前面将的方法CPU自动依照手中代码里的‘0’和‘1’去拨弄开关,最终执行相应的功能,当然功能也包括如何处理另一只手里的数据。

那么人们既然是知道CPU能干什么,可是就目前来看我们要是想和CPU交流的话就只能通过对物理针脚的通电电压高低来控制他。这可能需要每秒钟调整电路几亿次这显然是反人类的。


所以人得想一个简单可行办法让计算机知道我们要CPU干什么。这时候显示器和键盘就有了用处,可是虽然我们都知道CPU看的是0和1,并且我们也能用人类的符号‘a,b,C,0,3,5’在纸上把他们写出来,但该如何把它用显示器显示出来呢?

ASCII码登场了,之所以有ASCII码就是为了能让机器与人交互就像一本字典,每个ASCII码具有几个不同的意义,就拿A来说,对于cpu来说就是‘0100 0001’,对于显示器来说就是:

20131018003823359.png

对于人来说代表的就是抽象的英文字母“A”。

当我们看到字符在屏幕里显示的时候就是:人们用十六位机器码写程序>>>通过键盘输入给电脑,此时你以为你输入的是a,b,c,d其实键盘给电脑传过去的是0和1>>> cpu通过指令再把0和1复制一份,一份自己留着用当成指令,另一份拿出机器二进制码和人们编好的汇编指令表对比,得到汇编指令各个字母对应的ASCII码>>>将转化成上面图片里的点阵>>>显示在屏幕上。
其实从始至终cpu都没去理解ASCII码里面的字母到底是什么意思。

到这里可能还有疑问,就是既然cpu的指令多可以用ASCII换成字符来表示,那是不是能通过ASCII码转化来的像命令的东西都有对应的机器指令。显然不是的,机器指令的数量肯定比字母与数字的组合少得多。我们不能谁便拿来一串数据,就用ASCII码,一个一个匹配,看看那些是能翻译的,这样做是没道理的。即便要对比也是先把二进制换算与之相应的汇编指令的ASCII码才可能行。
如果你直接用ASCII表翻译就会得到以下结果:

内存里是100 1000 1000 1011 0101 0101 1111 1000
你用ASCII码比较出来的是'H U '
他正真汇编指令的意义是:mov rdx,[rbp-08]

而‘H U ’和mov rdx,[rbp-08]并没有直观的联系。

到这里基本已经非常浅显的区别讲了一下。
至于都有什么机器码,如果英文好的话可以自行去cpu的官网去查》

https://software.intel.com/conte ... cles/intel-sdm.html

这个是Intel的。



其实东西并不复杂,只不过刚接触这些摸不到,看不着又抽象的东西,的确会想的很头疼




最佳答案

查看完整内容

这个问题,挺好的。 先解释一下,CPU的确只认得‘连通(1)’和‘断开(0)’。而所位的机器码却有其物但是他们并不是ASCII码,也不是我们能看到的十六进制数,他们是实实在在的’0‘和’1‘而且也不是存在内存里,而是像一排排开关一样刻在CPU里。按特定的规则打开(0)/关闭(1)这些开关,就会把电路引导到相应的功能。BIOS和内存也不是同一个东西。BIOS是一个写有现成程序的rom芯片买主版的时候直接焊在主板上,内存就是一个 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-21 13:43:05 | 显示全部楼层    本楼为最佳答案   
这个问题,挺好的。
先解释一下,CPU的确只认得‘连通(1)’和‘断开(0)’。而所位的机器码却有其物但是他们并不是ASCII码,也不是我们能看到的十六进制数,他们是实实在在的’0‘和’1‘而且也不是存在内存里,而是像一排排开关一样刻在CPU里。按特定的规则打开(0)/关闭(1)这些开关,就会把电路引导到相应的功能。BIOS和内存也不是同一个东西。BIOS是一个写有现成程序的rom芯片买主版的时候直接焊在主板上,内存就是一个数据的大池子原本里面什么都没有。而ASCII码是存在于操作系统中的,操作系统有可以理解为一个大软件,也就是说ASCII码本质上是软件的一部分,既然BIOS里本身就存着ASCII码,那说ASCII码被封装在计算机上也算说得通。至于经过ASCII码转化的控制符都是机器码?这个条件就太多了,虽然在常用系统里,运行反编译工具看到的控制符基本多表示相应的机器码,但是反编译工具本身就是系统里的程序,你能看到那些字母和数字并不代表程序是用字母储存的,他是按照某些约定俗成的规则去翻译内存里的0和1,不然那些内存里的数据读取时没有明确好开头和结尾,只要读偏一位它代表的意思就完全变了。

既然cpu不认得a,b,c那我们看到的汇编程序里的 a b c是哪来的,它们到底是什么东西?难不成是CPU无中生有?没错就是无中生有!我慢慢讲。

你可以想象,你的电子闹钟,你家的智能电饭锅,多功能微波炉,其实都是有集成逻辑电路来操控的,效果和CPU一样,但是为什么不需要你连上键盘鼠标显示器,要手动输入一串串指令才工作,就是因为它内部的工作并不需要被人看到,更不会被人改写。

但是电脑就不一样了,电脑是要与人建立沟通的。人们通过物理结构的区别,给了CPU有两只手,我们规定第一只手抓到的八个0和1就当做是代码,第二之手抓到的八个0和1就是数据,其实两只手抓的东西本质上只是一串串‘1’和‘0’。抓到代码的手就按我前面将的方法CPU自动依照手中代码里的‘0’和‘1’去拨弄开关,最终执行相应的功能,当然功能也包括如何处理另一只手里的数据。

那么人们既然是知道CPU能干什么,可是就目前来看我们要是想和CPU交流的话就只能通过对物理针脚的通电电压高低来控制他。这可能需要每秒钟调整电路几亿次这显然是反人类的。


所以人得想一个简单可行办法让计算机知道我们要CPU干什么。这时候显示器和键盘就有了用处,可是虽然我们都知道CPU看的是0和1,并且我们也能用人类的符号‘a,b,C,0,3,5’在纸上把他们写出来,但该如何把它用显示器显示出来呢?

ASCII码登场了,之所以有ASCII码就是为了能让机器与人交互就像一本字典,每个ASCII码具有几个不同的意义,就拿A来说,对于cpu来说就是‘0100 0001’,对于显示器来说就是:

20131018003823359.png

对于人来说代表的就是抽象的英文字母“A”。

当我们看到字符在屏幕里显示的时候就是:人们用十六位机器码写程序>>>通过键盘输入给电脑,此时你以为你输入的是a,b,c,d其实键盘给电脑传过去的是0和1>>> cpu通过指令再把0和1复制一份,一份自己留着用当成指令,另一份拿出机器二进制码和人们编好的汇编指令表对比,得到汇编指令各个字母对应的ASCII码>>>将转化成上面图片里的点阵>>>显示在屏幕上。
其实从始至终cpu都没去理解ASCII码里面的字母到底是什么意思。

到这里可能还有疑问,就是既然cpu的指令多可以用ASCII换成字符来表示,那是不是能通过ASCII码转化来的像命令的东西都有对应的机器指令。显然不是的,机器指令的数量肯定比字母与数字的组合少得多。我们不能谁便拿来一串数据,就用ASCII码,一个一个匹配,看看那些是能翻译的,这样做是没道理的。即便要对比也是先把二进制换算与之相应的汇编指令的ASCII码才可能行。
如果你直接用ASCII表翻译就会得到以下结果:

内存里是100 1000 1000 1011 0101 0101 1111 1000
你用ASCII码比较出来的是'H U '
他正真汇编指令的意义是:mov rdx,[rbp-08]

而‘H U ’和mov rdx,[rbp-08]并没有直观的联系。

到这里基本已经非常浅显的区别讲了一下。
至于都有什么机器码,如果英文好的话可以自行去cpu的官网去查》

https://software.intel.com/conte ... cles/intel-sdm.html

这个是Intel的。



其实东西并不复杂,只不过刚接触这些摸不到,看不着又抽象的东西,的确会想的很头疼




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-21 20:48:51 | 显示全部楼层
本帖最后由 月神 于 2020-11-21 21:11 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-22 09:07:30 | 显示全部楼层
经过ASCII码转化的控制符都是机器码?

这么说并不严谨,ASCII码里的确也有一部分控制符但并不是机器码》
机器码对应的二进制数据和ASCII码不能直接互相翻译

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-22 09:13:18 | 显示全部楼层
如果你拿内存里的二进制串,用ASCII码对照翻译,却惊奇的发现,里面有可以理解的词语,那么这段内容基本不会代表某条指令,反而他很有可能是只是文本数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-22 11:41:14 | 显示全部楼层
一 十六进制 a-e对应10-15,准确说ea01为ea01H,转换为十进制为e(15)*16^3+a(10)*16^2+0*16+1 机器码是机器识别的代码,对机器来说是一条指令,为向上跳转一个字节(位移跳转)
二 ASCII是字符编码,表示某个数据代表什么字符,如61h为'a'(是一种映射关系),控制符是?机器码组成可百度,但是编译器该关心的事,汇编语言和机器码是一一对应关系,为了我们便于理解才出现的,所以没接触到最底层(如溢出)不需要关心
三 百度,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-22 12:26:18 | 显示全部楼层
这个要看你机器码是怎么获取的,一般是取CPU的硬件ID,网卡ID,硬盘ID等组成的,这些ID都是生产时固化在硬件上的,一般是无法更改的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-3 20:23:45 | 显示全部楼层
“或许” 发表于 2020-11-21 13:43
这个问题,挺好的。
先解释一下,CPU的确只认得‘连通(1)’和‘断开(0)’。而所位的机器码却有其物但 ...

很强,感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 08:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表