;程序头部开始
;========================================================
0x0: 用户程序总大小 4字节
0x4: 头部大小 4字节
0x8: 用户栈选择子 4字节 栈由内核进行分配,回填选择子到此处
0xc: 用户需要的栈大小 4字节 1表示4KB 2表示8KB
0x10: 用户程序入口点的起始偏移 4字节 32位的起始偏移
0x14: 用户程序代码段起始汇编地址 4字节 ,内核加核用户程序以后,回填代码段选择子到此处
0x18: 用户代码段大小,以字节为单位 4字节
0x1c: 用户数据段的起始汇编地址 4字节 内核加载用户程序以后,回填数据段选择子到此处
0x20: 用户数据段大小 4字节
0x24: SALT表(符号-地址检索表)的大小 4字节
0x28: SALT表开始 (每个表项最大256字节,不足256字节用0填充)
;头部结束
;=======================================================
数据段
;=======================================================
代码段
;程序结束
练习源代码:
section header vstart=0
;========================================
user_length dd program_end ;用户程序总长度
header_length dd header_end ;头部长度
stack_seg dd 0 ;栈选择子
stack_length dd 2 ;栈建议大小
entry dd start ;入口点的偏移地址
code_seg dd section.code.start ;代码段选择子
code_length dd code_end ;代码段长度
data_seg dd section.data.start ;数据段选择子
data_length dd data_end ;数据段长度
salt_length dd (header_end-salt)/256
salt:
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:
;==========================================
section data vstart=0
buffer times 1024 db 0
message db 0xd,0xa,' user program running!',0xd,0xa,'Disk data: ',0xd,0xa,0
data_end:
;============================================
[bits 32]
section code vstart=0
start:
mov eax,ds
mov fs,eax
mov eax,[stack_seg]
mov ss,eax
mov esp,0
mov eax,[data_seg]
mov ds,eax
mov ebx,message
call far [fs:PrintString]
mov eax,100
mov ebx,buffer
call far [fs:ReadDiskData]
mov ebx,buffer
call far [fs:PrintString]
jmp far [fs:TerminateProgram]
code_end:
section trail
program_end:
评论