linux操作系统分析实验一(汇编语言练习&&嵌入式汇编练习&&基于mykernel完成多进程的简单内核)

陈三县+SA18225041+原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 

Table of Contents

一、汇编语言练习

二、嵌入式汇编练习

三、基于mykernel完成多进程的简单内核

实验总结


一、汇编语言练习

实验要求:使⽤Example的c代码分别⽣成.cpp,.s,.o和 ELF可执⾏⽂件,并加载运⾏,分析.s汇编代码在CPU 上的执⾏过程 。通过实验解释单任务计算机是怎样⼯作的,并 在此基础上讨论分析多任务计算机是怎样⼯作的。 

1、GCC的编译过程

一般情况下,C程序的编译过程分为:预处理阶段;编译成汇编代码阶段;汇编代码汇编成目标代码阶段;将目标代码链接成可执行文件阶段。如下图所示:

1.1、预处理阶段

example.c源码如下:

        gcc后使用-E参数,输出的文件的后缀为.cpp。即:gcc -E -o example.cpp example.c

 

打开example.cpp,如下(代码太多无法显示完全):

通过与源代码进行对比,可以发现,所谓的预处理即是在进行编译的第一遍扫描(词法扫描和语法扫描)时,对以符号“#”开头的预处理命令进行翻译,这里面包括三类主要的处理:

*1、在调用宏的地方进行宏替换,即将宏名替换为所定义的相应的字符串;

*2、用实际值替代“define”的文本;

*3、将include包含的标题文件和头文件的具体的内容拷贝到相应的源代码中;

        经过上面三个任务过程,最终生成了.cpp预处理文件。预处理之后的.cpp文件,较之前的源文件在字节数上有很大的变化,这就是将stdio.h头文件的具体内容拷贝过来的结果。

1.2、编译成汇编代码阶段

1.2.1、可以使用-S参数说明生成汇编代码后停止工作,由.c源文件直接编译生成.s汇编文件;即 gcc -S -o example.s example.c

1.2.2、 可以使用-x参数说明根据指定的步骤进行工作,然后由cpp-output指明从预处理得到的文件,同时使用-S参数说明生成汇编代码后停止工作;即 gcc -x cpp-output -S -o example1.s example.cpp

 wc命令来对比一下两者字节大小上的区别:   其中,第一列表示相应文件中的行数,第二列表示相应文件中的单词数,第三列表示相应文件中的字节数。

打开文件发现两者内容一致:

1.3、编译生成目标代码文件阶段 

1.3.1、可以使用-c参数,直接由.c源文件编译生成目标文件;即 gcc -c example.c -o example.o

1.3.2、 可以使用-x参数说明根据指定的步骤进行工作,然后由assembler指明由汇编文件生成相应的文件,同时使用-c参数说明生成目标文件后停止;即 gcc -x assembler -c example.s -o example.o

1.4、 链接生成可执行文件, 链接阶段主要是将各个.o目标文件链接起来,形成具体的可执行文件

1.4.1、使用-o参数,直接由.c源文件编译链接生成可执行文件;

1.4.2  使用-o参数,由.o目标文件链接生成可执行文件

 

2、分析汇编程序在CPU上的执行过程

执行反汇编命令如下:

 得到如下代码:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华中科技大学汇编实验 源代码及实验报告 2.1 任务1. 《80X86汇编语言程序设计》教材中 P31的 1.14题。 要求: (1) 直接在TD中输入指令,完成两个数的求和、求差的功能。求和/差后的结果放在(AH)中。 (2) 请事先指出执行指令后(AH)、标志位 SF、OF、CF、ZF的内容。 (3) 记录上机执行后的结果,与(2)中对应的内容比较。 (4)求差运算中,若将A、B视为有符号数,且A>B, 标志位有何特点? 若将A、B视为无符号数,且A>B, 标志位又有何特点? 2.2 任务2. 《80X86汇编语言程序设计》教材中 P45的 2.3题。 要求: (1)分别记录执行到“MOV CX,10”和“INT 21H”之前的(BX), (BP),(SI),(DI)各是多少。 (2)记录程序执行到退出之前数据段开始40个字节的内容,指出程序运行结果是否与设想的一致。 (3)在标号LOPA前加上一段程序,实现新的功能:先显示提示信息“Press any key to begin!”, 然后,在按了一个键之后继续执行LOPA处的程序。 2.3 任务3. 《80X86汇编语言程序设计》教材中 P45的 2.4题的改写。 要求: (1) 实现的功能不变,对数据段中变量访问时所用到的寻址方中的寄存器改成32位寄存器。 (2) 内存单元中数据的访问采用变址寻址方。 (3) 记录程序执行到退出之前数据段开始40个字节的内容,检查程序运行结果是否与设想的一致。 (4)在TD代码窗口中观察并记录机器指令代码在内存中的存放形,并与TD中提供的反汇编语句及自己编写的源程序语句进行对照,也与任务2做对比。(相似语句记录一条即可,重点理解机器码与汇编语句的对应关系,尤其注意操作数寻址方的形)。 (5)观察连续存放的二进制串在反汇编汇编语言语句时,从不同字节位置开始反汇编,结果怎样?理解 IP/EIP指明指令起始位置的重要性。 2.4 设计实现一个学生成绩查询的程序。 1、实验背景 在以BUF为首址的字节数据存储区中,存放着n个学生的课程成绩表(百分制),每个学生的相关信息包括:姓名(占10个字节,结束符为数值0),语文成绩(1个字节),数学成绩(1个字节),英语成绩(1个字节),平均成绩(1个字节)。 2、功能一:提示并输入待查询成绩的学生姓名 (1)使用9号DOS系统功能调用,提示用户输入学生姓名。 (2)使用10号DOS系统功能调用,输入学生姓名。输入的姓名字符串放在以in_name为首址的存储区中。 (3)若只是输入了回车,则回到“(1)”处重新提示与输入;若仅仅输入字符q,则程序退出,否则,准备进入下一步处理。 3、功能二:以学生姓名查询有无该学生 (1)使用循环程序结构,在成绩表中查找该学生。 (2)若未找到,就提示用户该学生不存在,并回到“功能一(1)”的位置,提示并重新输入姓名。 (3)若找到,则将该学生课程成绩表的起始偏移地址保存到POIN字变量中。 4、功能三:计算所有学生的平均成绩 使用算数运算相关指令计算并保存每一个学生的平均成绩。 平均成绩计算公:(A*2+B+C/2)/3.5,即将语文成绩A乘以权重2、英语成绩C除以权重2后,与数学成绩B一起求和,再计算该生的平均成绩。要求避免溢出。 5、功能四:将功能二查到的学生的平均成绩进行等级判断,并显示判断结果。 (1)平均成绩等级显示方:若平均成绩大于等于90分,显示“A”;大于等于80分,显示“B”;大于等于70分,显示“C”;大于等于60分,显示“D”;小于60分,显示“F”。 提示:使用分支程序结构,采用2号DOS系统功能调用显示结果。 (2)使用转移指令回到“功能一(1)”处(提示并输入姓名)
### 回答1: 要手动添加内核,您可以按照以下步骤: 1. 打开终端并激活您的虚拟环境(如果有的话)。 2. 安装 'ipykernel' 包。您可以使用以下命令: ``` pip install ipykernel ``` 3. 在终端中运行以下命令来添加内核: ``` python -m ipykernel install --user --name=myenv --display-name=myenv ``` 其中 'myenv' 是您想要添加的内核的名称。您可以将其更改为自己的虚拟环境名称。 4. 打开 Jupyter Notebook 并在 'Kernel' 菜单中选择 'Change kernel'。您应该能够看到您刚刚添加的内核。 5. 选择该内核并开始使用它。 希望这可以帮助您手动添加内核到 Jupyter Notebook 中。 ### 回答2: 在Jupyter中手动添加内核的方法如下: 1. 首先,您需要安装所需的内核内核是Jupyter能够运行和管理的特定编程语言环境。例如,如果您想添加Python内核,您需要确保您已经安装了Python解释器。 2. 打开终端或命令提示符,并运行以下命令安装所需的内核。例如,如果您想要添加Python 3内核,您可以运行命令`pip install ipykernel`。 3. 安装完成后,您需要将内核注册到Jupyter中。运行以下命令: ``` python -m ipykernel install --user --name=<kernel_name> ``` 请将`<kernel_name>`替换为您想要为内核指定的名称。例如,如果您想要添加Python 3内核,并将其命名为"mykernel",则您可以运行`python -m ipykernel install --user --name=mykernel`。 4. 完成以上步骤后,您可以重新启动Jupyter Notebook。在Notebook界面中,您将能够看到一个下拉菜单,其中包含所有已注册的内核。选择您刚刚添加的内核,然后开始编写代码和运行笔记本。 这就是手动添加内核的方法。请记住,您需要确保已正确安装内核,并按照指定的方将其注册到Jupyter中,这样才能成功使用它。 ### 回答3: 要手动在Jupyter中添加内核,需要按照以下步骤操作: 1. 确保已经安装好了要添加的内核。通常情况下,内核是由Python环境或其他编程语言的解释器提供的。你可以通过`pip`或其他包管理工具来安装这些内核。 2. 打开命令行工具,输入以下命令来安装Jupyter内核管理器:`pip install jupyter_kernel_mgmt` 3. 安装完内核管理器后,再次在命令行中输入以下命令来添加内核:`python -m jupyter_kernel_mgmt install` 4. 这将会在Jupyter中创建一个配置文件,用于管理内核。你可以通过`jupyter-kernelspec list`命令来查看已安装的内核。 5. 找到你想要添加的内核的路径。通常情况下,内核的路径在你的Python环境或其他编程语言的安装目录下。 6. 通过使用`jupyter-kernelspec install`命令,将该路径添加到内核管理器中。例如,如果你要添加Python内核,可以使用以下命令:`jupyter-kernelspec install --user --name=python --display-name="Python 3" --replace /path/to/your/python/kernel` 7. 替换`/path/to/your/python/kernel`为你要添加的内核的路径。`--name`参数指定了内核的名称,`--display-name`参数指定了在Jupyter中显示的名称。 8. 完成上述步骤后,重新启动Jupyter Notebook。你应该能够在内核菜单中看到你添加的内核选项。 通过以上步骤,你就可以手动添加内核到Jupyter中了。不过,这些步骤可能因为不同的操作系统有所不同,所以请根据你的操作系统和需要添加的内核类型进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值