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

弄清楚两个问题,这段应用代码就容易读懂了:

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

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

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


代码如下:

         ;代码清单13-3;文件名:c13.asm;文件说明:用户程序 ;创建日期:2011-10-30 15:19   ;===============================================================================
SECTION header vstart=0program_length   dd program_end          ;程序总长度#0x00head_len         dd header_end           ;程序头部的长度#0x04stack_seg        dd 0                    ;用于接收堆栈段选择子#0x08stack_len        dd 1                    ;程序建议的堆栈大小#0x0c;以4KB为单位prgentry         dd start                ;程序入口#0x10 code_seg         dd section.code.start   ;代码段位置#0x14code_len         dd code_end             ;代码段长度#0x18data_seg         dd section.data.start   ;数据段位置#0x1cdata_len         dd data_end             ;数据段长度#0x20;-------------------------------------------------------------------------------;符号地址检索表salt_items       dd (header_end-salt)/256 ;#0x24salt:                                     ;#0x28PrintString      db  '@PrintString'times 256-($-PrintString) db 0TerminateProgram db  '@TerminateProgram'times 256-($-TerminateProgram) db 0ReadDiskData     db  '@ReadDiskData'times 256-($-ReadDiskData) db 0header_end:;===============================================================================
SECTION data vstart=0    buffer times 1024 db  0         ;缓冲区message_1         db  0x0d,0x0a,0x0d,0x0adb  '**********User program is runing**********'db  0x0d,0x0a,0message_2         db  '  Disk data:',0x0d,0x0a,0data_end:;===============================================================================[bits 32]
;===============================================================================
SECTION code vstart=0
start:mov eax,dsmov fs,eaxmov eax,[stack_seg]mov ss,eaxmov esp,0mov eax,[data_seg]mov ds,eaxmov ebx,message_1call far [fs:PrintString]mov eax,100                         ;逻辑扇区号100mov ebx,buffer                      ;缓冲区偏移地址call far [fs:ReadDiskData]          ;段间调用mov ebx,message_2call far [fs:PrintString]mov ebx,buffer call far [fs:PrintString]           ;too.jmp far [fs:TerminateProgram]       ;将控制权返回到系统 code_end:;===============================================================================
SECTION trail
;-------------------------------------------------------------------------------
program_end:



实验现象:










本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【雷军】给程序员的五点建议--如何成为编程高手并以此创业

除非特别注明&#xff0c;鸡啄米文章均为原创转载请标明本文地址&#xff1a;http://www.jizhuomi.com/career/286.html写在前面&#xff1a;此篇文章出自雷军之手&#xff0c;是他为软件开发2.0技术大会准备的演讲稿&#xff0c;但由于某些原因没有派上用场。这里跟大家分享下…

计算机网络重要机制(一)可靠数据传输

操作系统&#xff0c;计算机网络都属于计算机系统&#xff0c;为了使得整个系统运行起来&#xff0c;人们根据当时的硬件条件和理论认识设计了各种的算法&#xff08;也可以叫机制&#xff09;&#xff0c;这些机制有些被抛弃&#xff0c;有些被进化。所以操作系统、计算机网络…

命名空间和作用域

一&#xff0c;namespace namespace是名字到对象的映射&#xff0c;python里面的大部分命名空间由字典实现。如果有性能问题&#xff0c;会更改。 命名空间的举例 •存放内置函数的集合&#xff08;abs()这种函数&#xff0c;和内建的异常&#xff09; •模块中的全局名称 •函…

python类

一&#xff0c;类 1&#xff0c;类是摸板&#xff0c;里面有组合数据&#xff0c;实现功能的方法。 2&#xff0c;类里面有可以改变自身的方法__init__函数 3&#xff0c;类和模块类似&#xff0c;运行时创建&#xff0c;创建后修改 4&#xff0c;类成员通常是public&#xff…

Web Form要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。”的解决办法。...

1.先将aspnet.scriptmanager.jquery.dl 复制到bin (网站根目录下的bin文件夹找不到&#xff0c;看看下面的图片中点击[显示所有文档]) 文件夹下。 2.在网站根目录下scripts文件夹,向里边添加jquery-1.7.2.min.js和jquery-1.7.2.js(可根据自己需要使用不同的版本&#xff09;…

python继承多重继承

一&#xff0c;基本语法 class MyClass(BaseClass):def __init__(self):print(...)class MyDefineClass(object):def __init__(self):print(继承自object类)MyDefineClass.__init__(None) # 属性访问 me MyDefineClass() # 实例对象 继承自object类 继承自object类 二&#x…

Windows XP系统安装SQL Server 2005(开发版)图解

转自Windows XP系统安装SQL Server 2005(开发版)图解 安装前提:由于有些从网上的下载的项目需要导入SQL Server 2005的数据文件&#xff0c;因此&#xff0c;今天便安装了这个数据库&#xff0c;我的系统中已经安装了SQL Server2000所以是在它之上安装SQL Server2005的。 一、数…

用turtle画各种各样的数学图形

ps&#xff0c;用turtle导入小海龟来画图。画图代码都要导入海龟库哦&#xff0c;见下面第一行。 import turtle as t直线 # 画直线 def draw_line():pen t.Pen()pen.fd(200) # 直线默认水平方向 draw_line() 画正方形 def draw_square():pen t.Pen()for i in range(4): …

实验3 系统调用

系统调用 实验目的 建立对系统调用接口的深入认识掌握系统调用的基本过程能完成系统调用的全面控制为后续实验做准备 实验内容 此次实验的基本内容是&#xff1a;在Linux 0.11上添加两个系统调用&#xff0c;并编写两个简单的应用程序测试它们。 iam() 第一个系统调用是iam()&a…

python标准库(一)

操作系统接口os 切换目录 >>> import os>>> os.getcwd() # 得到当前工作目录C:\\Users>>> os.chdir(F:\\) # 切换工作目录到F盘>>> os.system(mkdir tody) # 在f盘创建一个叫tody的文件夹0import os 与 from os import * &#xff0c;要…

python标准库(二)

格式化输出 reprlib 库用来格式化 >>> import reprlib >>> reprlib.repr(set(aabbccddeeeff)) "{a, b, c, d, e, f}" >>>对集合能排序 >>> reprlib.repr(set(fdajfejaa)) "{a, d, e, f, j}" >>>pprint库用…

实验4 进程运行轨迹的跟踪与统计

进程运行轨迹的跟踪与统计 难度系数&#xff1a;★★★☆☆ 实验目的 掌握Linux下的多进程编程技术&#xff1b;通过对进程运行轨迹的跟踪来形象化进程的概念&#xff1b;在进程运行轨迹跟踪的基础上进行相应的数据统计&#xff0c;从而能对进程调度算法进行实际的量化评价&…

虚拟环境创建,pip管理包

windows10虚拟环境的创建&#xff0c;pip管理包1.虚拟环境的创建1.1 为什么要创建虚拟环境1.2 创建虚拟环境1.3 激活虚拟环境1.3.1 激活方式1.3.2 检查是否创建成功2.用pip管理包2.1 pip的基本使用2.2 pip创建安装的文件requirements.txt2.3 安装包对应的版本2.4 用pip - r ins…

vi文字处理器

http://blog.csdn.net/wangloveall/article/details/22649331 摘要&#xff1a;vi是类UNIX命令行接口的标准文字处理软件&#xff0c;也是进行shell脚本程序编写与服务器设置的非常重要的工具。本文介绍vi文字处理器&#xff0c;包括vi简介、vi怎么使用、vi的加强版vim。 关键词…

用numpy,matplotlib库画笛卡尔爱心曲线

1650年&#xff0c;斯德哥尔摩的街头&#xff0c;52岁的笛卡尔邂逅了18岁的瑞典公主克里斯汀。   那时&#xff0c;落魄、一文不名的笛卡尔过着乞讨的生活&#xff0c;全部的财产只有身上穿的破破烂烂的衣服和随身所带的几本数学书籍。生性清高的笛卡尔从来不开口请求路人施舍…

centos7虚拟机共享本机磁盘的方法

说明&#xff1a;这个方法不一定是通用的&#xff0c;也可能不是最快捷的&#xff0c;但是感觉比较稳妥的办法。 1&#xff0c;首先坚持两个进程是否启动&#xff1a;右击&#xff1a;我的电脑-管理-服务&#xff0c;检查server服务和Workstation服务是否启动。如果没有启动&a…

服务器小程序servlet的使用

servlet的创建使用一&#xff0c;三种创建方式1.1 实现servlet接口1.2 继承GenericServlet1.3 继承HttpServlet二&#xff0c;servlet使用2.1 web.xml文件的配置2.1.1 创建xml文件2.1.2 手写web.xml文件2.2 在8080端口下访问2.2.1 servlet的生命周期servlet是服务器小程序。是个…

el表达式,c标签的使用

el表达式的使用 学生类 public class Student {int id;String name;String sex;String birth;public Student() {}public Student(int id, String name, String sex, String birth) {super();this.id id;this.name name;this.sex sex;this.birth birth;}// el 表达式取实…