V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
pengtdyd
V2EX  ›  问与答

在 8086 中为什么 mov ax,0123H 占 3 个字节,而 mov ax,bx 却是占 2 个字节?

  •  
  •   pengtdyd · 335 天前 · 487 次点击
    这是一个创建于 335 天前的主题,其中的信息可能已经有所发展或是发生改变。

    语言:汇编 环境:DOS Box 系统:win 11

    mov ax,0123H
    mov bx,0003H
    mov ax,bx
    add ax,bx
    
    shendaowu
        1
    shendaowu  
       335 天前   ❤️ 1
    搜了一会只搜到这个比较好的 ppt: http://aturing.umcs.maine.edu/~meadow/courses/cos335/Asm07-MachineLanguage.pdf 。如果 OP 感觉不够好的话可以试试用“8086 Opcodes”再搜搜。中文的话可以试试“8086 机器码”。

    我凭我模糊的理解大概解释一下吧。感觉 OP 迷惑的地方可能在都是 mov 所以机器码格式应该是一样的?如果是的话,其实这两种 mov 从 CPU 的角度来看应该属于两个小类,当然肯定属于 mov 这个大类。我甚至怀疑处理这两个小类的硬件都是不一样的,当然应该会有一些公用的部分。具体来说,机器码的前几位会确定后面的数据的“格式”。单一的 mov 汇编指令其实是对应着很多的机器码的前几位的。那个前几位应该叫操作码。所谓格式就是后面的数据被看成是什么,比如如果操作码是某个数的话,那么后面紧接着的几位数被看成是寄存器的编号还是内存地址。每个寄存器都有一个编号,由于 8086 的寄存器很少,所以用很少的位数就够了。

    刚才问了一下 chatgpt 3.5 ,感觉我比它回答得好。自我感觉良好。

    如果还有什么不懂的地方的话欢迎继续问。
    shendaowu
        2
    shendaowu  
       335 天前   ❤️ 1
    另外还有一点。我刚才在看这个的时候发现某些指令好像会被“压缩”: http://www.mlsite.net/8086/ 。不过很可能是我理解错了。这个如果你了解哈夫曼编码的话理解起来应该会更轻松一些。Intel 当年这么搞应该是为了节省内存。现在的定长指令好像不会玩这么花了。
    pengtdyd
        3
    pengtdyd  
    OP
       333 天前
    @shendaowu 非常感谢你的帮助,谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5381 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:55 · PVG 14:55 · LAX 22:55 · JFK 01:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.