2019-2020-1 20199315《Linux内核原理与分析》第二周作业

2019-2020-1 20199315《Linux内核原理与分析》第二周作业

上周修正

“Linux还是要多用”,于是下载了虚拟机。

本周所学

《庖丁解牛Linux》第一章

8086CPU中总共有14个16位寄存器

  • 通用寄存器分为数据寄存器、指针寄存器、变址寄存器
    • 数据寄存器
      • AX:累加寄存器,也称为累加器
      • BX:基地址寄存器
      • CX:计数器寄存器
      • DX:数据寄存器
    • 指针寄存器
      • SP:堆栈指针寄存器
      • BP:基指针寄存器
    • 变址寄存器
      • SI:源变址寄存器
      • DI:目的变址寄存器
  • 控制寄存器分为指令指针寄存器IP、标志寄存器FLAG
  • 段寄存器又分为代码段寄存器CS、指数据段寄存器DS、堆栈段寄存器SS和附加段寄存器ES

pushl/popl和call/ret汇编指令

范例指令 对应的指令动作
pushl %eax subl $4, %esp movl %eax,(%esp)
popl %eax movl(%esp),%eax add $4,%esp
call 0x12345 pushl %eip() movl $0x12345,%eip()
ret popl %eip(*)

课后实验

将C语言代码汇编成“.s”文件,并分析“.s”文件中的汇编代码的执行过程

保存复制的代码到“实验楼”的虚拟机环境

在“实验楼”的虚拟机环境下粘贴代码

将粘贴的代码保存到main文件

编译main.c代码文件,查看程序返回值,再将其编译成以“.s”作为扩展名的汇编代码文件

查看main.s文件,查看代码执行过程

代码:


#进入文本编辑模式
$ vi main.c
#直接编译
$ gcc main.c
#查看程序返回值
$ echo $?
#把main.c编译成以“.s”作为扩展名的汇编代码文件
$ gcc -S -o main.s main.c -m32
#查看main.s文件
$ vi main.s

云班课视频《计算机是如何工作》

参考资料

//在64位环境下编译成32位的汇编
gcc -S -o ccode32.s ccode.c -m32
//链接时会缺少构建32 位可执行程序缺少的包,使用以下指令安装:
sudo apt-get install libc6-dev-i386
//编译链接成32位的可执行文件
gcc -o ccode32 ccode.c -m32

mov指令及几种内存寻址方式

b,w,l,q分别代表8位,16位,32位和64位

指令 相当于
movl %eax %edx edx=eax 寄存器寻址,以%开头的寄存器标识符
movl $0x123 %edx edx=0x123 立即寻址,立即数以$开头的数值
movl 0x123 %edx edx=(int32_t)0x123 直接寻址,直接访问一个指定的内存地址的数据
movl (%ebx) %edx edx=(int32_t)ebx 间接寻址,将寄存器的值作为一个内存地址来访问内存
movl 4(%ebx) %edx edx=(int32_t)(ebx+4) 变址寻址,在间接寻址之时改变寄存器的数值

其他

eip寄存器不能被直接修改,只能通过特殊指令间接修改

实验楼之实验一

跟课本作业差不多,不赘述了。

疑难困惑

Markdown插入表格语法

Markdown 代码:

左对齐标题 右对齐标题 居中对齐标题
短文本 中等文本 稍微长一点的文本
稍微长一点的文本 短文本 中等文本

语法说明
1)|、-、:之间的多余空格会被忽略,不影响布局。
2)默认标题栏居中对齐,内容居左对齐。
3)-:表示内容和标题栏居右对齐,:-表示内容和标题栏居左对齐,:-:表示内容和标题栏居中对齐。
4)内容和|之间的多余空格会被忽略,每行第一个|和最后一个|可以省略,-的数量至少有一个。
5)表格的语句上一行必须为空行,不然表格不生效。

文本编辑器的退出

在保存并退出文本编辑器时候,按照课本提示,按“shift”+“:”,输入“wq”保存退出无效,如下图所示:

后发现需要先按esc退出编辑状态。现将本次所了解的知识简单记录:

当文本编辑结束之后,通常需要退出编辑器。退出编辑器又分为4种情况:保存退出、正常退出、不保存退出及强制退出。
按键盘左上角的"ESC",此时,左下角的插入状态不见了。此时输入“冒号”,即":"(不需双引号),在下方会出现冒号,等待输入命令。

按下esc键和输入冒号(:)之后,输入的命令不同,代表不同的退出方式:

  1. 保存退出:WQ

W:write,写入
Q:quit,退出
保存退出还有二个方法:
A:在最后输入命令时,直接输入"x",也是一样的,即X=WQ。
B:最快捷的方法:按了ESC后,直接按shift+zz,或者切换到大写模式按ZZ,就可以保存退出了,即是按2下大写的Z。

  1. 正常退出:q

正常退出有个前提条件是:打开的文本文件在内容上没有被改动过。
如果在上次的基础上有改动,输入q报错如下:
只有在q后面加了感叹号!才能退出,因为有所改动!只能选不保存退出或强制退出

  1. 不保存退出:q!
  2. 强制退出!

此为本人Linux学习第二周的内容,如有不足,还请批评指正,不胜感激。

以上

猜你喜欢

转载自www.cnblogs.com/qianxiaoxu/p/11561647.html