sirliu 发表于 2011-4-30 08:15:58

CPU是如何判断一段二进制数据为一组命令的?

在学习“2.10 CS 和 IP”遇到的疑问:
         此节中关于“8086PC读取和执行指令演示”中,最后介绍了一个知识点:



这个好理解,没有问题。




但是,疑问是:之前CPU是如何判断内存单元中的数据为一组汇编指令的呢?
为什么CPU从地址20000H读取到地址20002H就结束了,并认为这是一组汇编命令,而不把20000H到20004H这一段当做汇编指令呢?如下图:





表达能力不是太好!希望大家能明白我的意思。

sirliu 发表于 2011-4-30 08:34:25

本帖最后由 sirliu 于 2011-4-30 08:36 编辑

唉,发完帖就明白了,突然灵光一闪
应该这样解释吧:
CPU在生产时内置了一些参数,其中就有把特定数据(B8,BB.....)当做汇编指令、其他数据当做数据(即高级语言的常量)来识别,比如上面的B8(二进制即机器码10111000),当CPU读到这一个数时,就认为他是MOV AX指令,而读到0123H(二进制即机器码100100011)时,由于生产CPU时没有定义该数据,就将其视为常量,即普通数据对待!

新问题又来了:如果出现想B8B8H这样的数据存在时,CPU将怎么样处理呢?


为验证我的想法,我百度到了下面的东西,拿出来分享下:

常用汇编命令与十六进制码对应表:
B8       MOV AX
B9       MOV CX
BA       MOV DX
BB       MOV BX
CD       INT
FA       CLI ;关中断
BC       MOV SP
FB       STI ;开中断
FC       CLD ;设数据传输正方向
BF       MOV DI
F3       REPZ
A5       MOVSW
51       PUSH CX
50       PUSH AX
CB       RETF ;返回
9C       PUSHF ;标志寄存器入栈
74       JZ
9D       POPF ;出栈恢复标志寄存器
75       JNZ
BE       MOV SI
BF       MOV DI
80       CMP
E9       JMP
E8       CALL
C3       RET
B4       MOV AH

loop 发表于 2011-4-30 08:55:16

本帖最后由 loop 于 2011-4-30 08:55 编辑

回复 sirliu 的帖子

新问题又来了:如果出现想B8B8H这样的数据存在时,CPU将怎么样处理呢?
--------------------------------------------------------------------------------------------------------
据我的理解,B8B8H属于16进制,而mov ax 属于汇编指令,CPU是不知道怎么处理的,而是你给出的什么命令,告诉CPU要干什么,CPU根据你给出的命令,执行相应的动作。
例如:
    MOV AX,B8B8H   ;把B8B8的值赋值给AX
按你给出的对于指令,那么电脑就会认为是 B8 B8 B8。

我想你应该把汇编指令和16进制搞混淆了,汇编指令只是助记符,用于我们编程和读懂程序用的。在我们眼里是MOV AX,但在电脑眼里它会转成相应的16进制进行读写操作。

如有不对,欢迎讨论。

sirliu 发表于 2011-4-30 09:10:41

本帖最后由 sirliu 于 2011-4-30 09:13 编辑

回复 loop 的帖子

据我的理解,B8B8H属于16进制,而mov ax 属于汇编指令。。。。。
我是从CPU的角度来思考的,MOV ax在我们编程时确实是助记符,但是最终都会被编译器编译成机器码存放在内存中,这个机器码对应的十六进制数就是B8H;而在程序执行时,CPU根据地址读取到内存单元中中的B8H时会将B8H翻译为MOV ax。如B80123H,就是MOV AX,0123H ;这里的B8就被CPU翻译为mov ax了。

我的新问题是:如果CPU读到B8B8H时怎么处理?
就是说B8B8H按照上面的规则处理的花,B8会被翻译为mov ax指令,那么B8B8H就是"MOV AX"+"MOV AX"。

loop 发表于 2011-4-30 09:17:11

本帖最后由 loop 于 2011-4-30 09:17 编辑

回复 sirliu 的帖子

MOV AX 属于指令,电脑会读成B8,但B8B8属于你要操作的数据,电脑会当作数据来处理,而不会读成MOV AX。

不知道这样解释,你是否能听懂,不懂可以继续讨论。

sirliu 发表于 2011-4-30 09:31:05

回复 loop 的帖子



就是说如果CPU遇到 B8B823H ,这样的指令也会把他当做数据处理吗?


可能我思维进入死圈了,我还是认为 B8B823H 会被CPU翻译为 mov ax,mov ax,23H.
你的意思是不是会把 B8B823H 被翻译为mov ax,B823H?

loop 发表于 2011-4-30 09:31:58

本帖最后由 loop 于 2011-4-30 10:16 编辑

回复 sirliu 的帖子

看下面两张图,一张是机器码,一张是汇编指令。
http://bbs.fishc.com/data/attachment/album/201104/30/093116h9o0f02msog033hk.jpg

http://bbs.fishc.com/data/attachment/album/201104/30/100138x5d4t63txxx3133i.jpg
不知道你能看懂不,如果不明白我在把图片里的内容注明下。

--------------------------------------------------------------------------------------------------------
B8B823H 被翻译为mov ax,B823H?

你还是把编译器和汇编搞混了,mov ax,b823 是给我们看的,便于理解。B8B823是计算机翻译的结果。

------------------------------------------------------------------------------------------------------
图片我重新修正了。

sirliu 发表于 2011-4-30 09:48:20

谢谢斑竹不厌其烦的解答,
看完你贴的两张图,
我想应该这么理解吧:
CPU根据地址开始读取数据,从第一个可以匹配完整语法的内存单元开始执行指令。
比如地址指向的内存单元存放的数据为:0123B800H (上面帖子都写反了,写成 B80123H ,应该是 0123B8H ),由于 00H 没有对应的指令,而 B8 有对应的指令,为 mov ,所以从 B8H 开始匹配一个语句,B8H 后面的都当作数据处理,如 B8B8B8H 中只有最低位的 B8H 会被CPU翻译为 mov ax。

loop 发表于 2011-4-30 10:06:51

本帖最后由 loop 于 2011-4-30 10:12 编辑

回复 sirliu 的帖子

你还是理解错误了,计算机是根据CS:IP所指向的地址当作指令来执行,并不是匹配什么语句。
MOVAX 被计算机识别成指令翻译成机器码B8存在内存0位置,0123H是要处理的数据, 又分为高地址和低地址, 01属于高位放入高字节2,23属于低位放入字节1。
如下图:
http://bbs.fishc.com/data/attachment/album/201104/30/100138x5d4t63txxx3133i.jpg

你在把第2章的内容复习下,里面的实验1你搞懂了,对这些就好理解。

如果高低字节不理解,参考第3章内容3.1~3.3小节。

sirliu 发表于 2011-4-30 10:15:26

是,现在就回炉重铸:)

shangyl00 发表于 2011-5-3 18:36:19

和我当初学这章一样,你必将是可造之材!

sundelian 发表于 2011-5-4 22:38:55

好学生啊.....
页: [1]
查看完整版本: CPU是如何判断一段二进制数据为一组命令的?