. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(CPU工作原理)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  2.10中遇到的问题引出的思考  [已解决] 回复[ 4次 ]   点击[ 1043次 ]  
gecko
[帖 主]   [ 发表时间:2007-10-13 12:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2007-10-10 12:13
在2.10的末后有个提问,如下. 
CPU根据什么将内存单元的内容看做指令? 
因为,在任何时候,CPU将CS、IP中的内容当做指令的段地址和偏移地址,用他们合成指令的物理地址,到内存中读取指令码,执行。 

领会上面的话后,我在想,得到物理地址后根据什么去取内存单元个数的问题? 
比如说得到物理地址后指定的是一个内存单元的地址,取回CPU却是物理地址后连续三个单元或两个单元的的数据。这是根据什么做到的? 

我自己猜测是根据第一个物理地址得到的指令。但指令被取回CPU之前(放在内存时)和数据是没本质上的区别吧?
cxn
[第1楼]   [ 回复时间:2007-10-13 22:10 ]   [引用]   [回复]   [ top ] 
荣誉值:179
信誉值:6
注册日期:2007-07-09 19:18
机器语言我们只要重点理解一下几个概念: 
    
   1. 机器语言指令有操作码(OP)和地址码两部分组成 

                             
      |_____________OP_______________|__d__|__w__| 

      |_____________OP_______________|__s__|__w__| <--此格式用于立即寻址方式 


    在多数操作码中,常使用某些位来指示某些信息: 
    如图上结构里的: w=1 时 对字来操作 
                     w=0 时 对字节来操作 

                     d值在双操作数指令中才有效 
                  当 d=1 时 有且只有一个寄存器用于目的操作数 
                     d=0 时 有且只有一个寄存器用于源操作数 

                     s=1 时 立即数为8位,但要求扩展成16位数 
                     s=0 时 当指令作字节操作/有16位立即数 


   2. 寻址方式的机器语言表示: 

       |    mod    |       reg       |    r/m    | 
       |_____|_____|_____|_____|_____|_____|_____| 

    reg 表示寄存器方式,在不包括立即数的双操作数指令的情况下,规定必须有一个操作数在寄存器中,该寄存器由reg字段指定,并与操作码字节中的w位相组合确定的寄存器 

    mod字段与r/m(register/memory)字段结合在一起确定另一个操作数的寻址方式   
现在熟悉简单的: 
______________________________________________________________________________ 
表1 <PS:部分资料>        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 
______________________________________________________________________________ 
表2 <PS:部分资料>        rrr : Index Register  
                         000 : EAX  

                         001 : ECX  

                         010 : EDX  

                         011 : EBX  

                         100 : No Index  

                         101 : EBP  

                         110 : ESI  

                         111 : EDI 
______________________________________________________________________________ 
表3 <PS:部分资料>        mmm : Function              11 
                                                          w=1 
                         000 : DS:[BX+SI]           

                         001 : DS:[BX+DI]  

                         010 : SS:[BP+SI]  

                         011 : SS:[BP+DI]                  BX                

                         100 : DS:[SI]  

                         101 : DS:[DI]  

                         110 : SS:[BP]  

                         111 : DS:[BX] 
______________________________________________________________________________ 
表4 <PS:部分资料> 
oo : Function  

00 : If mmm = 110, then a displacement follows the operation; otherwise, no displacement is used  

01 : An 8-bit signed displacement follows the opcode  

10 : A 16-bit signed displacement follows the opcode  

11 : mmm specifies a register, instead of an addressing mode 
______________________________________________________________________________ 
上面的表,你都看明白了吗? 现在我就教你们如何利用这样的表格来把汇编指令翻译机器码 

    3.指令格式简介 

    8086所用的16位指令格式: 

    ________   _____________   ________   ________ 
    |操作码| + |mod-reg-r/m| + |位移量| + |立即数| 
    1~2字节     0~1字节         0~2字节    0~2字节 


OK!以上就是基本知识,下面我们来实践吧: 

——————————————————————————————————————— 
问题: 

   MOV AX,1234H  对应的机器码为:B83412  

   MOV EBX,0     对应的机器码为:66BB00000000 

   MOV CL,55H    对应的机器码为: B155 
   
   MOV AX,BX     对应的机器码为:8BC3 


   我在问一下,机器码的数据格式是什么? 好像是 机器指令+操作数(高位存放在地址高位,低位存放在地址低位),但是前面MOV AX,怎么就变成了B8,弄不明白,请指教。 

PS: 上面的题目是一个网友问的,现在我来实践一遍给你们看。 
——————————————————————————————————————— 

指令1 ->  MOV AX,1234H  对应的机器码为:B83412  

解法: 判断-> 这个是8086汇编16位汇编指令格式,并且是立即寻址方式 
       查表-> 打开opcodes.html文件,找到标题为“Main Instructions”,单击“M”字母,然后对应查看 “MOV Reg,Imm”格式的“OpCode”项为:1011wrrr 
     再判断-> 由于寄存器是AX, 立即数是1234H,明显是“对字操作”,所以w=1 
               在查看本文章上面的“表1”,对应的查到rrr的值为000 
   组合结果-> w=1 
               rrr=000 
               1011wrrr=1011 1000B ->B8H                       
根据“ 3.指令格式简介” ->  B8H + |立即数(低位在前高位在后)|= B83412H  

PS: "+" 符号不为“加号”  

好了,已经解完第一题了,机器码为 B83412H    

——————————————————————————————————————— 

指令4 ->  MOV AX,BX     对应的机器码为:8BC3 

解法: 判断-> 这个是8086汇编16位汇编指令格式,并且是寄存器寻址方式 
       查表-> 打开opcodes.html文件,找到标题为“Main Instructions”,单击“M 

”字母,然后对应查看 “MOV Reg,Reg”格式的“OpCode”项为:1000101woorrrmmm 
     再判断-> 由于寄存器是AX, BX 明显是“对字操作”,所以w=1 
               在查看本文章上面的“表4”,对应查到oo=11 因为是寄存器寻址方式 
               在查看本文章上面的“表1”,对应查到rrr的值为000 ,因为当两个操 

作数都是寄存器,那么一般要以目的操作数为准 
               在查看本文章上面的“表3”, 对应查到mmm的值为011 ,因为当两个操作数都是寄存器,那么一般要以源操作数为准 
    组合结果-> w=1 
               oo=11 
              rrr=000 
              mmm=011 
 1000101woorrrmmm=1000 1011 1100 0011B ->8BC3H 

好了,已经解完第二题了,机器码为8BC3H



可以参照下面这个帖子
http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1004&qkSg=2&qID=1164&readSg=1
bloom
[第2楼]   [ 回复时间:2007-10-13 22:12 ]   [引用]   [回复]   [ top ] 
荣誉值:129
信誉值:0
注册日期:2007-07-12 18:33
回复:[贴 主]
------------------
“比如说得到物理地址后指定的是一个内存单元的地址,取回CPU却是物理地址后连续三个单元或两个单元的的数据。这是根据什么做到的?  
我自己猜测是根据第一个物理地址得到的指令。但指令被取回CPU之前(放在内存时)和数据是没本质上的区别吧?”

楼主能否说的明确些,不理解你的意思。
gecko
[第3楼]   [ 回复时间:2007-10-14 14:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2007-10-10 12:13
谢谢cxn,你回答到点上了.

也谢谢bloom
gecko
[第4楼]   [ 回复时间:2007-10-14 14:13 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2007-10-10 12:13
此贴由 贴主 于 [ 2007-10-14 14:13 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(cxn):6分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved