当前位置: 代码迷 >> 汇编语言 >> 不理解王爽汇编 10.1 ret 跟 retf 求解答
  详细解决方案

不理解王爽汇编 10.1 ret 跟 retf 求解答

热度:10111   发布时间:2013-02-26 00:00:00.0
不理解王爽汇编 10.1 ret 和 retf 求解答
就看下面这个例子吧 
assume cs:code 

stack segment 
  db 16 dup (0) 
stack ends 

code segment 

  mov ax,4c00h 
  int 21h  

start: mov ax,stack 
  mov ss,ax 
  mov sp,16 
  mov ax,0 
  push cs 
  push ax 
  mov bx,0 
  retf 
   
code ends 

end start 

debug 的结果为: 
C:\masm5>debug 10b.exe 
-r 
AX=0000 BX=0000 CX=0026 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 
DS=0B5A ES=0B5A SS=0B6A CS=0B6B IP=0005 NV UP EI PL NZ NA PO NC 
0B6B:0005 B86A0B MOV AX,0B6A 
-u 
0B6B:0005 B86A0B MOV AX,0B6A 
0B6B:0008 8ED0 MOV SS,AX 
0B6B:000A BC1000 MOV SP,0010 
0B6B:000D B80000 MOV AX,0000 
0B6B:0010 0E PUSH CS 
0B6B:0011 50 PUSH AX 
0B6B:0012 BB0000 MOV BX,0000 
0B6B:0015 CB RETF 
0B6B:0016 FF365607 PUSH [0756] 
0B6B:001A E821FC CALL FC3E 
0B6B:001D 83C402 ADD SP,+02 
0B6B:0020 FF065607 INC WORD PTR [0756] 
0B6B:0024 5E POP SI 
-t 

AX=0B6A BX=0000 CX=0026 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 
DS=0B5A ES=0B5A SS=0B6A CS=0B6B IP=0008 NV UP EI PL NZ NA PO NC 
0B6B:0008 8ED0 MOV SS,AX 
-t 

AX=0B6A BX=0000 CX=0026 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000 
DS=0B5A ES=0B5A SS=0B6A CS=0B6B IP=000D NV UP EI PL NZ NA PO NC 
0B6B:000D B80000 MOV AX,0000 
-t 

AX=0000 BX=0000 CX=0026 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000 
DS=0B5A ES=0B5A SS=0B6A CS=0B6B IP=0010 NV UP EI PL NZ NA PO NC 
0B6B:0010 0E PUSH CS 
-t 

AX=0000 BX=0000 CX=0026 DX=0000 SP=000E BP=0000 SI=0000 DI=0000 
DS=0B5A ES=0B5A SS=0B6A CS=0B6B IP=0011 NV UP EI PL NZ NA PO NC 
0B6B:0011 50 PUSH AX 
-t 

AX=0000 BX=0000 CX=0026 DX=0000 SP=000C BP=0000 SI=0000 DI=0000 
DS=0B5A ES=0B5A SS=0B6A CS=0B6B IP=0012 NV UP EI PL NZ NA PO NC 
0B6B:0012 BB0000 MOV BX,0000 
-t 

AX=0000 BX=0000 CX=0026 DX=0000 SP=000C BP=0000 SI=0000 DI=0000 
DS=0B5A ES=0B5A SS=0B6A CS=0B6B IP=0015 NV UP EI PL NZ NA PO NC 
0B6B:0015 CB RETF 
-t 

AX=0000 BX=0000 CX=0026 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000 
DS=0B5A ES=0B5A SS=0B6A CS=0B6B IP=0000 NV UP EI PL NZ NA PO NC 
0B6B:0000 B8004C MOV AX,4C00 

根据 retf 的公式 计算 : 
ip= 0B6A*16+000C=0B6AC 
SP = SP+2 = 000C+2=000E 

CS = 0B6A*16+000E = 0B6AE 
SP = SP +2 = 000E+2 =0010 
CS:IP最后怎么会指向 0B6B:0 

请问我这样理解哪里 错了?

------解决方案--------------------------------------------------------
retf 是将 ss:sp 指向的栈顶的 dword 作为远地址进行跳转。你上面的 ip/cs 的计算,算是的相应的栈中的内存地址,不是所应赋予 ip/cs 的内容;即跳转后的 cs 在内存 [0B6AE] 的 word 中而 ip 则是在 [0B6AC] 的 word 中;具体的内容则是刚才压栈的 CS 和 AX ,刚才压栈时 CS 和 AX 分别是什么内容?不就是 0B6B:0000 吗?