Quantcast
Channel: 看雪安全论坛
Viewing all articles
Browse latest Browse all 9556

【求助】(代码片段)汇编,保护模式段界限疑惑

$
0
0
最近在看《x86汇编从实模式到保护模式》里面有一段代码不是很理解,知道这边的汇编大大多,过来讨教!
直接代码:
代码:

        ;建立程序堆栈段描述符
        mov ecx,[edi+0x0c]                ;4KB的倍率
        mov ebx,0x000fffff                            ;@1
        sub ebx,ecx                        ;得到段界限;@2
        mov eax,4096                                  ;@3
        mul dword [edi+0x0c]                          ;@4
        mov ecx,eax                        ;准备为堆栈分配内存  ;@5
        call sys_routine_seg_sel:allocate_memory
        add eax,ecx                        ;得到堆栈的高端物理地址 ;@6
        mov ecx,0x00c09600                ;4KB粒度的堆栈段描述符  ; @7
        call sys_routine_seg_sel:make_seg_descriptor            ;@8
        call sys_routine_seg_sel:set_up_gdt_descriptor
        mov [edi+0x08],cx

ps:@8行, make_seg_descriptor例程描述如下
make_seg_descriptor: ;构造存储器和系统的段描述符
;输入:EAX=线性基地址
; EBX=段界限
; ECX=属性。各属性位都在原始
; 位置,无关的位清零
;返回:EDX:EAX=描述符
问题如下:
eax += ecx, 最后形成堆栈段的段基地址,这个没有问题
问题在ebx,ebx的初始值为 ebx = 0x000fffff ,因为粒度为4kb,
所以ebx = 0x000fffff * 0x1000 = 0xffffffff = 4GB
ebx -= ecx => 假设ecx为2, 0x000ffffd * 0x1000 = 0xffffd000
这个时候ebx为段界限, eax段基本地址属于动态分配的,感觉凌乱了
需要大神帮我梳理下!

Viewing all articles
Browse latest Browse all 9556

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>