+ -
当前位置:首页 → 问答吧 → 保护模式下,段间调用一定要用调用门吗?

保护模式下,段间调用一定要用调用门吗?

时间:2011-04-17

来源:互联网

我没有用调用门,程序只是在保护模式下去调用另一个代码段,可是电脑老是重启,
请看:
;先定义16位偏移的段间调用宏定义
call16 macro selector,offsetv
  db 9ah ;操作码
dw offsetv ;16位偏移
  dw selector ;段值或选择子
  endm
;然后在GDT定义一个代码段
dseg segment use16 ;16位段
gdt label byte ;全局描述符表gdt
dummy descriptor <> ;空描述符
....

codes descriptor <0ffffh,,,92h,>
codes_sel =codes-gdt ;sub-program
....
dseg ends

;子程序代码段
cseg1 segment use16
  assume cs:cseg1
dspmsg:
  ;我这里什么都没有写,只有一个返回指令
  ret
cseg1 ends
;然后在主程序中设置该子程序代码段描述符
  mov bx,16
  mov ax,cseg1
  mul bx
  mov codes.basel,ax ;代码段开始偏移为0
  mov codes.basem,dl ;代码段界限已在定义时设置妥当
  mov codes.baseh,dh  
;然后在保护模式中
  call16 codes_sel,dspmsg

可是机器老是重启,请问错在哪?

作者: leetow2003   发布时间: 2011-04-17

32位模式下9a用32位偏移
call16 macro selector,offsetv
  db 9ah ;操作码
dd offsetv ;32位偏移
  dw selector ;段值或选择子
  endm

作者: Lactoferrin   发布时间: 2011-04-17

那16位用什么操作码?

作者: leetow2003   发布时间: 2011-04-17

那16位用什么操作码?
9a

作者: Lactoferrin   发布时间: 2011-04-17

是呀,我就是用9aH的,可是不行。
请问:我这种方法不用调用门可以吗?

作者: leetow2003   发布时间: 2011-04-17

32位模式下,9a默认用32位偏移,如果要用16位偏移,在9a前面加一个66h操作数覆盖前缀

如果目标代码段的特权级和当前代码段的特权级相同,就不需要调用门

作者: Lactoferrin   发布时间: 2011-04-17