进入保护模式(四)设置一些公用的方法
一、下雨
最近一直在下雨,对于这样的天气真是厌烦,但也没办法,是不?夏天到是期盼,可以降温,这个季节太冷。
这算是第三次拿起这本书,希望在年前能够看完。
最近除去工作也算很忙,上下班路上看看文学小说,还有就是这个第三次打算看完的书。因为地点是在有点远,玩个游戏手机电池经不住,所以就这样了;看这本书是因为这次算是有督促,所以这次不想中途放弃。
二、言归正传
第三次看的技术书是《x86实模式到保护模式》,希望这次能够看完。当然是抄书了,不知道什么时候养的习惯
书中介绍的如何调用系统API的一个实现。
在保护模式中想要访问代码,就要知道 选择子+偏移量 这个就是目的地的地址,不然怎么坐车都不知道
下面是一个程序的头部,在头部偏移0x28的地方有个表,记录的是当前程序要用到的系统提供的函数
函数名的长度是256个字节
;===============================================================================
SECTION header vstart=0
program_length dd program_end ;程序总长度#0x00
head_len dd header_end ;程序头部的长度#0x04
stack_seg dd 0 ;用于接收堆栈段选择子#0x08
stack_len dd 1 ;程序建议的堆栈大小#0x0c
;以4KB为单位
prgentry dd start ;程序入口#0x10
code_seg dd section.code.start ;代码段位置#0x14
code_len dd code_end ;代码段长度#0x18
data_seg dd section.data.start ;数据段位置#0x1c
data_len dd data_end ;数据段长度#0x20
;-------------------------------------------------------------------------------
;符号地址检索表
salt_items dd (header_end-salt)/256 ;#0x24
salt: ;#0x28
PrintString db '@PrintString'
times 256-($-PrintString) db 0
TerminateProgram db '@TerminateProgram'
times 256-($-TerminateProgram) db 0
ReadDiskData db '@ReadDiskData'
times 256-($-ReadDiskData) db 0
header_end:
在系统中也有个表记录的是 系统提供的函数名、偏移量、选择子
当加载程序的时候就在这个表中匹配字符串
把加载的程序名用偏移量+选择子替换掉了,那么程序就可以飞了
参数传递要么寄存器、要么共有的堆栈了
;符号地址检索表
salt:
salt_1 db '@PrintString'
times 256-($-salt_1) db 0
dd put_string
dw sys_routine_seg_sel
salt_2 db '@ReadDiskData'
times 256-($-salt_2) db 0
dd read_hard_disk_0
dw sys_routine_seg_sel
salt_3 db '@PrintDwordAsHexString'
times 256-($-salt_3) db 0
dd put_hex_dword
dw sys_routine_seg_sel
salt_4 db '@TerminateProgram'
times 256-($-salt_4) db 0
dd return_point
dw core_code_seg_sel
salt_item_len equ $-salt_4
salt_items equ ($-salt)/salt_item_len
转载于:https://my.oschina.net/findurl/blog/185412
上一篇: 函数的返回值
下一篇: PHP二分查找(折半查找!)
推荐阅读