在Launcher.asm调用launch_applications中,加载了3个应用,一个是桌面背景jpegview.asm,一个是桌面图标ICONMNGR,还有一个是底部任务栏Mpanel。
其中第三个参数是延时作用,这个参数在加载3个应用的过程中使用。在调用move eax,19, int 0x40时,仅仅送入了应用名称和第二个参数“BOOT”。
把延时部分注释掉,开机时的滚动条很短时间内就消失了。使用了延时后,看上去,就“好像”等待桌面加载完成后才消失。
参数是如何使用的呢?在应用中的头部中有参数的位置。例如,在Jpegview.asm中头部如下:
use32
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd memsize ; memory for app
dd memsize - 1024 ; esp
dd PARAMS , 0x0 ; I_Param , I_Icon
头部中最后一行就是放置参数和icon的地方。
launch_applications调用了19号中断。在sys32.inc中第745行可以看到对应的调用过程是syscall_startapp。
在kernel.asm中第8980行可以查到这个调用。这个调用又调用了sys32.inc中start_application_fl。而这个过程调用了同样在sys32.inc中start_app_c。
start_app_c调用了add_app_parameters,在sys32.inc中的3374行。
把开始的两句注释掉,换成jmp no_app_params,也就是说,没有参数,看看开始是什么情况。
命令行编译:fasm e:\menuet32\k086b\kernel.asm e:\menuet32\k086b\kernel.mnt
注意编译后的文件后缀为.mnt。
没有了参数boot,jpegview.asm就变成了窗口。桌面图标怎么变成了这样?
看了一下iconmngr.asm中的文件,也有检查参数,并且也有关于BOOT参数的判断:
check_parameters:
cmp [I_Param],dword 'BOOT'
je chpl1
ret
chpl1:
mov eax,21
jmp apply_changes
看来这个程序编得很紧凑。
现在可以看到,1.送入BOOT参数,jpegview.asm画出了桌面背景,然后退出;不送入参数,则在打开一个加载了图片的窗口。
2.送入BOOT参数,ICONMNGR画出桌面分布的图标。不送入参数,则打开设置桌面图标的窗口。
3.送入BOOT参数,Mpanel画出底部任务栏,由弹出菜单。不送入参数,仅画出底部任务栏,鼠标点击没有弹出菜单。
在此处取消参数检测,影响还是比较大的。
标签:调用,桌面,Menuetos32,dd,BOOT,参数,送入,asm,加载 From: https://www.cnblogs.com/menuetos32/p/16595390.html