找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 65|回复: 0

第15章习题

[复制链接]

620

主题

336

回帖

1057

积分

管理员

积分
1057
发表于 2026-3-16 16:51:34 | 显示全部楼层 |阅读模式
第15章习题

在本章中,用户程序自己指定了栈空间。现在,修改内核程序和用户程序,用户程序不指定栈空间,由内核程序为用户程序动态分配4KB的栈空间。
答案:
首先,在源文件c15_core.asm中,删除467~470行,改为如下指令
  1.         mov ebx,4096     ;栈段的长度
  2.         mov ecx,ebx       ;实际需要申请的内存数量
  3.         call sys_routine_seg_sel:allocate_memory        ;ECX=分配的起始物理地址
  4.         mov eax,ecx        ;栈的基地址
  5.         dec ebx                ;得到栈界限
  6.         mov [edi+0x20],ebx        ;登记栈指针
复制代码
接下来,修改源文件c15_app.asm,程序头部中的栈段位置和栈段长度都改成0;去掉栈段的定义;将代码段中的
  1. mov esp,stack_end
复制代码
改成
  1. mov esp,[fs:stack_len]
复制代码

以下是修改后的c15_app.asm:

  1. ;===============================================================================
  2. SECTION header vstart=0

  3.          program_length   dd program_end          ;程序总长度#0x00

  4.          head_len         dd header_end           ;程序头部的长度#0x04

  5.          prgentry         dd start                ;程序入口#0x08
  6.          code_seg         dd section.code.start   ;代码段位置#0x0c
  7.          code_len         dd code_end             ;代码段长度#0x10

  8.          data_seg         dd section.data.start   ;数据段位置#0x14
  9.          data_len         dd data_end             ;数据段长度#0x18

  10.          stack_seg        dd 0                    ;栈段位置#0x1c
  11.          stack_len        dd 0                    ;栈段长度#0x20

  12. ;-------------------------------------------------------------------------------
  13.          ;符号地址检索表
  14.          salt_items       dd (header_end-salt)/256 ;#0x24

  15.          salt:                                     ;#0x28
  16.          PrintString      db  '@PrintString'
  17.                      times 256-($-PrintString) db 0

  18.          TerminateProgram db  '@TerminateProgram'
  19.                      times 256-($-TerminateProgram) db 0

  20.          ReadDiskData     db  '@ReadDiskData'
  21.                      times 256-($-ReadDiskData) db 0

  22. header_end:

  23. ;===============================================================================
  24. SECTION data vstart=0

  25.          buffer times 1024 db  0         ;缓冲区

  26.          message_1         db  0x0d,0x0a,0x0d,0x0a
  27.                            db  '**********User program is runing**********'
  28.                            db  0x0d,0x0a,0
  29.          message_2         db  '  Disk data:',0x0d,0x0a,0

  30. data_end:

  31. ;===============================================================================
  32.       [bits 32]
  33. ;===============================================================================
  34. SECTION code vstart=0

  35. start:
  36.          mov eax,ds
  37.          mov fs,eax

  38.          mov ss,[fs:stack_seg]
  39.          mov esp,[fs:stack_len]

  40.          mov ds,[fs:data_seg]

  41.          mov ebx,message_1
  42.          call far [fs:PrintString]

  43.          mov eax,100                         ;逻辑扇区号100
  44.          mov ebx,buffer                      ;缓冲区偏移地址
  45.          call far [fs:ReadDiskData]          ;段间调用

  46.          mov ebx,message_2
  47.          call far [fs:PrintString]

  48.          mov ebx,buffer
  49.          call far [fs:PrintString]           ;too.

  50.          jmp far [fs:TerminateProgram]       ;将控制权返回到系统

  51. code_end:

  52. ;===============================================================================
  53. SECTION trail
  54. ;-------------------------------------------------------------------------------
  55. program_end:
复制代码



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2026-3-30 18:21 , Processed in 0.226239 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表