CPU是如何判断一段二进制数据为一组命令的?
在学习“2.10 CS 和 IP”遇到的疑问:此节中关于“8086PC读取和执行指令演示”中,最后介绍了一个知识点:
这个好理解,没有问题。
但是,疑问是:之前CPU是如何判断内存单元中的数据为一组汇编指令的呢?
为什么CPU从地址20000H读取到地址20002H就结束了,并认为这是一组汇编命令,而不把20000H到20004H这一段当做汇编指令呢?如下图:
表达能力不是太好!希望大家能明白我的意思。 本帖最后由 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 编辑
回复 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: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 编辑
回复 sirliu 的帖子
MOV AX 属于指令,电脑会读成B8,但B8B8属于你要操作的数据,电脑会当作数据来处理,而不会读成MOV AX。
不知道这样解释,你是否能听懂,不懂可以继续讨论。 回复 loop 的帖子
就是说如果CPU遇到 B8B823H ,这样的指令也会把他当做数据处理吗?
可能我思维进入死圈了,我还是认为 B8B823H 会被CPU翻译为 mov ax,mov ax,23H.
你的意思是不是会把 B8B823H 被翻译为mov ax,B823H? 本帖最后由 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是计算机翻译的结果。
------------------------------------------------------------------------------------------------------
图片我重新修正了。 谢谢斑竹不厌其烦的解答,
看完你贴的两张图,
我想应该这么理解吧:
CPU根据地址开始读取数据,从第一个可以匹配完整语法的内存单元开始执行指令。
比如地址指向的内存单元存放的数据为:0123B800H (上面帖子都写反了,写成 B80123H ,应该是 0123B8H ),由于 00H 没有对应的指令,而 B8 有对应的指令,为 mov ,所以从 B8H 开始匹配一个语句,B8H 后面的都当作数据处理,如 B8B8B8H 中只有最低位的 B8H 会被CPU翻译为 mov ax。 本帖最后由 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小节。 是,现在就回炉重铸:) 和我当初学这章一样,你必将是可造之材! 好学生啊.....
页:
[1]