首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

不理解王爽汇编 10.1 ret 和 retf 求解答解决办法

2013-01-25 
不理解王爽汇编 10.1 ret 和 retf求解答就看下面这个例子吧 assume cs:code stack segmentdb 16 dup (0) s

不理解王爽汇编 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 吗?

热点排行