免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3671 | 回复: 5
打印 上一主题 下一主题

jmp 16位-32位 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-03 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-18 11:18 |只看该作者 |倒序浏览
[SECTION .gdt]
; GDT
;                                         段基址,      段界限     , 属性
LABEL_GDT:                Descriptor               0,                0, 0                     ; 空描述符
LABEL_DESC_CODE32:        Descriptor               0, SegCode32Len - 1, DA_C + DA_32        ; 非一致代码段, 32
LABEL_DESC_VIDEO:        Descriptor         0B8000h,           0ffffh, DA_DRW                ; 显存首地址
; GDT 结束

GdtLen                equ        $ - LABEL_GDT        ; GDT长度
GdtPtr                dw        GdtLen - 1        ; GDT界限
                dd        0                ; GDT基地址

; GDT 选择子
SelectorCode32                equ        LABEL_DESC_CODE32        - LABEL_GDT
SelectorVideo                equ        LABEL_DESC_VIDEO        - LABEL_GDT
; END of [SECTION .gdt]

...
...
; 真正进入保护模式
        jmp        dword SelectorCode32:0        ; 执行这一句会把 SelectorCode32 装入 cs, 并跳转到 SelectorCode32:0  处
SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS        32]

LABEL_SEG_CODE32:

请问jmp跳向的一个地方明明是 LABEL_DESC_CODE32        - LABEL_GDT 的偏移量 怎么能跳到下面的LABEL_SEG_CODE32呢 难道说把选择子装入CS中会自动判断32位代码段 段基址?

论坛徽章:
0
2 [报告]
发表于 2007-06-18 11:44 |只看该作者
老兄啊,你的代码能读么?
没看清楚你的代码,剪点我从前写的吧

  1. #define R(x)    (x - KERNBASE)
  2.         /*
  3.          * We have not enable paging yet
  4.          * and $R(MPboot32) is too large for ljmp
  5.          */
  6.         ljmpl   $0x8, $R(MPboot32)

复制代码

$0x8是选择子

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-03 06:20:00
3 [报告]
发表于 2007-06-18 15:19 |只看该作者
org        0100h
        jmp        LABEL_BEGIN

[SECTION .gdt]
; GDT
;                                         段基址,      段界限     , 属性
LABEL_GDT:                Descriptor               0,                0, 0                     ; 空描述符
LABEL_DESC_CODE32:        Descriptor               0, SegCode32Len - 1, DA_C + DA_32        ; 非一致代码段, 32
LABEL_DESC_VIDEO:        Descriptor         0B8000h,           0ffffh, DA_DRW                ; 显存首地址
; GDT 结束

GdtLen                equ        $ - LABEL_GDT        ; GDT长度
GdtPtr                dw        GdtLen - 1        ; GDT界限
                dd        0                ; GDT基地址

; GDT 选择子
SelectorCode32                equ        LABEL_DESC_CODE32        - LABEL_GDT
SelectorVideo                equ        LABEL_DESC_VIDEO        - LABEL_GDT
; END of [SECTION .gdt]

[SECTION .s16]
[BITS        16]
LABEL_BEGIN:
        mov        ax, cs
        mov        ds, ax
        mov        es, ax
        mov        ss, ax
        mov        sp, 0100h

        ; 初始化 32 位代码段描述符
        xor        eax, eax
        mov        ax, cs
        shl        eax, 4
        add        eax, LABEL_SEG_CODE32
        mov        word [LABEL_DESC_CODE32 + 2], ax
        shr        eax, 16
        mov        byte [LABEL_DESC_CODE32 + 4], al
        mov        byte [LABEL_DESC_CODE32 + 7], ah

        ; 为加载 GDTR 作准备
        xor        eax, eax
        mov        ax, ds
        shl        eax, 4
        add        eax, LABEL_GDT                ; eax <- gdt 基地址
        mov        dword [GdtPtr + 2], eax        ; [GdtPtr + 2] <- gdt 基地址

        ; 加载 GDTR
        lgdt        [GdtPtr]

        ; 关中断
        cli

        ; 打开地址线A20
        in        al, 92h
        or        al, 00000010b
        out        92h, al

        ; 准备切换到保护模式
        mov        eax, cr0
        or        eax, 1
        mov        cr0, eax

        ; 真正进入保护模式
        jmp        dword SelectorCode32:0        ; 执行这一句会把 SelectorCode32 装入 cs, 并跳转到 Code32Selector:0  处
; END of [SECTION .s16]


[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS        32]

LABEL_SEG_CODE32:
        mov        ax, SelectorVideo
        mov        gs, ax                        ; 视频段选择子(目的)

        mov        edi, (80 * 10 + 0) * 2        ; 屏幕第 10 行, 第 0 列。
        mov        ah, 0Ch                        ; 0000: 黑底    1100: 红字
        mov        al, 'P'
        mov        [gs:edi], ax

        ; 到此停止
        jmp        $

SegCode32Len        equ        $ - LABEL_SEG_CODE32
; END of [SECTION .s32]

; 描述符
; usage: Descriptor Base, Limit, Attr
;        Base:  dd
;        Limit: dd (low 20 bits available)
;        Attr:  dw (lower 4 bits of higher byte are always 0)
%macro Descriptor 3
        dw        %2 & 0FFFFh                                ; 段界限 1                                (2 字节)
        dw        %1 & 0FFFFh                                ; 段基址 1                                (2 字节)
        db        (%1 >> 16) & 0FFh                        ; 段基址 2                                (1 字节)
        dw        ((%2 >> & 0F00h) | (%3 & 0F0FFh)        ; 属性 1 + 段界限 2 + 属性 2                (2 字节)
        db        (%1 >> 24) & 0FFh                        ; 段基址 3                                (1 字节)
%endmacro ; 共 8 字节

DA_32                EQU        4000h
DA_C                EQU        98h

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-03 06:20:00
4 [报告]
发表于 2007-06-18 15:24 |只看该作者
我把代码贴全吧
请问jmp跳向的一个地方明明是 LABEL_DESC_CODE32        - LABEL_GDT 的偏移量 怎么能跳到下面的LABEL_SEG_CODE32呢(偏移量和LABEL_SEG_CODE32地址应该不同啊) 难道说把选择子装入CS中会自动判断32位代码段 段基址?
  
还有     mov       ax, cs
        shl        eax, 4
        add        eax, LABEL_SEG_CODE32
        mov        word [LABEL_DESC_CODE32 + 2], ax
这四句什么作用

[ 本帖最后由 317316abcd 于 2007-6-18 15:26 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-06-19 23:08 |只看该作者
题外话,个人认为: nasm 的代码有些地方一点都不漂亮,对 nasm 的代码比较反感。


言归正传:GDT 在进入保护模式时候已经被设好了。其中就有 32 位代码的进入点。

>> jmp        dword SelectorCode32:0        ; 执行这一句会把 SelectorCode32 装入 cs, 并跳转到 SelectorCode32:0  处

SelectorCode32 就是一个选择子,在已经建立好的 GDT 中查找代码位置。
我对 nasm 的语法不熟悉,这应该是定义一个立即数。这个数字在 GDT 中的偏移就是正确代码进入点的描述符。

论坛徽章:
0
6 [报告]
发表于 2007-06-19 23:13 |只看该作者
原帖由 317316abcd 于 2007-6-18 15:24 发表于 4楼  
还有     mov       ax, cs
        shl        eax, 4
        add        eax, LABEL_SEG_CODE32
        mov        word [LABEL_DESC_CODE32 + 2], ax
这四句什么作用
...


这里只是将 XXXX:Y 形式转化为:  XXXXY 这种形式而已
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP