Assembly 如何在8086中编码POP指令?

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过

我试图在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
过去有操作码
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
)。