您的位置:首页 > 编程语言

第13章 程序的动态加载和执行(二,用户代码)

2017-10-25 21:46 232 查看
弄清楚两个问题,这段应用代码就容易读懂了:

1,核心代码是如何把指针指到这里的;

2,这段代码是如何使用内存的;

读这个代码的时候,可以类比我们平时写的练习小程序,以C程序为例,我们首先是定义了一些数组、结构体等数据结构,然后在main函数中调用printf把它们打印出来,因为定义了数据结构所以下面才能知道在哪一块内存上工作,因为#include<stdio.h> 了所以可以使用printf,同样下面用汇编写的应用程序也逃不出这个套路。在程序真正开始之前先啰里啰嗦的准备一些事情,譬如“这个程序要在哪个数据区里,哪个栈区里”,“要用到哪些例程”,因为没有链接器,还要写一个头部说明之类的东西,以便在操作系统加载应用程序时看到头部说明就知道该怎样为这个应用程序准备资源了。

代码如下:

;代码清单13-3
;文件名:c13.asm
;文件说明:用户程序
;创建日期:2011-10-30 15:19

;===============================================================================
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:

;===============================================================================
SECTION data vstart=0

buffer times 1024 db  0         ;缓冲区

message_1         db  0x0d,0x0a,0x0d,0x0a
db  '**********User program is runing**********'
db  0x0d,0x0a,0
message_2         db  '  Disk data:',0x0d,0x0a,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_1
call far [fs:PrintString]

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

mov ebx,message_2
call far [fs:PrintString]

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

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

code_end:

;===============================================================================
SECTION trail
;-------------------------------------------------------------------------------
program_end:


实验现象:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐