题目:下面的程序执行后,ax和bx的值是多少?
解答:设s标号处的ip值为x,则call dword ptr ss:[0]后的nop指令对应的ip值则为x-1。
mov word ptr ss:[0],offset s后ss:[0]的值为x,mov ss:[2],ss:[2]的值就是cs的值(假设为y)。那执行call dword ptr ss:[0]指令相当于以下操作:push cs,push ip,jmp dword ptr ss:[0]。即把cs先入栈,即ss:[0eh]字单元存放的是cs的值,即y。接着把ip的值即(x-1)入栈,存放在ss:[0ch]字单元处。然后是执行jmp dword ptr ss:[0] ,这条指令是把ss:[2]字单元的值赋值给cs,把ss:[0]字单元的值赋值给ip,所以这里cs=y,ip=x。故接下来程序跳转到s处继续执行。
mov ax,offset s这里offset s的值是从程序开始到s处的地址之差,也就是x了。这里一定要和转移时的偏移量区分开。
sub ax,ss:[0ch]是用ax的值减去ss:[och]字单元的值(x-1),因为ax的值是x,所以执行完这条指令后ax=0001。
mov bx,cx就是把cs的值个bx。所以这里bx=y
sub bx,ss:[0eh]是把bx的值减去ss:[0eh]的值(y)。所以执行完这条指令之后bx的值为0