我目前正在学习装配8086。 有些命令适用于ax,有些命令不适用。 例如:mov [ax],5不起作用。 为什么这个以及bx寄存器优于ax寄存器的优点是什么? 提前谢谢。
答案 0 :(得分:5)
bx
优于ax
的主要优势在于它可以被称为
指向数据段中地址的指针。
您无法在有效地址中使用ax
:
MOV cx, [ax] ;doesn't work
MOV cx, [bx] ;works fine and loads cx with the value which is pointed by bx
您可以称为指针的寄存器是:
bx
,si
,di
,bp
那些不能被称为指针的那些:
ax
,cx
,dx
,sp
这是16bit addressing modes的限制。另请参阅x86标记wiki。
ax
在数学运算方面具有优势,因为mul
等某些函数会隐式使用它。
mul cx
将ax乘以cx,并将结果存储在dx:ax
中。在386或更高版本中,您可以使用imul bx, cx
来执行bx *= cx
。它是一个更长的OpCode,只产生乘法结果的低一半(无论有符号还是无符号都是相同的,这就是为什么mul
没有两个或三个操作数形式的原因)。
div
和idiv
只有单操作数形式,将dx:ax
除以源操作数,将结果存储在dx和ax中。
8086还需要ax
以获取更多内容,因为它没有movsx
,因此您需要在al
中放置字节以运行cbw
}。
答案 1 :(得分:4)
例如:
msbuild.exe MySolution.sln /t:Rebuild /p:WarningLevel=0 /p:Configuration=Release ^^^^^^^^^^^^^^^^^ Warning Level Meaning -------- ------------------------------------------- 0 Turns off emission of all warning messages. 1 Displays severe warning messages 2 Displays level 1 warnings plus certain, less-severe warnings, such as warnings about hiding class members 3 Displays level 2 warnings plus certain, less-severe warnings, such as warnings about expressions that always evaluate to true or false 4 (the default) Displays all level 3 warnings plus informational warnings
不起作用。这是为什么?
因为在16位寻址中没有SIB byte,它用于32位寻址以允许mov [ax], 5
之类的事情。选择了可用的ModR / M字节组合来编码other effective addresses,例如[eax + ecx * 4]
和[bx+si]
。