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

wjp9981 2012-10-19 04:08:24
就看下面这个例子吧
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

请问我这样理解哪里 错了?
...全文
168 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjp9981 2012-10-19
  • 打赏
  • 举报
回复
谢谢高手 的回答。
zara 2012-10-19
  • 打赏
  • 举报
回复
retf 是将 ss:sp 指向的栈顶的 dword 作为远地址进行跳转。你上面的 ip/cs 的计算,算是的相应的栈中的内存地址,不是所应赋予 ip/cs 的内容;即跳转后的 cs 在内存 [0B6AE] 的 word 中而 ip 则是在 [0B6AC] 的 word 中;具体的内容则是刚才压栈的 CS 和 AX ,刚才压栈时 CS 和 AX 分别是什么内容?不就是 0B6B:0000 吗?

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧