遇到一个很奇怪的问题。
DATAS SEGMENT
dw 8 dup(0)
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV ss,AX
mov sp,10h
mov word ptr ss:[0],offset s
mov ss:[2],cs
call dword ptr ss:[0]
nop
;此处输入代码段代码
S: MOV AH,4CH
INT 21H
CODES ENDS
END START
debug调试的结果为:
在执行call语句的时候, ss:[2] 里面的内容被改写了, 对此做了测试,发现当 ss:[2] 内容为0时,执行call指令后 其内容也会被写为 AB 15
估计这个内容值是ss的地址, 应该是执行call 指令的时候被压栈了,然而在王爽《汇编语言》中对于call指令只是简单的介绍为:
如: call 标号
先 push ip
jmp 标号
对于ip地址值确实被压栈了,但是原先的栈段内容也有很多改变,即call指令其实不单单是做了这些东西,
或者说,栈段内容是因为cpu在执行指令中被改写的,这个改写是对call指令隐藏的。
对于这个问题,还是得继续深究一下。