处理器8086组装规则和限制

时间:2017-06-23 20:55:59

标签: assembly x86-16 cpu-registers

我对8086汇编语言的编码有一些疑问。

  1. 您是否可以将所有通用目的用于每个算术和逻辑运算(添加,子,班次操作......)

  2. 可以为寄存器分配常量(mov ax,1; mov bx,5 ...)

  3. 你能否以一切可能的组合为一个寄存器分配一个寄存器(mov ax,ss; mov es,bp; mov bp,cx; mov si,di ...)

  4. 如果任何问题的答案都是否定的,那么有哪些限制?

3 个答案:

答案 0 :(得分:4)

如果我们谈论通用寄存器(axbxcxdxbpsp,{{1 },si),以及他们的“窄”8位对应项(英特尔文档中的AKA,dir16):

  1. 常规算术和逻辑运算(r8addsub / shlshr / sal,{{ 1}} / sarrolror,...)允许通用andor作为第一个操作数。

    对于第二个操作数,它取决于特定指令 - 算术和逻辑指令允许r/m8 / r/m16(并且r8 / r16的表格更短作为目标寄存器),而shift / rotate只允许al(加上immediates,固定1,......)。

    一些“复杂”算术指令,例如除法和乘法,是硬连线使用特定的寄存器。

  2. 是的,ax包含clmov表单。

  3. 是的,mov r8,imm8包含mov r16,imm16mov表单。

  4. 然后,在英特尔操作码文档中有段寄存器(mov r/m8,r8mov r/m16,r16csds,AKA es

    1. 常规算术和逻辑运算没有对ss进行操作的编码。
    2. 不,没有Sreg这样的东西;你必须首先通过通用注册(或通过堆栈 - 每个代码高尔夫球手都知道Sreg / mov Sreg,imm16push imm16 / pop Sreg更短。
    3. 几乎; mov r16,imm16mov Sreg,r16mov表单,但没有mov Sreg,r/m16表单。
    4. 至于其他寄存器(FLAGS,IP,x87 FPU堆栈......),它们完全独立,通常只能通过专用指令访问。

答案 1 :(得分:0)

  • 某些说明适用于某些注册表@Wayne Conrad 说过。例如,div指令(div arg)仅使用AX或DX:AX 红利,AH或DX存储余数,AL或AX存储商。 (用于存储股息,余额和商的寄存器因人而异 除数大小)

    DIV CX通过CX划分DX:AX对,将剩余部分存储在DX和商中 在AX。

  • 是的,您可以将寄存器,内存值或立即值移动到 只要其操作码已实施,就可以使用寄存器。
  • 否。除非实现相应的移动指令操作码,否则你不能。对于 示例mov sreg,sreg未实现(you can look in coder32 instruction reference),所以你不能做“mov es,fs”,除非有 mov sreg,sreg操作码已实现。还有一些寄存器 不能像 CS和那样直接访问(感谢@fuz指点 由于安全“限制”而导致IP。

简单来说,“限制”是操作码。

答案 2 :(得分:0)

  

1)您是否可以将所有通用目的用于每个算术和逻辑运算(添加,子,移位操作......)

非常好,除了少数例外。
例外是具有隐式操作数的指令。例如:div,按cl移位,字符串指令等

  

2)你可以给寄存器赋值常量(mov ax,1; mov bx,5 ...)

适用于所有GP寄存器。
像段寄存器这样的专用寄存器只能通过GP寄存器分配。

  

3)你能否以一切可能的组合将一个寄存器分配给另一个寄存器(mov ax,ss; mov es,bp; mov bp,cx; mov si,di ...)

是的,有一些明显的例外。
您不能在两个非GP寄存器之间执行mov

有关详细信息,请参阅:http://www.felixcloutier.com/x86/MOV.html