xym0673 发表于 2012-8-28 20:20:24

我在2.1 cs:ip 那章遇到一些问题

如下:
CS:IP2000:0000送入地址加法器   变成 物理地址 然后从内存里读取命令读取的不是物理地址为20000的命令吗为什么会读 20000 - 20002的命令?

飘着的云彩 发表于 2012-8-28 20:36:43

2000:0000 B8
2000:0001 23
2000:0002 01
对应的汇编指令是: mov ax,0123H
这条指令长度为3 Byte

GeV20 发表于 2012-8-28 22:11:24

mov ax,0123h 把这条指令翻译成机器指令,占三个字节。
这指令是把一个16位立即数送进16位的寄存器ax中,即:
mov Reg,Imm 类型,对应的机器码应该是1011wrrr,
其中w字段指定对字还是对字节操作,0是字节,1是字,这里w=1,rrr字段指定寄存器,查下表得rrr=000

rrr : W=0 : W=1 : reg32
000 : AL : AX : EAX
001 : CL : CX : ECX
010 : DL : DX : EDX
011 : BL : BX : EBX
100 : AH : SP : ESP
101 : CH : BP : EBP
110 : DH : SI : ESI
111 : BH : DI : EDI

操作码10111000,就是B8h,其余的两个字节,分别对应16位立即数0123h的低8位和高8位。
一条汇编指令就对应了这么一个三字节的机器指令:B8 23 01

从上述可知,机器指令的第一个字节就包含了一些信息,我想CUP通过它能知道一条指令从哪开始,到哪结束。

骑着蟑螂闯红灯 发表于 2012-8-28 23:25:44

{:5_102:}你给个你不理解的例题啊,不然不好回答哦

xym0673 发表于 2012-8-28 23:48:50

GeV20 发表于 2012-8-28 22:11 static/image/common/back.gif
mov ax,0123h 把这条指令翻译成机器指令,占三个字节。
这指令是把一个16位立即数送进16位的寄存器ax中,即 ...

谢!!!!!!

网络学习 发表于 2012-8-29 00:01:59

为什么会读 20000 - 20002的命令?

飘着的云彩 发表于 2012-8-29 17:26:42

网络学习 发表于 2012-8-29 00:01 static/image/common/back.gif
为什么会读 20000 - 20002的命令?

机器指令的第一个字节就包含了一些信息,我想CUP通过它能知道一条指令从哪开始,到哪结束。

木偶 发表于 2012-8-29 23:12:30

我的猜想,mov ax,10
这个指令占3个字节翻译成机械码就是b8 10 00
代码存放的内存地址是20000
而一个内存空间只能存放一个字节也就是b8 那么为了读取这条指令肯定不能少了后面2个字节的机械码
但又没有空间所以cpu就自动将后面的代码玩后放。也就是说你读取的这条指令只是起始地址为20000。

网络学习 发表于 2012-8-30 00:01:01

飘着的云彩 发表于 2012-8-29 17:26 static/image/common/back.gif
机器指令的第一个字节就包含了一些信息,我想CUP通过它能知道一条指令从哪开始,到哪结束。

谢谢你的回答

静夜思絮 发表于 2012-8-30 10:52:35

有地址有长度,才能正常
页: [1]
查看完整版本: 我在2.1 cs:ip 那章遇到一些问题