关于8086的一些特殊机器码译指结果
我记得有天有人问我在8086上0x0f被译成什么,然后我做了俩个实验
实验1
60:100 b8 70 00 mov ax,70
60:103 50 push ax
60:104 0f pop cs
60:105 eb 9 jmp 110
70:210 cc int 3
单步结果:
60:103 push ax
60:104 pop cs
70:110 int 3
实验2
60:100 b8 60 00 mov ax,60
60:103 54 push sp
60:104 50 push ax
60:105 0f pop cs
60:106 54 push sp
60:107 59 pop cx
60:108 58 pop ax
60:109 29 c8 sub ax,cx
60:10b cc int 3
运行结果:
60:10b int 3
ax=2
可见pop cs这个指令的执行是先pop出来,然后执行下一条指令,然后再改变cs。这期间不允许任何形式的中断,就像操作ss一样
同时我还测试了0x60-0x6f结果发现它们译为0x70到0x7f即条件跳转;0xc0与0xc1译为0xc2与0xc3;0xd6就像nop;0xf1是前缀,可能是lock前缀
然后,关于段超越。。。
mov ax,b800
mov es,ax
xor di,di
mov ax,701
mov [ds:ss:cs:es:es:cs:ss:ds:ds:ss:cs:es:es:cs:ss:ds:ds:ss:cs:es:di],ax ; 注:本指令长度22字节
你试试就知道了😃