关于应用程序头部信息
在launcher.asm的应用程序中,可以看到头部信息如下:
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd 0x100000 ; memory for app
dd 0x7fff0 ; esp
dd 0x0 , 0x0 ; I_Param , I_Icon
这些信息都是非常有用的,那么如何获取这些信息呢?launcher.asm调用了syscall_startapp, 而syscall_startapp调用了sys32.inc中的start_application_fl过程(3027行)。
start_application_fl过程将文件加载到了0x9000处,在memmap.inc文件中0x90000-0x9FFFF显示为tmp,意思为临时使用的地方。在start_application_fl中识别头部以后,就调用了get_app_params过程(3060行)。
在get_app_params过程中,如果是01,则执行如下部分:
mov eax,[0x90000+12]
mov [app_start],eax
mov eax,[0x90000+16]
mov [app_i_end],eax
mov eax,[0x90000+20]
mov [app_mem],eax
mov eax,[0x90000+24]
mov [app_esp],eax
mov eax,[0x90000+28]
mov [app_i_param],eax
mov eax,[0x90000+32]
mov [app_i_icon],eax
这样,在3243-3248行的内容就有了数据,获取了应用程序的头部信息。
等等,用launcher加载桌面背景,桌面图标和底部任务栏时都带了BOOT参数怎么设置的呢?可以肯定在内存中的应用程序用到的参数应该是BOOT呀。
把上述代码中的一下两行注释掉,看看效果:
;mov eax,[0x90000+28]
;mov [app_i_param],eax
没有效果,而且还有点怪异现象,看来不是在这里设置的。
再往下走就到了add_app_parameters过程了。当初在这里曾经做过实验,开始直接跳到no_app_params处,桌面显示的是不带BOOT参数的情况。在add_app_parameters
过程起始处到no_app_params之间,有一个标签显示的是app_new_param,难道是这里?注释掉从app_new_param开始的四行:
;app_new_param:
; cmp [esi],byte 0
; jz no_app_params
; movsb
; loop app_new_param
重新编译kernel.asm,命令行: fasm e:\menuet32\k086b\kernel.asm e:\menuet32\k086b\kernel.mnt, 用ultraISO写入磁盘文件。
不注释这四行,桌面正常显示,注释掉这四行,显示出来的如同不带BOOT参数一样,注释掉,如下:

注释掉的四行就把BOOT参数带入了?有意思!!!
在app_new_param前几行,为什么清除256个字节,赋值为0呢?
难道I_Param是指针,指向了参数区!!!
在iconmngr.asm文件中,还真是如此,在文件最后定义了:
I_Param:
times 256 db 0
nop
在jpegview.asm中,则比较复杂,先定义了一个大的内存,然后保留1024个字节作为存储参数的区域。在mpanel.asm中则为0
这样好像就解释通了,唯一要说明是的参数是ebx带过来的,先push ebx, 然后push eax, 所以通过mov esi,[esp+4] 把参数取出来,然后传给I_Param地址处。
浙公网安备 33010602011771号