Assembly 如何在8086中编码POP指令?
我试图在8086中对以下几个指令进行编码 我已经学会了整个mod、reg、d、w和所有东西是如何工作的。所以,我可以对几乎所有的指令进行编码,比如Assembly 如何在8086中编码POP指令?,assembly,encoding,x86-16,machine-code,Assembly,Encoding,X86 16,Machine Code,我试图在8086中对以下几个指令进行编码 我已经学会了整个mod、reg、d、w和所有东西是如何工作的。所以,我可以对几乎所有的指令进行编码,比如MOV[BX+1234H],DS,但我似乎无法对PUSH-and-POP指令进行编码 POP-DS答案:1FH PUSH AX回答:50小时 如何将这些编码为二进制 根据您要弹出的内容,pop有三种不同的编码。如果要弹出段寄存器,编码是07加上段寄存器的编号左移四位,因此07对于pop es,pop ss为17对于pop ds为1f。指令pop cs过
MOV[BX+1234H],DS
,但我似乎无法对PUSH-and-POP指令进行编码
POP-DS
答案:1FH
PUSH AX
回答:50小时
如何将这些编码为二进制 根据您要弹出的内容,
pop
有三种不同的编码。如果要弹出段寄存器,编码是07
加上段寄存器的编号左移四位,因此07
对于pop es
,pop ss
为17
对于pop ds
为1f
。指令pop cs
过去有操作码0f
,但这在80186处理器中被删除。它现在是双字节指令的前缀。您再也不能pop cs
。要弹出fs
或gs
,请对pop fs
使用操作码0f a1
,对pop gs
使用操作码0f a9
如果要弹出通用寄存器,则编码为58
加上寄存器的编号。寄存器的大小在16位操作模式下为16位,在32位操作模式下为32位,或在64位操作模式下为64位。可以使用66
进行更改。在64位模式下,寄存器号的高位也进入可选REX前缀
如果要跳入内存位置,编码为8f/0
,即操作码8f
,带有modr/m字节,寄存器字段保存值0
有关详细信息,请参阅手册。(例如,或从中提取的完整英特尔PDF)请参阅指令集参考
POP DS
被显式地列为1Fh
,没有比这更简单的了。但是,我想自己转换它。我知道我必须查找MOD表和8086指令格式,我已经这样做了,但是我不能自己转换它们。你不能“自己转换”。您需要查找操作码。它是1Fh
。故事结束了PUSH AX
更有趣,因为PUSH r16
是50+rw
。参考表3-1。注册与+rb、+rw、+rd、+ro相关的代码,您可以看到AX
是0
,因此机器代码是50h
,而不是您声称的58h
(即POP AX
)。