最近在看《x86汇编从实模式到保护模式》里面有一段代码不是很理解,知道这边的汇编大大多,过来讨教!
直接代码:
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段基本地址属于动态分配的,感觉凌乱了
需要大神帮我梳理下!
直接代码:
代码:
;建立程序堆栈段描述符
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
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段基本地址属于动态分配的,感觉凌乱了
需要大神帮我梳理下!