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

163 天前
 pengtdyd

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

mov ax,0123H
mov bx,0003H
mov ax,bx
add ax,bx
326 次点击
所在节点    问与答
3 条回复
shendaowu
163 天前
搜了一会只搜到这个比较好的 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
163 天前
另外还有一点。我刚才在看这个的时候发现某些指令好像会被“压缩”: http://www.mlsite.net/8086/ 。不过很可能是我理解错了。这个如果你了解哈夫曼编码的话理解起来应该会更轻松一些。Intel 当年这么搞应该是为了节省内存。现在的定长指令好像不会玩这么花了。
pengtdyd
161 天前
@shendaowu 非常感谢你的帮助,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1010118

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX